using BitgetAPI.Data; using BitgetAPI.WebService; using DevExpress.XtraEditors; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.WebSockets; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static BitgetAPI.CommonProperty; namespace BitgetAPI { public partial class MainForm : Form { CommonProperty commonProperty = CommonProperty.Instance; public MainForm() { InitializeComponent(); init(); } // 폼 초기화 작업 public void init() { commonProperty.mainform = this; // 거래소 항목 추가 및 설정하기 comboBoxEdit_ExchangePlace.Properties.Items.AddRange(Enum.GetNames(typeof(CommonProperty.ExchangePlace))); comboBoxEdit_ExchangePlace.SelectedIndex = (int)CommonProperty.ExchangePlace.Bitget; commonProperty.selectedChangePlace = CommonProperty.ExchangePlace.Bitget; treeList_MarketInfo.DataSource = commonProperty.webSocketCandles; // API Key 가져오기 및 등록 // BITGET Raster 소켓 테스트 // 데이터 분석 // 캔들 가져오기 // 구름떼, 볼린저 생성 // 마켓정보 가져오기 (25초), Ping 유지용 // 트리 현황판 업데이트 var marketInfoListUpdateTimer = new Thread(new ThreadStart(MarketInfoListUpdate)); marketInfoListUpdateTimer.Start(); // 트리 현황판 업데이트 var treeListMarketInfoListUpdateTimer = new Thread(new ThreadStart(TreeListMarketInfoListUpdate)); treeListMarketInfoListUpdateTimer.Start(); } // 마켓정보 가져오기 !! private void MarketInfoListUpdate() { Thread.Sleep(25000); // 마켓 정보 가져오기 var marketInfos = (List)BitgetAPI.WebService.WebConnection.SendWebServer(ExchangeWebReqType.BitgetMarket_Future); } private void TreeListMarketInfoListUpdate() { while(true) { Thread.Sleep(2000); Invoke(new MethodInvoker(delegate () { treeList_MarketInfo.RefreshDataSource(); treeList_MarketInfo.ClearSelection(); })); } } // 거래소 콤보박스 클릭 시 이벤트 처리 private void comboBox_ExchangePlace_SelectedIndexChanged(object sender, EventArgs e) { var combobox = (ComboBoxEdit)sender; // 거래소에 따라서 코인 타입 생성하기 switch (combobox.SelectedIndex) { case (int)CommonProperty.ExchangePlace.Bitget: // 코인 타입 설정하기 comboBoxEdit_ConinType.Properties.Items.AddRange(Enum.GetNames(typeof(CommonProperty.BitgetProductType))); comboBoxEdit_ConinType.SelectedIndex = (int)CommonProperty.BitgetProductType.FUTURE; commonProperty.selectedBitgetProductType = CommonProperty.BitgetProductType.FUTURE; break; } } // 코인 타입 콤보박스 클릭 시 이벤트 처리 private void comboBox_CoinType_SelectedIndexChanged(object sender, EventArgs e) { var combobox = (ComboBoxEdit)sender; // 선택된 타입에 따라서 종목 정보 가져오기 ExchangeWebReqType exchangeWebReqType = ExchangeWebReqType.BitgetMarket_Future; switch (combobox.SelectedIndex) { case (int)CommonProperty.BitgetProductType.COIN: commonProperty.selectedBitgetProductType = CommonProperty.BitgetProductType.COIN; exchangeWebReqType = ExchangeWebReqType.BitgetMarket_Spot; break; case (int)CommonProperty.BitgetProductType.FUTURE: commonProperty.selectedBitgetProductType = CommonProperty.BitgetProductType.FUTURE; exchangeWebReqType = ExchangeWebReqType.BitgetMarket_Future; break; case (int)CommonProperty.BitgetProductType.MARGIN_보류: commonProperty.selectedBitgetProductType = CommonProperty.BitgetProductType.MARGIN_보류; break; } // 마켓 정보 가져오기 var marketInfos = (List)BitgetAPI.WebService.WebConnection.SendWebServer(exchangeWebReqType); labelControl_MarketCount.Text = marketInfos.Count().ToString(); treeList_MarketInfo.DataSource = marketInfos; treeList_MarketInfo.RefreshDataSource(); List candleDataLists = new List(); commonProperty.candleDataLists = candleDataLists; var candleCount = 200; // 캔들 리스트 생성하기 foreach (var item in marketInfos) { MarketCandleDataList candleDataList = new MarketCandleDataList(); candleDataList.ConGoodsData = item; foreach (var interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType))) { candleDataList.candleDataList.Add((MCandleTimeType)interval, new List()); } candleDataLists.Add(candleDataList); } commonProperty.webSocketCandles = new List(); var thread = new Thread(new ThreadStart(ThreadEventAsync)); thread.Start(); // 캔들 데이터 가져오기 : 종목, 개수, foreach (var item in marketInfos) { MarketCandleDataList candleDataList = new MarketCandleDataList(); candleDataList.ConGoodsData = item; // 캔들 데이터 가져오기 foreach(var interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType))) { // Description var description = Utils.Convertor.GetEnumDescription((Enum)interval); // 1M, 3M Names.... var intervalName = Enum.GetName(typeof(CommonProperty.MCandleTimeType), interval); var url = ""; switch(commonProperty.selectedChangePlace) { case ExchangePlace.Upbit: break; case ExchangePlace.Bitget: switch(commonProperty.selectedBitgetProductType) { case BitgetProductType.COIN: exchangeWebReqType = ExchangeWebReqType.BitgetCandleStick_Coin; var defaultDateTime = DateTime.Now; var startDateTime = DateTime.FromFileTimeUtc(defaultDateTime.Ticks); // count + 50 개 캔들 추가 가져오기 var endDateTime = DateTime.FromFileTimeUtc(defaultDateTime.AddSeconds((int)interval * -1).Ticks); // 종목, 인터벌시간, 시작시간(UTC), 종료시간(UTC), 제한 개수 (default:100, Max:1000) url = string.Format(BitgetURL_MarketCandle_Coin, item.MarketName, description, startDateTime.ToString(), endDateTime.ToString(), candleCount.ToString()); break; case BitgetProductType.FUTURE: exchangeWebReqType = ExchangeWebReqType.BitgetCandleStick_Future; url = string.Format(CommonProperty.BitgetURL_MarketCandle_Future, item.MarketName, description, candleCount.ToString(), "USDT-FUTURES"); break; } break; } List candleList = null; //var candleList = BitgetAPI.WebService.WebConnection.SendWebServer(exchangeWebReqType, url); // 초당 20회 제한 !!!! // Thread.Sleep(50); //candleDataList.candleDataList.Add((MCandleTimeType)interval,(List)candleList); } } var test = ""; test += "1"; } private async void ThreadEventAsync() { // WebSocket 생성 commonProperty.webConnection = new WebConnection(); commonProperty.webConnection.webSocektStart(); } } }