diff --git a/BitgetApi/Data/MarketInfo.cs b/BitgetApi/Data/MarketInfo.cs index 45d53ba..08e0df2 100644 --- a/BitgetApi/Data/MarketInfo.cs +++ b/BitgetApi/Data/MarketInfo.cs @@ -17,5 +17,6 @@ namespace BitgetAPI.Data public double high24h { get; set; } public double low24h { get; set; } + public double open24h { get; set; } } } diff --git a/BitgetApi/MainForm.Designer.cs b/BitgetApi/MainForm.Designer.cs index f8240fe..3ed1870 100644 --- a/BitgetApi/MainForm.Designer.cs +++ b/BitgetApi/MainForm.Designer.cs @@ -41,7 +41,7 @@ this.labelControl3 = new DevExpress.XtraEditors.LabelControl(); this.treeList_MarketInfo = new DevExpress.XtraTreeList.TreeList(); this.treeListColumn_ExchangePlace = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn_instId = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn_MarketName = new DevExpress.XtraTreeList.Columns.TreeListColumn(); this.treeListColumn_open24h = new DevExpress.XtraTreeList.Columns.TreeListColumn(); this.treeListColumn_low24h = new DevExpress.XtraTreeList.Columns.TreeListColumn(); this.treeListColumn_high24h = new DevExpress.XtraTreeList.Columns.TreeListColumn(); @@ -75,6 +75,14 @@ this.treeListColumn_SD_IndicatorRate = new DevExpress.XtraTreeList.Columns.TreeListColumn(); this.splitContainerControl_FavoritePurchase = new DevExpress.XtraEditors.SplitContainerControl(); this.groupControl_FP_LongDown = new DevExpress.XtraEditors.GroupControl(); + this.treeList1 = new DevExpress.XtraTreeList.TreeList(); + this.treeListColumn2 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn3 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn4 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn5 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn6 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn7 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.treeListColumn8 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); this.groupControl_FP_ShortUp = new DevExpress.XtraEditors.GroupControl(); this.groupControl_SearcherCondition = new DevExpress.XtraEditors.GroupControl(); this.simpleButton_MarketOrderRefresh = new DevExpress.XtraEditors.SimpleButton(); @@ -92,14 +100,7 @@ this.checkedComboBoxEdit_TimeInterval = new DevExpress.XtraEditors.CheckedComboBoxEdit(); this.checkedComboBoxEdit_MarketInfoList = new DevExpress.XtraEditors.CheckedComboBoxEdit(); this.treeListColumn1 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeList1 = new DevExpress.XtraTreeList.TreeList(); - this.treeListColumn2 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn3 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn4 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn5 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn6 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn7 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); - this.treeListColumn8 = new DevExpress.XtraTreeList.Columns.TreeListColumn(); + this.simpleButton_SignalStart = new DevExpress.XtraEditors.SimpleButton(); ((System.ComponentModel.ISupportInitialize)(this.groupControl_Setting)).BeginInit(); this.groupControl_Setting.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.progressBarControl_data.Properties)).BeginInit(); @@ -140,6 +141,7 @@ this.splitContainerControl_FavoritePurchase.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.groupControl_FP_LongDown)).BeginInit(); this.groupControl_FP_LongDown.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.treeList1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.groupControl_FP_ShortUp)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.groupControl_SearcherCondition)).BeginInit(); this.groupControl_SearcherCondition.SuspendLayout(); @@ -152,7 +154,6 @@ ((System.ComponentModel.ISupportInitialize)(this.timeSpanEdit_SesstionTime.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.checkedComboBoxEdit_TimeInterval.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.checkedComboBoxEdit_MarketInfoList.Properties)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.treeList1)).BeginInit(); this.SuspendLayout(); // // groupControl_Setting @@ -264,7 +265,7 @@ | System.Windows.Forms.AnchorStyles.Right))); this.treeList_MarketInfo.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] { this.treeListColumn_ExchangePlace, - this.treeListColumn_instId, + this.treeListColumn_MarketName, this.treeListColumn_open24h, this.treeListColumn_low24h, this.treeListColumn_high24h, @@ -283,13 +284,13 @@ this.treeListColumn_ExchangePlace.FieldName = "ExchangePlace"; this.treeListColumn_ExchangePlace.Name = "treeListColumn_ExchangePlace"; // - // treeListColumn_instId + // treeListColumn_MarketName // - this.treeListColumn_instId.Caption = "종목"; - this.treeListColumn_instId.FieldName = "instId"; - this.treeListColumn_instId.Name = "treeListColumn_instId"; - this.treeListColumn_instId.Visible = true; - this.treeListColumn_instId.VisibleIndex = 0; + this.treeListColumn_MarketName.Caption = "종목"; + this.treeListColumn_MarketName.FieldName = "MarketName"; + this.treeListColumn_MarketName.Name = "treeListColumn_MarketName"; + this.treeListColumn_MarketName.Visible = true; + this.treeListColumn_MarketName.VisibleIndex = 0; // // treeListColumn_open24h // @@ -389,7 +390,6 @@ this.xtraTabPage_Searcher.Controls.Add(this.groupControl_SignalSeacher); this.xtraTabPage_Searcher.Controls.Add(this.groupControl_SearcherCondition); this.xtraTabPage_Searcher.Name = "xtraTabPage_Searcher"; - this.xtraTabPage_Searcher.PageEnabled = false; this.xtraTabPage_Searcher.Size = new System.Drawing.Size(920, 408); this.xtraTabPage_Searcher.Text = "검색기"; // @@ -656,6 +656,88 @@ this.groupControl_FP_LongDown.TabIndex = 0; this.groupControl_FP_LongDown.Text = "관심 종목 (Long 상승)"; // + // treeList1 + // + this.treeList1.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] { + this.treeListColumn2, + this.treeListColumn3, + this.treeListColumn4, + this.treeListColumn5, + this.treeListColumn6, + this.treeListColumn7, + this.treeListColumn8}); + this.treeList1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeList1.Location = new System.Drawing.Point(2, 23); + this.treeList1.Name = "treeList1"; + this.treeList1.Size = new System.Drawing.Size(426, 105); + this.treeList1.TabIndex = 1; + // + // treeListColumn2 + // + this.treeListColumn2.Caption = "시작 시간"; + this.treeListColumn2.FieldName = "SignalStart"; + this.treeListColumn2.Format.FormatString = "yy/MM/dd hh:mm"; + this.treeListColumn2.Format.FormatType = DevExpress.Utils.FormatType.Custom; + this.treeListColumn2.Name = "treeListColumn2"; + this.treeListColumn2.Visible = true; + this.treeListColumn2.VisibleIndex = 2; + // + // treeListColumn3 + // + this.treeListColumn3.Caption = "종목"; + this.treeListColumn3.FieldName = "MarketName"; + this.treeListColumn3.Name = "treeListColumn3"; + this.treeListColumn3.Visible = true; + this.treeListColumn3.VisibleIndex = 1; + // + // treeListColumn4 + // + this.treeListColumn4.Caption = "설명"; + this.treeListColumn4.FieldName = "Description"; + this.treeListColumn4.Name = "treeListColumn4"; + this.treeListColumn4.Visible = true; + this.treeListColumn4.VisibleIndex = 0; + // + // treeListColumn5 + // + this.treeListColumn5.Caption = "현재가"; + this.treeListColumn5.FieldName = "Price"; + this.treeListColumn5.Format.FormatString = "0.00"; + this.treeListColumn5.Format.FormatType = DevExpress.Utils.FormatType.Custom; + this.treeListColumn5.Name = "treeListColumn5"; + this.treeListColumn5.Visible = true; + this.treeListColumn5.VisibleIndex = 3; + // + // treeListColumn6 + // + this.treeListColumn6.Caption = "수익률"; + this.treeListColumn6.FieldName = "Rate"; + this.treeListColumn6.Format.FormatString = "0.00000"; + this.treeListColumn6.Format.FormatType = DevExpress.Utils.FormatType.Custom; + this.treeListColumn6.Name = "treeListColumn6"; + this.treeListColumn6.Visible = true; + this.treeListColumn6.VisibleIndex = 4; + // + // treeListColumn7 + // + this.treeListColumn7.Caption = "지표(구름떼) 가격"; + this.treeListColumn7.FieldName = "IndicatorPrice"; + this.treeListColumn7.Format.FormatString = "0.00"; + this.treeListColumn7.Format.FormatType = DevExpress.Utils.FormatType.Custom; + this.treeListColumn7.Name = "treeListColumn7"; + this.treeListColumn7.Visible = true; + this.treeListColumn7.VisibleIndex = 5; + // + // treeListColumn8 + // + this.treeListColumn8.Caption = "지표가(매수가) 비율"; + this.treeListColumn8.FieldName = "IndicatorRate"; + this.treeListColumn8.Format.FormatString = "0.00000"; + this.treeListColumn8.Format.FormatType = DevExpress.Utils.FormatType.Custom; + this.treeListColumn8.Name = "treeListColumn8"; + this.treeListColumn8.Visible = true; + this.treeListColumn8.VisibleIndex = 6; + // // groupControl_FP_ShortUp // this.groupControl_FP_ShortUp.Dock = System.Windows.Forms.DockStyle.Fill; @@ -667,6 +749,7 @@ // // groupControl_SearcherCondition // + this.groupControl_SearcherCondition.Controls.Add(this.simpleButton_SignalStart); this.groupControl_SearcherCondition.Controls.Add(this.simpleButton_MarketOrderRefresh); this.groupControl_SearcherCondition.Controls.Add(this.groupBox2); this.groupControl_SearcherCondition.Controls.Add(this.groupBox1); @@ -693,6 +776,7 @@ this.simpleButton_MarketOrderRefresh.Size = new System.Drawing.Size(35, 30); this.simpleButton_MarketOrderRefresh.TabIndex = 7; this.simpleButton_MarketOrderRefresh.Text = "R"; + this.simpleButton_MarketOrderRefresh.Click += new System.EventHandler(this.simpleButton_MarketOrderRefresh_Click); // // groupBox2 // @@ -831,87 +915,16 @@ this.treeListColumn1.Visible = true; this.treeListColumn1.VisibleIndex = 0; // - // treeList1 + // simpleButton_SignalStart // - this.treeList1.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] { - this.treeListColumn2, - this.treeListColumn3, - this.treeListColumn4, - this.treeListColumn5, - this.treeListColumn6, - this.treeListColumn7, - this.treeListColumn8}); - this.treeList1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeList1.Location = new System.Drawing.Point(2, 23); - this.treeList1.Name = "treeList1"; - this.treeList1.Size = new System.Drawing.Size(426, 105); - this.treeList1.TabIndex = 1; - // - // treeListColumn2 - // - this.treeListColumn2.Caption = "시작 시간"; - this.treeListColumn2.FieldName = "SignalStart"; - this.treeListColumn2.Format.FormatString = "yy/MM/dd hh:mm"; - this.treeListColumn2.Format.FormatType = DevExpress.Utils.FormatType.Custom; - this.treeListColumn2.Name = "treeListColumn2"; - this.treeListColumn2.Visible = true; - this.treeListColumn2.VisibleIndex = 2; - // - // treeListColumn3 - // - this.treeListColumn3.Caption = "종목"; - this.treeListColumn3.FieldName = "MarketName"; - this.treeListColumn3.Name = "treeListColumn3"; - this.treeListColumn3.Visible = true; - this.treeListColumn3.VisibleIndex = 1; - // - // treeListColumn4 - // - this.treeListColumn4.Caption = "설명"; - this.treeListColumn4.FieldName = "Description"; - this.treeListColumn4.Name = "treeListColumn4"; - this.treeListColumn4.Visible = true; - this.treeListColumn4.VisibleIndex = 0; - // - // treeListColumn5 - // - this.treeListColumn5.Caption = "현재가"; - this.treeListColumn5.FieldName = "Price"; - this.treeListColumn5.Format.FormatString = "0.00"; - this.treeListColumn5.Format.FormatType = DevExpress.Utils.FormatType.Custom; - this.treeListColumn5.Name = "treeListColumn5"; - this.treeListColumn5.Visible = true; - this.treeListColumn5.VisibleIndex = 3; - // - // treeListColumn6 - // - this.treeListColumn6.Caption = "수익률"; - this.treeListColumn6.FieldName = "Rate"; - this.treeListColumn6.Format.FormatString = "0.00000"; - this.treeListColumn6.Format.FormatType = DevExpress.Utils.FormatType.Custom; - this.treeListColumn6.Name = "treeListColumn6"; - this.treeListColumn6.Visible = true; - this.treeListColumn6.VisibleIndex = 4; - // - // treeListColumn7 - // - this.treeListColumn7.Caption = "지표(구름떼) 가격"; - this.treeListColumn7.FieldName = "IndicatorPrice"; - this.treeListColumn7.Format.FormatString = "0.00"; - this.treeListColumn7.Format.FormatType = DevExpress.Utils.FormatType.Custom; - this.treeListColumn7.Name = "treeListColumn7"; - this.treeListColumn7.Visible = true; - this.treeListColumn7.VisibleIndex = 5; - // - // treeListColumn8 - // - this.treeListColumn8.Caption = "지표가(매수가) 비율"; - this.treeListColumn8.FieldName = "IndicatorRate"; - this.treeListColumn8.Format.FormatString = "0.00000"; - this.treeListColumn8.Format.FormatType = DevExpress.Utils.FormatType.Custom; - this.treeListColumn8.Name = "treeListColumn8"; - this.treeListColumn8.Visible = true; - this.treeListColumn8.VisibleIndex = 6; + this.simpleButton_SignalStart.ImageOptions.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("simpleButton1.ImageOptions.SvgImage"))); + this.simpleButton_SignalStart.ImageOptions.SvgImageColorizationMode = DevExpress.Utils.SvgImageColorizationMode.Full; + this.simpleButton_SignalStart.Location = new System.Drawing.Point(575, 37); + this.simpleButton_SignalStart.Name = "simpleButton_SignalStart"; + this.simpleButton_SignalStart.Size = new System.Drawing.Size(35, 30); + this.simpleButton_SignalStart.TabIndex = 8; + this.simpleButton_SignalStart.Text = "R"; + this.simpleButton_SignalStart.Click += new System.EventHandler(this.simpleButton_SignalStart_Click); // // MainForm // @@ -966,6 +979,7 @@ this.splitContainerControl_FavoritePurchase.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.groupControl_FP_LongDown)).EndInit(); this.groupControl_FP_LongDown.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.treeList1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.groupControl_FP_ShortUp)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.groupControl_SearcherCondition)).EndInit(); this.groupControl_SearcherCondition.ResumeLayout(false); @@ -979,7 +993,6 @@ ((System.ComponentModel.ISupportInitialize)(this.timeSpanEdit_SesstionTime.Properties)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.checkedComboBoxEdit_TimeInterval.Properties)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.checkedComboBoxEdit_MarketInfoList.Properties)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.treeList1)).EndInit(); this.ResumeLayout(false); } @@ -994,7 +1007,7 @@ private DevExpress.XtraEditors.LabelControl labelControl2; private DevExpress.XtraEditors.LabelControl labelControl1; private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn_ExchangePlace; - private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn_instId; + private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn_MarketName; private DevExpress.XtraEditors.LabelControl labelControl_MarketCount; private DevExpress.XtraEditors.LabelControl labelControl3; private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn_open24h; @@ -1057,6 +1070,7 @@ private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn6; private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn7; private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn8; + private DevExpress.XtraEditors.SimpleButton simpleButton_SignalStart; } } diff --git a/BitgetApi/MainForm.cs b/BitgetApi/MainForm.cs index 8ffe552..912af57 100644 --- a/BitgetApi/MainForm.cs +++ b/BitgetApi/MainForm.cs @@ -21,6 +21,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using static BitgetAPI.CommonProperty; using static DevExpress.Utils.Html.ViewInfo.DxHtmlOrderedListInfoCore; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox; namespace BitgetAPI @@ -30,16 +31,18 @@ namespace BitgetAPI CommonProperty commonProperty = CommonProperty.Instance; #region 폼 내 사용되는 스레드 - // 트리 현황판 업데이트 스레드 + // 트리 현황판 업데이트 스레드 (단순 폼 업데이트) Thread treeListMarketInfoListUpdateTimer = null; - // 현황판 웹소켓 스레드 + // 웹소켓 스레드 (선택된 종목 개수 만큼 가져오기) List th_MarketStatusList = null; // WebSocket 내 스레드 관리 List webSocketThreadList = new List(); - // 종목별 캔들 데이터 스레드 + // 종목별 캔들 데이터 스레드 (사용 안함) Thread th_MarketCandeData = null; - // 신호검색 스레드 함수 + // 신호검색 스레드 함수 Thread th_SignalInfo = null; + // 현황판 웹서비스 Ticker 스레드 (한번에 전체 종목 종가 받음) + Thread th_MarketInfoList = null; // 신호검색 리스트 작성 // 신호 Long 상승 (구매) @@ -77,50 +80,7 @@ namespace BitgetAPI treeList_MarketInfo.Columns["quoteVolume"].SortOrder = SortOrder.Descending; treeList_MarketInfo.EndSort(); - // Json String 만들기 - // 종목별 Ticker 구독하기 - th_MarketStatusList = new List(); - var dic = new Dictionary(); - dic.Add("op", "subscribe"); - - var argsList = new List>(); - - var count = 0; - - foreach (var marketInfo in commonProperty.marketInfoList) - { - var args = new Dictionary(); - args.Add("instType", "USDT-FUTURES"); - args.Add("channel", "ticker"); - args.Add("instId", marketInfo.MarketName); - argsList.Add(args); - - count++; - - if (count % 30 == 0 || count == commonProperty.marketInfoList.Count - 1) - { - dic.Add("args", argsList); - - var th_MarketStatus = new Thread(() => ThreadEventAsync(BitgetWebSocketType.현황정보_전체종목, dic)); - th_MarketStatus.Start(); - - th_MarketStatusList.Add(th_MarketStatus); - //break; - - dic = new Dictionary(); - dic.Add("op", "subscribe"); - argsList = new List>(); - } - } - - - // 현황판 웹소켓 commonProperty.webSocketCandles = new List(); - treeList_MarketInfo.DataSource = commonProperty.webSocketCandles; - - // 트리 현황판 업데이트 - treeListMarketInfoListUpdateTimer = new Thread(new ThreadStart(TreeListMarketInfoListUpdate)); - treeListMarketInfoListUpdateTimer.Start(); // 신호 Long 상승 (구매) signals_LU = new List(); @@ -135,14 +95,30 @@ namespace BitgetAPI treeList_LongUp.DataSource = signals_LU; treeList_ShortDown.DataSource = signals_SD; - // 신호검색 스레드 - //th_SignalInfo = new Thread(new ThreadStart(Signalnfo)); - //th_SignalInfo.Start(); - // API Key 가져오기 및 등록 } + // 웹서비스를 통해 현황판 및 마켓 Ticker 업데이트 + private void getMarketInfoList_WebService(ExchangeWebReqType exchangeWebReqType) + { + while(true) + { + Thread.Sleep(500); + // 마켓 모든 종목 캔들 정보 Web Service로 가져오기 + commonProperty.marketInfoList = (List)BitgetAPI.WebService.WebConnection.SendWebServer(exchangeWebReqType); + + // 현황판에 최신 정보 업데이트 하기 + Invoke(new MethodInvoker(delegate () + { + var scrollPoint = treeList_MarketInfo.TopVisibleNodeIndex; + treeList_MarketInfo.DataSource = commonProperty.marketInfoList; + treeList_MarketInfo.RefreshDataSource(); + treeList_MarketInfo.TopVisibleNodeIndex = scrollPoint; + })); + } + } + // 웹소켓 생성 관련 함수 스레드 => Thread private async void ThreadEventAsync(BitgetWebSocketType bitgetWebSocketType, Dictionary dic) { @@ -200,11 +176,14 @@ namespace BitgetAPI 선행스팬2 : (과거 k일간의 최고가 + 과거 k일간의 최저가) /2한 값을 ℓ일 후에 기입 */ + var checkedMarkets = checkedComboBoxEdit_MarketInfoList.Properties.Items.GetCheckedValues(); + var intervalList = checkedComboBoxEdit_TimeInterval.Properties.Items.GetCheckedValues(); + while (true) { //if (!xtraTabPage_Searcher.PageEnabled) continue; - Thread.Sleep(200); + //Thread.Sleep(200); var nowTime = DateTime.Now; // 특정 시간 이후 삭제 @@ -229,17 +208,36 @@ namespace BitgetAPI } } - foreach (var item in signals_LD.ToList()) - if (item.SignalStart + timeSpanEdit_SesstionTime.TimeSpan < nowTime) { signals_LD.Remove(item); } - foreach (var item in signals_SU.ToList()) - if (item.SignalStart + timeSpanEdit_SesstionTime.TimeSpan < nowTime) signals_SU.Remove(item); foreach (var item in signals_SD.ToList()) + { + // 시간 지나면 삭제 + if (item.SignalStart + timeSpanEdit_SesstionTime.TimeSpan < nowTime) + { + signals_SD.Remove(item); + continue; + + } + var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName); + var lastCandleData = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList().Last(); + + if (lastCandleData.IchimokData != null) + { + item.Price = lastCandleData.Close; + if (lastCandleData.Open == 0) { } + item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100; + item.IndicatorPrice = lastCandleData.IchimokData.하한선; + item.IndicatorRate = (lastCandleData.Close / item.IndicatorPrice) * 100 - 100; + } + } + foreach (var item in signals_LD.ToList()) + if (item.SignalStart + timeSpanEdit_SesstionTime.TimeSpan < nowTime) signals_SU.Remove(item); + foreach (var item in signals_SU.ToList()) if (item.SignalStart + timeSpanEdit_SesstionTime.TimeSpan < nowTime) signals_SD.Remove(item); - var intervalList = checkedComboBoxEdit_TimeInterval.Properties.Items.GetCheckedValues(); + // 체크된 마켓 정보 - foreach (string market in checkedComboBoxEdit_MarketInfoList.Properties.Items.GetCheckedValues()) + foreach (string market in checkedMarkets) { var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == market); @@ -314,6 +312,7 @@ namespace BitgetAPI signalInfoData.Price = price; signalInfoData.IndicatorPrice = indicatorPrice; signalInfoData.IndicatorRate = indicatorRate; + signalInfoData.MCandleTimeType = interval; signals_SD.Add(signalInfoData); } @@ -327,18 +326,24 @@ namespace BitgetAPI // 종목별 캔들데이터 가져오기 (초기 설정) => Thread - private void getMarketCandleData_WebService(ExchangeWebReqType exchangeWebReqType) + private void getMarketCandleData_WebService(ExchangeWebReqType exchangeWebReqType, List marketList) { // 프로그레스 바 - progressBarControl_data.Properties.Minimum = 0; - progressBarControl_data.Properties.Maximum = commonProperty.candleDataLists.Count; - progressBarControl_data.Properties.Step = 1; - progressBarControl_data.EditValue = 0; - var progressCnt = 0; - // WebServicee 초기 캔들 데이터 가져오기 : 종목, 개수 - foreach (var marketCandleDataList in commonProperty.candleDataLists) + Invoke(new MethodInvoker(delegate () { - var marketName = marketCandleDataList.ConGoodsData.MarketName; + progressBarControl_data.Properties.Minimum = 0; + progressBarControl_data.Properties.Maximum = marketList.Count; + progressBarControl_data.Properties.Step = 1; + progressBarControl_data.EditValue = 0; + })); + + var progressCnt = 0; + + // WebServicee 초기 캔들 데이터 가져오기 : 종목, 개수 + foreach (var marketName in marketList) + { + var marketCandleDataList = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName.Equals(marketName)); + if (marketCandleDataList == null) continue; // 캔들 데이터 가져오기 foreach (var interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType))) @@ -392,17 +397,13 @@ namespace BitgetAPI progressBarControl_data.EditValue = progressCnt; progressBarControl_data.PerformStep(); progressBarControl_data.Update(); - - //xtraTabPage_Searcher.PageEnabled = true; - //xtraTabControl_Main.SelectedTabPage = xtraTabPage_Searcher; })); } - Invoke(new MethodInvoker(delegate () - { - xtraTabPage_Searcher.PageEnabled = true; - xtraTabControl_Main.SelectedTabPage = xtraTabPage_Searcher; - })); + // 웹서비스 호출 완료 되면 시작 + // 신호검색 스레드 + th_SignalInfo = new Thread(new ThreadStart(Signalnfo)); + th_SignalInfo.Start(); } // 거래소 콤보박스 클릭 시 이벤트 처리 @@ -420,7 +421,6 @@ namespace BitgetAPI commonProperty.selectedBitgetProductType = CommonProperty.BitgetProductType.FUTURE; break; } - } // 코인 타입 콤보박스 클릭 시 이벤트 처리 @@ -446,7 +446,8 @@ namespace BitgetAPI } // 마켓 정보 가져오기 - var marketInfos = (List)BitgetAPI.WebService.WebConnection.SendWebServer(exchangeWebReqType); + var marketInfos = commonProperty.marketInfoList = (List)BitgetAPI.WebService.WebConnection.SendWebServer(exchangeWebReqType); + commonProperty.marketInfoList = marketInfos; labelControl_MarketCount.Text = marketInfos.Count().ToString(); treeList_MarketInfo.DataSource = marketInfos; @@ -469,8 +470,8 @@ namespace BitgetAPI } // 조건 설정 : 체크콤보박스 마켓 정보 추가하기 - foreach (var item in commonProperty.candleDataLists) - checkedComboBoxEdit_MarketInfoList.Properties.Items.Add(item.ConGoodsData.MarketName); + foreach (var item in marketInfos.OrderByDescending(i => i.quoteVolume)) + checkedComboBoxEdit_MarketInfoList.Properties.Items.Add(item.MarketName); // 조건 설정 : 체크콤보박스 시간별 정보 추가하기 // 캔들 데이터 가져오기 foreach (var interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType))) @@ -479,6 +480,10 @@ namespace BitgetAPI checkedComboBoxEdit_TimeInterval.Properties.Items.Add(description); } + // 마켓정보(WebService Ticker) => 0.5초당 1번으로 업데이트 하기 (현황판) + th_MarketInfoList = new Thread(() => getMarketInfoList_WebService(exchangeWebReqType)); + th_MarketInfoList.Start(); + #region 캔들 웹소켓 : 종목 50, 캔들 1 개만 해도 뒤지려고 함 !! (일딴 패스) /* // 시간별 분봉 웹소켓 @@ -490,11 +495,6 @@ namespace BitgetAPI break; }*/ #endregion - - // WebServicee 초기 캔들 데이터 가져오기 : 종목, 개수 - // 종목별 캔들 데이터 가져오기 (WebService) - //th_MarketCandeData = new Thread(() => getMarketCandleData_WebService(exchangeWebReqType)); - //th_MarketCandeData.Start(); } // 폼 닫기 시 처리 이벤트 @@ -512,6 +512,12 @@ namespace BitgetAPI } } + if (th_MarketInfoList != null) + { + th_MarketInfoList.Abort(); + th_MarketInfoList = null; + } + if (treeListMarketInfoListUpdateTimer != null) { treeListMarketInfoListUpdateTimer.Abort(); @@ -540,5 +546,73 @@ namespace BitgetAPI } } + + // 검색기 > 종목 재 정렬 + private void simpleButton_MarketOrderRefresh_Click(object sender, EventArgs e) + { + checkedComboBoxEdit_MarketInfoList.Properties.Items.Clear(); + + // 조건 설정 : 체크콤보박스 마켓 정보 추가하기 + foreach (var item in commonProperty.marketInfoList.OrderByDescending(i=>i.quoteVolume)) + checkedComboBoxEdit_MarketInfoList.Properties.Items.Add(item.MarketName); + + } + + // 신호 검색 시작 + private void simpleButton_SignalStart_Click(object sender, EventArgs e) + { + var count = 0; + + var marketList = checkedComboBoxEdit_MarketInfoList.Properties.Items.GetCheckedValues(); + if (marketList.Count <=0 ) return; + + if (marketList.Count > 50) + { + for(var i = 50; i < marketList.Count; i++) + { + checkedComboBoxEdit_MarketInfoList.Properties.Items[i].CheckState = CheckState.Unchecked; + } + + marketList = checkedComboBoxEdit_MarketInfoList.Properties.Items.GetCheckedValues(); + } + + th_MarketStatusList = new List(); + var dic = new Dictionary(); + dic.Add("op", "subscribe"); + + var argsList = new List>(); + + // Json String 만들기 + // 종목별 Ticker 구독하기 + // WebSocket으로 데이터 가져오기 + foreach (var marketName in marketList) + { + var args = new Dictionary(); + args.Add("instType", "USDT-FUTURES"); + args.Add("channel", "ticker"); + args.Add("instId", marketName); + argsList.Add(args); + + count++; + } + + dic.Add("args", argsList); + + // 웹소켓으로 캔들 쌓기 + var th_MarketStatus = new Thread(() => ThreadEventAsync(BitgetWebSocketType.현황정보_전체종목, dic)); + th_MarketStatus.Start(); + th_MarketStatusList.Add(th_MarketStatus); + + // WebServicee 초기 캔들 데이터 가져오기 : 종목, 개수 + // 종목별 캔들 데이터 가져오기 (WebService) + // 선택된 타입에 따라서 종목 정보 가져오기 + var exchangeWebReqType = ExchangeWebReqType.BitgetMarket_Future; + th_MarketCandeData = new Thread(() => getMarketCandleData_WebService(exchangeWebReqType, marketList)); + th_MarketCandeData.Start(); + + // 트리 현황판 업데이트 + treeListMarketInfoListUpdateTimer = new Thread(new ThreadStart(TreeListMarketInfoListUpdate)); + treeListMarketInfoListUpdateTimer.Start(); + } } } diff --git a/BitgetApi/MainForm.resx b/BitgetApi/MainForm.resx index fcbc9db..329ebd9 100644 --- a/BitgetApi/MainForm.resx +++ b/BitgetApi/MainForm.resx @@ -118,6 +118,21 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALoBAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KPC9z + dHlsZT4NCiAgPHBhdGggZD0iTTguOSw0LjFDOC40LDMuOCw4LDQuMSw4LDQuN3YyMi42YzAsMC43LDAu + NCwwLjksMC45LDAuNWwxNi43LTExLjNjMC41LTAuMywwLjUtMC45LDAtMS4yTDguOSw0LjF6IiBjbGFz + cz0iQmx1ZSIgLz4NCjwvc3ZnPgs= + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40 diff --git a/BitgetApi/WebService/WebConnection.cs b/BitgetApi/WebService/WebConnection.cs index 814e87e..3d38e3f 100644 --- a/BitgetApi/WebService/WebConnection.cs +++ b/BitgetApi/WebService/WebConnection.cs @@ -123,6 +123,7 @@ namespace BitgetAPI.WebService marketInfo.quoteVolume = Convert.ToDouble(item["quoteVolume"]); marketInfo.high24h = Convert.ToDouble(item["high24h"]); marketInfo.low24h = Convert.ToDouble(item["low24h"]); + marketInfo.open24h = Convert.ToDouble(item["open24h"]); commonProperty.marketInfoList.Add(marketInfo); } @@ -146,6 +147,7 @@ namespace BitgetAPI.WebService foreach(var item in datas) { CandleData candleData = new CandleData(); + candleData.Argument = Convertor.GetUnixtimeStampToDateTime(long.Parse(item[0].ToString())); candleData.Open = Convert.ToDouble(item[1]); candleData.High = Convert.ToDouble(item[2]); @@ -281,8 +283,6 @@ namespace BitgetAPI.WebService DateTime dt = new DateTime(1970, 01, 01); tickerList.reciveTime = dt.AddMilliseconds(Convert.ToDouble(tickerList.ts)).ToLocalTime(); - var test = 0; - /* // 웹소켓 티커 리스트에 추가 var searchIndex = commonProperty.webSocketCandles.IndexOf(i => i.instId == tickerList.instId); if (searchIndex < 0) @@ -305,6 +305,8 @@ namespace BitgetAPI.WebService candleData.Argument = tickerList.reciveTime; candleData.Close = tickerList.lastPr; + if (interval == MCandleTimeType.H1) { } + // 캔들 리스트가 없으면 추가 if (candleDataList.Count == 0) candleDataList.Add(candleData); @@ -377,14 +379,15 @@ namespace BitgetAPI.WebService // 없는 경우 추가 else { - // 새 데이터 등록 - candleDataList.Add(candleData); - + if (candleData.Open == 0) { } // 1분 이상 Ticker가 없는 겨우는 Open 가만 가격이 등록됨 candleData.Open = candleData.Close; candleData.WebSocketUpdate = true; + // 새 데이터 등록 + candleDataList.Add(candleData); + // 기존 데이터 삭제 if (candleDataList.Count > 250) { @@ -395,7 +398,7 @@ namespace BitgetAPI.WebService } } - */ + } break; case CommonProperty.BitgetWebSocketType.캔들정보: