This commit is contained in:
kyh
2024-07-11 11:27:14 +09:00
parent ef6eaeb89a
commit bea301ffd7
2 changed files with 202 additions and 194 deletions

View File

@@ -697,196 +697,70 @@ namespace BitgetAPI.WebService
}
}
foreach (var datalist in cloneList)
var dataList = cloneList.Where(t => t.ContainsKey("data")).Select(t => t["data"]);
var list = JsonConvert.DeserializeObject<List<List<WebSocketTickerInfo>>>(JsonConvert.SerializeObject(dataList));
list = list.OrderBy(t => t[0].ts).ToList();
switch (bitgetWebSocketType)
{
if (datalist.ContainsKey("data"))
{
switch (bitgetWebSocketType)
case CommonProperty.BitgetWebSocketType.현황정보_전체종목:
{
case CommonProperty.BitgetWebSocketType.현황정보_전체종목:
foreach (var datalist in list)
{
var candleInfo = datalist;
var tickerList = candleInfo[0];
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);
else
{
var candleInfo = JsonConvert.DeserializeObject<List<WebSocketTickerInfo>>(datalist["data"]?.ToString());
var tickerList = candleInfo[0];
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);
else
{
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_Edit = candleDataList.ToList();
// 마지막 시간 데이터 가져오기
var lastCandleData = lastCandleData_Edit.Find(j => j.Argument == lastCandleData_Edit.Max(i => i.Argument));
if (lastCandleData == null) return;
// 업데이트 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;
lastCandleData.WebSocketUpdate = true;
}
// 없는 경우 추가
else
{
if (candleData.Open == 0) { }
// 1분 이상 Ticker가 없는 겨우는 Open 가만 가격이 등록됨
candleData.Open = candleData.Close;
candleData.WebSocketUpdate = true;
// 새 데이터 등록
candleDataList.Add(candleData);
// 기존 데이터 삭제
if (candleDataList.Count > 250)
{
// 가장 오래된 데이터 삭제
candleDataList.Remove(j => j.Argument == candleDataList.Min(i => i.Argument));
}
}
}
}
commonProperty.webSocketCandles[searchIndex] = tickerList;
}
break;
case CommonProperty.BitgetWebSocketType.캔들정보:
#region 캔들 웹소켓 : 종목 50, 캔들 1 개만 해도 뒤지려고 함 !! (일딴 패스)
*/
// 캔들 리스트에서 해당 데이터 찾기
var searchIndex_c = commonProperty.candleDataLists.IndexOf(i => i.ConGoodsData.MarketName == tickerList.instId);
// 캔들 리스트에 업데이트 (전체 시간별)
foreach (CommonProperty.MCandleTimeType interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType)))
{
var argList = JsonConvert.DeserializeObject<Dictionary<string, object>>(datalist["arg"]?.ToString());
var candleDataList = commonProperty.candleDataLists[searchIndex_c].candleDataList[interval];
var candleInfos = JsonConvert.DeserializeObject<List<List<object>>>(datalist["data"]?.ToString());
var candleInfo = candleInfos[0];
DateTime dt = new DateTime(1970, 01, 01);
var candleData = new CandleData(
dt.AddMilliseconds(Convert.ToDouble(candleInfo[0])).ToLocalTime(),
Convert.ToDouble(candleInfo[1]),
Convert.ToDouble(candleInfo[2]),
Convert.ToDouble(candleInfo[3]),
Convert.ToDouble(candleInfo[4]),
Convert.ToDouble(candleInfo[5]),
Convert.ToDouble(candleInfo[6]),
Convert.ToDouble(candleInfo[7])
);
// Websocket 캔들 정보 구분 하기 (1분, 1시간 등)
CommonProperty.MCandleTimeType mCandleTimeType = CommonProperty.MCandleTimeType.H1;
foreach (var interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType)))
{
// Description
var description = Utils.Convertor.GetEnumDescription((Enum)interval);
if (argList["channel"].ToString().Contains(description))
mCandleTimeType = (CommonProperty.MCandleTimeType)interval;
break;
}
// 캔들 리스트에서 해당 데이터 찾기
var searchIndex = commonProperty.candleDataLists.IndexOf(i => i.ConGoodsData.MarketName == argList["instId"].ToString());
var candleDataList = commonProperty.candleDataLists[searchIndex].candleDataList[mCandleTimeType];
// 마지막 데이터 (최신데이터) 가져오기
CandleData lastCandleData = null;
// 캔들 리스트에 추가
var candleData = new CandleData();
candleData.Argument = tickerList.reciveTime;
candleData.Close = tickerList.lastPr;
// 캔들 리스트가 없으면 추가
if (candleDataList.Count == 0)
candleDataList.Add(candleData);
else
{
lastCandleData = commonProperty.candleDataLists[searchIndex].candleDataList[mCandleTimeType].Last();
var lastCandleData_Edit = candleDataList.ToList();
// 최신데이터와 비교하여 교체/등록하기
// 마지막 시간 데이터 가져오기
var lastCandleData = lastCandleData_Edit.Find(j => j.Argument == lastCandleData_Edit.Max(i => i.Argument));
if (lastCandleData == null || lastCandleData.Argument > candleData.Argument) return;
// 업데이트 or 추가
bool updateFlag = false;
switch (mCandleTimeType)
switch (interval)
{
case CommonProperty.MCandleTimeType.M1:
if (lastCandleData.Argument.Minute == candleData.Argument.Minute)
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.M3:
case CommonProperty.MCandleTimeType.M3:
if (candleData.Argument.Minute % 3 != 0 || (candleData.Argument.Minute % 3 == 0 && candleData.Argument.Minute == lastCandleData.Argument.Minute))
updateFlag = true;
break;
@@ -923,34 +797,166 @@ namespace BitgetAPI.WebService
// 이미 등록된 시간 캔들이 있는 경우 변경
if (updateFlag)
{
lastCandleData = candleData;
// 시간 업데이트
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;
lastCandleData.WebSocketUpdate = true;
}
// 없는 경우 추가
else
{
lastCandleData.Close = candleData.Open;
if (candleData.Open == 0) { }
// 1분 이상 Ticker가 없는 겨우는 Open 가만 가격이 등록됨
candleData.Open = candleData.Close;
candleData.WebSocketUpdate = true;
// 새 데이터 등록
candleDataList.Add(candleData);
// 기존 데이터 삭제
if (candleDataList.Count > 250)
{
// 가장 오래된 데이터 삭제
candleDataList.Remove(j => j.Argument == candleDataList.Min(i => i.Argument));
}
}
}
var minData = candleDataList.Min(t => t.Argument);
var minCandle = candleDataList.FirstOrDefault(t => t.Argument == minData);
if (minCandle != null)
{
candleDataList.Remove(minCandle);
}
}
}
}
break;
case CommonProperty.BitgetWebSocketType.캔들정보:
#region 캔들 웹소켓 : 종목 50, 캔들 1 개만 해도 뒤지려고 함 !! (일딴 패스)
{
foreach (var datalist in cloneList)
{
var argList = JsonConvert.DeserializeObject<Dictionary<string, object>>(datalist["arg"]?.ToString());
var candleInfos = JsonConvert.DeserializeObject<List<List<object>>>(datalist["data"]?.ToString());
var candleInfo = candleInfos[0];
DateTime dt = new DateTime(1970, 01, 01);
var candleData = new CandleData(
dt.AddMilliseconds(Convert.ToDouble(candleInfo[0])).ToLocalTime(),
Convert.ToDouble(candleInfo[1]),
Convert.ToDouble(candleInfo[2]),
Convert.ToDouble(candleInfo[3]),
Convert.ToDouble(candleInfo[4]),
Convert.ToDouble(candleInfo[5]),
Convert.ToDouble(candleInfo[6]),
Convert.ToDouble(candleInfo[7])
);
// Websocket 캔들 정보 구분 하기 (1분, 1시간 등)
CommonProperty.MCandleTimeType mCandleTimeType = CommonProperty.MCandleTimeType.H1;
foreach (var interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType)))
{
// Description
var description = Utils.Convertor.GetEnumDescription((Enum)interval);
if (argList["channel"].ToString().Contains(description))
mCandleTimeType = (CommonProperty.MCandleTimeType)interval;
break;
}
// 캔들 리스트에서 해당 데이터 찾기
var searchIndex = commonProperty.candleDataLists.IndexOf(i => i.ConGoodsData.MarketName == argList["instId"].ToString());
var candleDataList = commonProperty.candleDataLists[searchIndex].candleDataList[mCandleTimeType];
// 마지막 데이터 (최신데이터) 가져오기
CandleData lastCandleData = null;
if (candleDataList.Count == 0)
candleDataList.Add(candleData);
else
{
lastCandleData = commonProperty.candleDataLists[searchIndex].candleDataList[mCandleTimeType].Last();
// 최신데이터와 비교하여 교체/등록하기
// 업데이트 or 추가
bool updateFlag = false;
switch (mCandleTimeType)
{
case CommonProperty.MCandleTimeType.M1:
if (lastCandleData.Argument.Minute == candleData.Argument.Minute)
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.M3:
if (candleData.Argument.Minute % 3 != 0 || (candleData.Argument.Minute % 3 == 0 && candleData.Argument.Minute == lastCandleData.Argument.Minute))
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.M5:
if (candleData.Argument.Minute % 5 != 0 || (candleData.Argument.Minute % 5 == 0 && candleData.Argument.Minute == lastCandleData.Argument.Minute))
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.M15:
if (candleData.Argument.Minute % 15 != 0 || (candleData.Argument.Minute % 15 == 0 && candleData.Argument.Minute == lastCandleData.Argument.Minute))
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.M30:
if (candleData.Argument.Minute % 30 != 0 || (candleData.Argument.Minute % 30 == 0 && candleData.Argument.Minute == lastCandleData.Argument.Minute))
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.H1:
if (candleData.Argument.Hour == candleData.Argument.Hour)
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.H4:
if (candleData.Argument.Hour % 4 != 0 || (candleData.Argument.Hour % 4 == 0 && candleData.Argument.Hour == lastCandleData.Argument.Hour))
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.H6:
if (candleData.Argument.Hour % 6 != 0 || (candleData.Argument.Hour % 6 == 0 && candleData.Argument.Hour == lastCandleData.Argument.Hour))
updateFlag = true;
break;
case CommonProperty.MCandleTimeType.H12:
if (candleData.Argument.Hour % 12 != 0 || (candleData.Argument.Hour % 12 == 0 && candleData.Argument.Hour == lastCandleData.Argument.Hour))
updateFlag = true;
break;
}
// 이미 등록된 시간 캔들이 있는 경우 변경
if (updateFlag)
{
lastCandleData = candleData;
}
// 없는 경우 추가
else
{
lastCandleData.Close = candleData.Open;
// 새 데이터 등록
candleDataList.Add(candleData);
// 기존 데이터 삭제
if (candleDataList.Count > 250)
{
var minData = candleDataList.Min(t => t.Argument);
var minCandle = candleDataList.FirstOrDefault(t => t.Argument == minData);
if (minCandle != null)
{
candleDataList.Remove(minCandle);
}
}
}
}
#endregion
break;
}
}
}
#endregion
break;
}
} catch(Exception e)
}
catch (Exception e)
{
}