데이터 세트 구성 및 조합
1. 웹소켓 실시간 캔들 2. WebService 캔들
This commit is contained in:
@@ -15,12 +15,15 @@ using System.Threading.Tasks;
|
||||
using BitgetApi.Data;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using DevExpress.Utils.Extensions;
|
||||
using static BitgetAPI.CommonProperty;
|
||||
|
||||
namespace BitgetAPI.WebService
|
||||
{
|
||||
public class WebConnection
|
||||
{
|
||||
public static object SendWebServer(CommonProperty.ExchangeWebReqType exchangeWebReqType, string url = "", string postData = "", string subUri = "")
|
||||
public static object SendWebServer(CommonProperty.ExchangeWebReqType exchangeWebReqType, string url = "",
|
||||
MarketCandleDataList marketCandleDataList = null, CommonProperty.MCandleTimeType interval = MCandleTimeType.M1,
|
||||
string postData = "", string subUri = "")
|
||||
{
|
||||
object returnJsonData = null;
|
||||
|
||||
@@ -39,7 +42,6 @@ namespace BitgetAPI.WebService
|
||||
// 1. WebRequest 객체 형성 및 HttpWebRequest 로 형변환
|
||||
// 2. 거래소에 따른 헤더 파일 처리(POST 일 경우만 지정함)
|
||||
|
||||
|
||||
if(string.IsNullOrEmpty(url))
|
||||
{
|
||||
switch (exchangeWebReqType)
|
||||
@@ -129,7 +131,9 @@ namespace BitgetAPI.WebService
|
||||
var datalist = JsonConvert.DeserializeObject<Dictionary<string, object>>(resResult);
|
||||
var datas = JsonConvert.DeserializeObject<List<List<object>>>(datalist["data"]?.ToString());
|
||||
|
||||
List<CandleData> candleDatas = new List<CandleData>();
|
||||
if (marketCandleDataList == null) return null;
|
||||
|
||||
var candleDataList = marketCandleDataList.candleDataList[interval];
|
||||
|
||||
foreach(var item in datas)
|
||||
{
|
||||
@@ -142,7 +146,19 @@ namespace BitgetAPI.WebService
|
||||
candleData.Vol_C = Convert.ToDouble(item[5]);
|
||||
candleData.Vol_USD = Convert.ToDouble(item[6]);
|
||||
|
||||
candleDatas.Add(candleData);
|
||||
// 같은 시간이 존재하면 업데이트 : 1개밖에 없음
|
||||
var sameCandleData = candleDataList.Find(i => i.Argument.Minute == candleData.Argument.Minute &&
|
||||
i.Argument.Hour == candleData.Argument.Hour);
|
||||
|
||||
if (sameCandleData != null)
|
||||
{
|
||||
// 종가 => 웹소켓 데이터 사용 (웹 서비스 호출 데이터 중 마지막 데이터는 캔들이 완성되지 않음)
|
||||
// 시가 => 웹 서비스 데이터 사용
|
||||
sameCandleData.Open = candleData.Open;
|
||||
// 저가, 고가 => 비교해서 사용
|
||||
sameCandleData.Low = Math.Min(sameCandleData.Low, candleData.Low);
|
||||
sameCandleData.High = Math.Max(sameCandleData.High, candleData.High);
|
||||
}
|
||||
}
|
||||
|
||||
return candleDatas;
|
||||
@@ -195,9 +211,9 @@ namespace BitgetAPI.WebService
|
||||
string WebSocketUrl = "wss://ws.bitget.com/v2/ws/public";
|
||||
string message = "";
|
||||
var tempStrData = "";
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
await webSocket.ConnectAsync(new Uri(WebSocketUrl), CancellationToken.None);
|
||||
// 연결이 성공적으로 이루어지면 처리할 코드 작성
|
||||
Console.WriteLine("WebSocket 연결 성공");
|
||||
@@ -214,13 +230,12 @@ namespace BitgetAPI.WebService
|
||||
var args = new Dictionary<string, object>();
|
||||
args.Add("instType", "USDT-FUTURES");
|
||||
args.Add("channel", chnnelType);
|
||||
//args.Add("channel", "candle1m");
|
||||
args.Add("instId", marketInfo.MarketName);
|
||||
argsList.Add(args);
|
||||
break;
|
||||
}
|
||||
|
||||
dic.Add("args", argsList);
|
||||
dic.Add("args", argsList)
|
||||
;
|
||||
//var jsonDataText = "{\"op\":\"subscribe\",\"args\":[{\"instType\":\"SPOT\",\"channel\":\"ticker\",\"instId\":\"ETHUSDT\"}, {\"instType\":\"SPOT\",\"channel\":\"ticker\",\"instId\":\"BTCUSDT\"}]}";
|
||||
|
||||
var jsonData = JsonConvert.SerializeObject(dic);
|
||||
@@ -271,6 +286,7 @@ namespace BitgetAPI.WebService
|
||||
DateTime dt = new DateTime(1970, 01, 01);
|
||||
tickerList.reciveTime = dt.AddMilliseconds(Convert.ToDouble(tickerList.ts)).ToLocalTime();
|
||||
|
||||
// 웹소켓 티커 리스트에 추가
|
||||
var searchIndex = commonProperty.webSocketCandles.IndexOf(i => i.instId == tickerList.instId);
|
||||
if (searchIndex < 0)
|
||||
commonProperty.webSocketCandles.Add(tickerList);
|
||||
@@ -278,9 +294,108 @@ namespace BitgetAPI.WebService
|
||||
{
|
||||
commonProperty.webSocketCandles[searchIndex] = tickerList;
|
||||
}
|
||||
|
||||
// 캔들 리스트에서 해당 데이터 찾기
|
||||
var searchIndex_c = commonProperty.candleDataLists.IndexOf(i => i.ConGoodsData.MarketName == tickerList.instId);
|
||||
|
||||
// 캔들 리스트에 업데이트 (전체 시간별)
|
||||
foreach (CommonProperty.MCandleTimeType interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType)))
|
||||
{
|
||||
var candleDataList = commonProperty.candleDataLists[searchIndex_c].candleDataList[interval];
|
||||
|
||||
// 캔들 리스트에 추가
|
||||
var candleData = new CandleData();
|
||||
candleData.Argument = tickerList.reciveTime;
|
||||
candleData.Close = tickerList.lastPr;
|
||||
|
||||
// 캔들 리스트가 없으면 추가
|
||||
if (candleDataList.Count == 0)
|
||||
candleDataList.Add(candleData);
|
||||
else
|
||||
{
|
||||
// 마지막 시간 데이터 가져오기
|
||||
var lastCandleData = candleDataList.Find(j=>j.Argument == candleDataList.Max(i => i.Argument));
|
||||
|
||||
// 업데이트 or 추가
|
||||
bool updateFlag = true;
|
||||
|
||||
switch (interval)
|
||||
{
|
||||
case CommonProperty.MCandleTimeType.M1:
|
||||
// 같은 분이면 무조건 업데이트
|
||||
if (lastCandleData.Argument.Minute != candleData.Argument.Minute)
|
||||
updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.M3:
|
||||
// 같은 분이면 무조건 업데이트
|
||||
if (lastCandleData.Argument.Minute != candleData.Argument.Minute &&
|
||||
candleData.Argument.Minute % 3 == 1) updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.M5:
|
||||
if (lastCandleData.Argument.Minute != candleData.Argument.Minute &&
|
||||
candleData.Argument.Minute % 5 == 1) updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.M15:
|
||||
if (lastCandleData.Argument.Minute != candleData.Argument.Minute &&
|
||||
candleData.Argument.Minute % 15 == 1) updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.M30:
|
||||
if (lastCandleData.Argument.Minute != candleData.Argument.Minute &&
|
||||
candleData.Argument.Minute % 30 == 1) updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.H1:
|
||||
if (lastCandleData.Argument.Hour != candleData.Argument.Hour)
|
||||
updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.H4:
|
||||
if (lastCandleData.Argument.Hour != candleData.Argument.Hour &&
|
||||
candleData.Argument.Hour % 4 == 1) updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.H6:
|
||||
if (lastCandleData.Argument.Hour != candleData.Argument.Hour &&
|
||||
candleData.Argument.Hour % 6 == 1) updateFlag = false;
|
||||
break;
|
||||
case CommonProperty.MCandleTimeType.H12:
|
||||
if (lastCandleData.Argument.Hour != candleData.Argument.Hour &&
|
||||
candleData.Argument.Hour % 12 == 1) updateFlag = false;
|
||||
break;
|
||||
}
|
||||
|
||||
// 이미 등록된 시간 캔들이 있는 경우 변경
|
||||
if (updateFlag)
|
||||
{
|
||||
// 시간 업데이트
|
||||
lastCandleData.Argument = candleData.Argument;
|
||||
// 종가 수정
|
||||
lastCandleData.Close = candleData.Close;
|
||||
// 저가 등록
|
||||
if(lastCandleData.Low == 0 || lastCandleData.Low > candleData.Close) lastCandleData.Low = candleData.Close;
|
||||
// 고가 등록
|
||||
if (lastCandleData.High == 0 || lastCandleData.High < candleData.Close) lastCandleData.High = candleData.Close;
|
||||
}
|
||||
// 없는 경우 추가
|
||||
else
|
||||
{
|
||||
// 새 데이터 등록
|
||||
candleDataList.Add(candleData);
|
||||
|
||||
// 시가 등록
|
||||
candleData.Open = candleData.Close;
|
||||
|
||||
// 기존 데이터 삭제
|
||||
if (candleDataList.Count > 250)
|
||||
{
|
||||
// 가장 오래된 데이터 삭제
|
||||
candleDataList.Remove(j => j.Argument == candleDataList.Min(i => i.Argument));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CommonProperty.BitgetWebSocketType.캔들정보:
|
||||
#region 캔들 웹소켓 : 종목 50, 캔들 1 개만 해도 뒤지려고 함 !! (일딴 패스)
|
||||
{
|
||||
var argList = JsonConvert.DeserializeObject<Dictionary<string,object>>(datalist["arg"]?.ToString());
|
||||
|
||||
@@ -381,6 +496,7 @@ namespace BitgetAPI.WebService
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -412,6 +528,7 @@ namespace BitgetAPI.WebService
|
||||
// Candle 시간
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
catch (Exception ex)
|
||||
@@ -458,3 +575,4 @@ namespace BitgetAPI.WebService
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user