구름떼 검색기 수정 중!!

This commit is contained in:
USER002
2024-06-10 18:22:06 +09:00
parent 0fdc3d37a4
commit dba228b6dd
5 changed files with 297 additions and 190 deletions

View File

@@ -17,5 +17,6 @@ namespace BitgetAPI.Data
public double high24h { get; set; }
public double low24h { get; set; }
public double open24h { get; set; }
}
}

View File

@@ -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;
}
}

View File

@@ -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<Thread> th_MarketStatusList = null;
// WebSocket 내 스레드 관리
List<Thread> webSocketThreadList = new List<Thread>();
// 종목별 캔들 데이터 스레드
// 종목별 캔들 데이터 스레드 (사용 안함)
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<Thread>();
var dic = new Dictionary<string, object>();
dic.Add("op", "subscribe");
var argsList = new List<Dictionary<string, object>>();
var count = 0;
foreach (var marketInfo in commonProperty.marketInfoList)
{
var args = new Dictionary<string, object>();
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<string, object>();
dic.Add("op", "subscribe");
argsList = new List<Dictionary<string, object>>();
}
}
// 현황판 웹소켓
commonProperty.webSocketCandles = new List<WebSocketTickerInfo>();
treeList_MarketInfo.DataSource = commonProperty.webSocketCandles;
// 트리 현황판 업데이트
treeListMarketInfoListUpdateTimer = new Thread(new ThreadStart(TreeListMarketInfoListUpdate));
treeListMarketInfoListUpdateTimer.Start();
// 신호 Long 상승 (구매)
signals_LU = new List<SignalInfoData>();
@@ -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<MarketInfo>)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<string, object> 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<object> 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<MarketInfo>)BitgetAPI.WebService.WebConnection.SendWebServer(exchangeWebReqType);
var marketInfos = commonProperty.marketInfoList = (List<MarketInfo>)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<Thread>();
var dic = new Dictionary<string, object>();
dic.Add("op", "subscribe");
var argsList = new List<Dictionary<string, object>>();
// Json String 만들기
// 종목별 Ticker 구독하기
// WebSocket으로 데이터 가져오기
foreach (var marketName in marketList)
{
var args = new Dictionary<string, object>();
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();
}
}
}

View File

@@ -118,6 +118,21 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="simpleButton1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALoBAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KPC9z
dHlsZT4NCiAgPHBhdGggZD0iTTguOSw0LjFDOC40LDMuOCw4LDQuMSw4LDQuN3YyMi42YzAsMC43LDAu
NCwwLjksMC45LDAuNWwxNi43LTExLjNjMC41LTAuMywwLjUtMC45LDAtMS4yTDguOSw0LjF6IiBjbGFz
cz0iQmx1ZSIgLz4NCjwvc3ZnPgs=
</value>
</data>
<data name="simpleButton_MarketOrderRefresh.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40

View File

@@ -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.캔들정보: