API(C#)를 이용한 자동매매 개발 #1차트(2/3)
차트 생성을 위한 GetRecentTransactions 콜을 통한 체결내역을 받아봅시다 !!
우선 시원하게 소스먼저 올리겠습니다.
public List<Sign> GetRecentTransactions(string currency = "BTC")
{
string sParams = "";
string sRespBodyData = String.Empty;
JObject JObj = XcoinApiCall("/public/recent_transactions/" + currency, sParams, ref sRespBodyData);
if (JObj == null)
{
CowinLogger.makeLog(CowinLogger.LogLevel.WRN, GetType().Name, MethodBase.GetCurrentMethod().Name, "HTTP Response JSON Data", sRespBodyData);
return null;
}
List<Sign> signList = new List<Sign>();
foreach (JObject sub in JObj["data"].ToList())
{
Sign sign = new Sign()
{
price = double.Parse(sub["price"].ToString()),
total = double.Parse(sub["total"].ToString()),
transaction_date = DateTime.ParseExact(sub["transaction_date"].ToString(), "yyyy-MM-dd H:mm:ss", null),
type = sub["type"].ToString(),
units_traded = double.Parse(sub["units_traded"].ToString())
};
signList.Add(sign);
}
// 최신이 나중에 오도록 수정
signList.Reverse();
return signList;
}
이런식으로 만들었습니다.
개발강의를 하자는게 아니니, 어느정도 다 알아보실거라 생각됩니다.
CowinLogger.makeLog 이거는 오류를 메일로 쏴주는 로거인데
취향에 따라 대응하시면 되겠습니다. ^^
리턴중에 Sign 이라는 클래스는 아래와 같습니다.
public class Sign
{
public DateTime transaction_date; // 거래 채결 시간
public string type; // 판/구매 (ask, bid)
public double units_traded; // 거래 Currency 수량
public double price; // 1Currency 거래 금액
public double total; // 총 거래금액
}
List<Sign> signList = xApi.GetRecentTransactions(currency); // 이렇게 호출하면 되겠지요~ (currency 는 원하시는 화폐로~)
자 ! 그럼 수신한 signList 에 대해 어떻게 처리할까요?
체결정보(Sign)이 있으니, 차트에 사용할 Series 를 만들면 되겠지요~
public MakeSeries(Stock s, SERIES_TYPE s_type, List<Sign> signList)
{
Dictionary<SERIES_TYPE, List<Series>> seriesDic = s.seriesDic;
if (seriesDic.ContainsKey(s_type) == false)
seriesDic.Add(s_type, new List<Series>());
#region
// 중복된 체결리스트는 삭제
if (s.lastSign != null)
{
int sameIdx = signList.FindIndex(ii => ii.units_traded == s.lastSign.units_traded && ii.transaction_date == s.lastSign.transaction_date);
if (sameIdx >= 0)
signList.RemoveRange(0, sameIdx + 1);
if (signList.Count == 0)
return;
}
#endregion
foreach (Sign sign in signList)
{
DateTime trimmedDateTime = GetTrimDateTime(s_type, sign.transaction_date);
int idx = seriesDic[s_type].FindLastIndex(ii => ii.dt == trimmedDateTime);
if (idx >= 0)
{
seriesDic[s_type][idx].close = sign.price;
if (seriesDic[s_type][idx].high < sign.price)
seriesDic[s_type][idx].high = sign.price;
if (seriesDic[s_type][idx].low > sign.price)
seriesDic[s_type][idx].low = sign.price;
seriesDic[s_type][idx].trdAmt += sign.units_traded;
}
else
{
Series newSeries = new Series();
newSeries.close = newSeries.open = newSeries.low = newSeries.high = sign.price;
newSeries.trdAmt = sign.units_traded;
newSeries.dt = trimmedDateTime;
seriesDic[s_type].Add(newSeries);
while (seriesDic[s_type].Count > 1000)
{
seriesDic[s_type].RemoveAt(0);
}
}
}
}
private DateTime GetTrimDateTime(SERIES_TYPE s_type, DateTime dt)
{
if (s_type == SERIES_TYPE.DAY)
{
dt = dt.AddHours(-dt.Hour);
dt = dt.AddMinutes(-dt.Minute);
dt = dt.AddSeconds(-dt.Second);
}
else if (s_type == SERIES_TYPE.MIN_1)
{
dt = dt.AddSeconds(-dt.Second);
}
else if (s_type == SERIES_TYPE.MIN_5)
{
dt = dt.AddMinutes(-(dt.Minute % 5));
dt = dt.AddSeconds(-dt.Second);
}
else if (s_type == SERIES_TYPE.MIN_10)
{
dt = dt.AddMinutes(-(dt.Minute % 10));
dt = dt.AddSeconds(-dt.Second);
}
else if (s_type == SERIES_TYPE.MIN_30)
{
dt = dt.AddMinutes(-(dt.Minute % 30));
dt = dt.AddSeconds(-dt.Second);
}
else if (s_type == SERIES_TYPE.MIN_60)
{
dt = dt.AddMinutes(-dt.Minute);
dt = dt.AddSeconds(-dt.Second);
}
return dt;
}
public class Stock
{
public string currencyName; // BTC, ETH, DASH, LTC, ETC, XRP
public Dictionary<SERIES_TYPE, List*<Series*>> seriesDic;
public Sign lastSign;
public Hoga hoga;
public Stock()
{
seriesDic = new Dictionary<SERIES_TYPE, List*<Series*>>();
}
}
Dictionary<string, Stock> stocks;
new MakeSeries(stocks[currency], SERIES_TYPE.MIN_10, signList);
public enum SERIES_TYPE { DAY, MIN_1, MIN_5, MIN_10, MIN_30, MIN_60 };
붙여드린 소스를 보면 List<Series> 가 완성되었다는 걸 알 수 있습니다.
소스가 덕지덕지 보기 안좋군요.... 소스 붙여넣는 기능은 추후 찾아보겠습니다 ^^;
다음회차에서는 차트에 표시하는 기능을 추가해볼께요.
#차트 1/3 https://steemit.com/kr/@cowin/api-c-1-1-2
#차트 2/3 https://steemit.com/kr/@cowin/api-c-1-2-3
#차트 3/3 https://steemit.com/kr/@cowin/api-c-1-3-3
#잔고 1/2 https://steemit.com/kr/@cowin/api-c-2-1-1
#현재까지 완료된 실행파일 : http://bitcoin.cowincomfunny.com/
뉴비는 언제나 환영!이에요.
팁! : 전자화폐 관련글은 cryptocurrency태그를 이용하면 좋아요.
6.94% 보팅
현재 보상량 : [ 평균 - 0.33 / 2개 / 합계 : 0.66 ]
Hello! I just upvoted you! I help new Steemit members! Upvote this comment and follow me! i will upvote your future posts! To any other visitor, upvote this post also to receive free UpVotes from me! Happy SteemIt!
[kr-newbie를 위한 랜덤 보팅!!]This post received a 66.59% upvote from @jongeun! For more information, click here!
차트를 만들기 위해 체결내역을 불러오셨다는 거죠? 마침 제가 필요한 게 과거의 체결내역이라도 열람할 수 있게 하는건데, 저기서 조금만 바꾸면 거래내역을 제가 볼 수 있는거죠? 저는 주로 OKEX를 이용하고요. 거의 하루 종일 차트와 호가창을 보고 있긴 한데 지난 차트 복기할 때 필요할 것 같아서 구상만 하는 중입니다. 배우려면 마음을 잡고 해야되서요. 이 시리즈 잘 보겠습니다.
네, 수신한 체결내역을 저장하면 됩니다.
백테스팅을 진행하시려면 필수사항이겠지요~
빗썸은 간혹 API서버가 맛이 가는터라,
poloniex 도 활용해보면 좋을것같네요.