API(C#)를 이용한 자동매매 개발 #1차트(2/3)

in kr •  7 years ago  (edited)

차트 생성을 위한 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/

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

뉴비는 언제나 환영!이에요.
팁! : 전자화폐 관련글은 cryptocurrency태그를 이용하면 좋아요.
6.94% 보팅
현재 보상량 : [ 평균 - 0.33 / 2개 / 합계 : 0.66 ]

  • kr-newbie 보안관 봇! (beta 0.5.0 - 2017/07/17)

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 도 활용해보면 좋을것같네요.