コード例 #1
0
        private void Timer_Tick(object sender, EventArgs e)
        {
            var KRWAccount = ApiData.getAsset().Where(x => "KRW".Equals(x.Value <string>("currency"))).First();

            Thread.Sleep(100);
            var krwBalance = KRWAccount.Value <double>("balance");                                           // 보유 현금
            var candles    = ApiData.getCandle <List <Candle> >(CoinName, CandleType, CandleCount);

            Thread.Sleep(100);
            var prevCandle = candles[1];
            var currCandle = candles[0];
            var currPrice  = currCandle.Close;
            var prevPrice  = prevCandle.Close;

            var orderChance = ApiData.getOrdersChance(CoinName);

            Thread.Sleep(100);
            var ask      = orderChance["ask_account"];
            var coinVol  = ask.Value <double>("balance");                                                  // 보유 코인 수량
            var avgPrice = (coinVol * currPrice < 5000) ? currPrice : ask.Value <double>("avg_buy_price"); // 매수 평단가

            var coinPrice = avgPrice * coinVol;                                                            // 보유 코인 금액
            var upRatio   = (currPrice - avgPrice) / currPrice * 100;                                      // 평단 대비 상승폭 (%)
            var downRatio = (currPrice - prevPrice) / currPrice * 100;                                     // 현재가 대비 하락폭 (%)
            var result    = null as JObject;                                                               // 거래 결과

            Debug.WriteLine("upRatio : {0}, downRatio {1}", upRatio, downRatio);

            try
            {
                if (upRatio >= TriggerRatio && coinPrice > 5000)
                {
                    // 올랐을때 코인 금액 절반 팔기
                    var vol = (coinPrice / 2) > 5000 ? coinVol / 2 : coinVol;
                    Debug.WriteLine("#### {2} SELL : 금액 {0}, 수량 {1}", vol * currPrice, vol, CoinName);
                    Thread.Sleep(100);
                    result = React.executeDeal(false, false, CoinName, vol, 0, 0);
                }
                else if (downRatio <= -(TriggerRatio) && krwBalance > 5000)
                {
                    // 내렸을때 보유 현금 절반으로 코인 사기
                    var total = (krwBalance / 2) > 5000 ? krwBalance / 2 : krwBalance;
                    Debug.WriteLine("#### {2} BUY : 금액 {0}, 수량 {1}", total, total / currPrice, CoinName);
                    Thread.Sleep(100);
                    result = React.executeDeal(true, false, CoinName, 0, 0, Math.Truncate(total / 10) * 10);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }

            if (result != null)
            {
                Debug.WriteLine("#### RESULT : {0}", result.ToString());
            }
        }
コード例 #2
0
        private Balance GetBalance(ApiData apiData, string coinName, double startKrw)
        {
            var balance   = new Balance();
            var asset     = apiData.getAsset();
            var krwAsset  = asset.Where(x => "KRW".Equals(x.Value <string>("currency"))).FirstOrDefault();
            var coinAsset = asset.Where(x => coinName.Equals(x.Value <string>("currency")) && "KRW".Equals(x.Value <string>("unit_currency"))).FirstOrDefault();
            var locked    = coinAsset.Value <double>("locked");
            var now       = DateTime.Now;

            while (locked > 0 && (DateTime.Now - now).TotalSeconds <= 5)
            {
                System.Threading.Thread.Sleep(1000);
                asset     = apiData.getAsset();
                krwAsset  = asset.Where(x => "KRW".Equals(x.Value <string>("currency"))).FirstOrDefault();
                coinAsset = asset.Where(x => coinName.Equals(x.Value <string>("currency")) && "KRW".Equals(x.Value <string>("unit_currency"))).FirstOrDefault();
                locked    = coinAsset.Value <double>("locked");
            }

            if (krwAsset != null)
            {
                balance.KRWBalance = krwAsset.Value <double>("balance");
            }

            if (coinAsset != null)
            {
                balance.CoinVol     = coinAsset.Value <double>("balance");
                balance.AvgBuyPrice = coinAsset.Value <double>("avg_buy_price");
                balance.CoinBalance = balance.CoinVol * balance.AvgBuyPrice;
            }

            balance.TotalBalance  = balance.KRWBalance + balance.CoinBalance;
            balance.KrwProfit     = balance.TotalBalance - startKrw;
            balance.KrwProfitRate = balance.KrwProfit / startKrw * 100;

            {
                txtKRW.Text         = balance.KRWBalance.ToString("N0");
                txtCoinBalance.Text = balance.CoinBalance.ToString("N0");
            }

            return(balance);
        }
コード例 #3
0
        private void PointHalfStrategy()
        {
            // 3분봉 2개를 기준으로 이전 시가 에서 현재 금액 등낙률을 가져온다.
            // 등낙률 0.5% 이상이 되면 오르면 팔고/ 내리면 산다.
            // 거래시 보유 현금, 보유 코인의 절반을 거래하되 거래 금액이 만원 미만인 경우 전체 금액으로 거래한다.

            var KRWAccount = ApiData.getAsset().Where(x => "KRW".Equals(x.Value <string>("currency"))).First();
            var krwBalance = KRWAccount.Value <double>("balance");                                           // 보유 현금

            txtKRW.Text = krwBalance.ToString("N0");
            var candles    = ApiData.getCandle <List <Candle> >(CoinName, CandleType, CandleCount);
            var prevCandle = candles[2];
            var currCandle = candles[0];
            var currPrice  = currCandle.Close;
            var prevPrice  = prevCandle.Close;

            var orderChance = ApiData.getOrdersChance(CoinName);
            var ask         = orderChance["ask_account"];
            var coinVol     = ask.Value <double>("balance");                                                  // 보유 코인 수량
            var avgPrice    = (coinVol * currPrice < 5000) ? currPrice : ask.Value <double>("avg_buy_price"); // 매수 평단가

            var coinPrice = avgPrice * coinVol;                                                               // 보유 코인 금액
            var upRatio   = (currPrice - avgPrice) / currPrice * 100;                                         // 평단 대비 상승폭 (%)
            var downRatio = (currPrice - prevPrice) / currPrice * 100;                                        // 현재가 대비 하락폭 (%)
            var result    = null as JObject;                                                                  // 거래 결과

            Debug.WriteLine("upRatio : {0}, downRatio {1}", upRatio, downRatio);
            WriteLog("upRatio : {0}, downRatio {1}", upRatio, downRatio);

            try
            {
                if (upRatio >= TriggerRatio && coinPrice > 5000)
                {
                    // 올랐을때 코인 금액 절반 팔기
                    var vol = (coinPrice / 2) > 5000 ? coinVol / 2 : coinVol;
                    vol = Math.Truncate(vol * 100000) / 100000;
                    Debug.WriteLine("#### {2} SELL : 금액 {0}, 수량 {1}", vol * currPrice, vol, CoinName);
                    WriteLog("#### {2} SELL : 금액 {0}, 수량 {1}", vol * currPrice, vol, CoinName);
                    result = React.executeDeal(false, false, CoinName, vol, 0, 0);
                }
                else if (downRatio <= -(TriggerRatio) && krwBalance > 5000)
                {
                    // 내렸을때 보유 현금 절반으로 코인 사기
                    var total = (krwBalance / 2) > 5000 ? krwBalance / 2 : krwBalance;
                    total = Math.Truncate(total * 1000) / 1000;
                    Debug.WriteLine("#### {2} BUY : 금액 {0}, 수량 {1}", total, total / currPrice, CoinName);
                    WriteLog("#### {2} BUY : 금액 {0}, 수량 {1}", total, total / currPrice, CoinName);
                    result = React.executeDeal(true, false, CoinName, 0, 0, total);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                WriteLog(ex.StackTrace);
            }

            if (result != null)
            {
                Debug.WriteLine("#### RESULT : {0}", result.ToString());
                WriteLog("#### RESULT : {0}", result.ToString());
            }
        }
コード例 #4
0
        private void MinuteCandleByTicks()
        {
            // 설정값
            var coinName    = Coin.Ticker;
            var candleType  = CandleType.Name;
            var candleCount = CandleCount;
            var feeRate     = FeeRate;
            var tradeRate   = TradeRate;
            var triggerRate = TriggerRate;

            // 해당 코인 보유금액이 있으면 매도 없으면 매수
            var candles    = ApiData.getCandle <List <Candle> >(coinName, candleType, candleCount); // 캔들 조회
            var currCandle = candles.First();                                                       // 현재 캔들
            var currPrice  = currCandle.Close;                                                      // 현재가

            System.Threading.Thread.Sleep(1000);

            var orderChance = GetOrderChance(ApiData, coinName, currPrice);                     // 주문 가능 정보
            var coinPrice   = orderChance.CoinBalance;                                          // 코인 보유금
            var krwBalance  = orderChance.KRWBalance;                                           // 보유 현금
            var coinVol     = orderChance.CoinVol;                                              // 보유 코인 수량
            var avgPrice    = orderChance.AvgBuyPrice;                                          // 매수 평단가
            var minTradeKRW = Settings.Default.minTradeKRW;                                     // 최소 거래 금액

            // 분봉 N개를 기준으로 직전 시가 에서 현재 금액 등낙률을 가져온다.
            var prevCandle = candles[1];                                              // 직전 캔들
            var lastCandle = candles.Last();                                          // 마지막 캔들
            var prevPrice  = prevCandle.Close;                                        // 직전종가

            prevPrice = prevCandle.Low;                                               // 직전 저가 대입
            var startPrice = lastCandle.Open;                                         // 마지막 캔들 시작가
            var highPrice  = candles.GetRange(1, candles.Count - 1).Max(x => x.High); // 최고가

            startPrice = Math.Max(startPrice, highPrice);                             // 캔들 최고가 대입
            var change          = (currPrice - prevPrice);                            // 변동가
            var currentRate     = (change / currPrice) * 100;                         // 등락율
            var candlesChange   = (currPrice - startPrice);                           // 캔들 변동가
            var candlesRate     = (candlesChange / startPrice) * 100;                 // 캔들 등락율
            var profit          = (avgPrice == 0) ? 0D : (currPrice - avgPrice);      // 수익
            var tradeProfitRate = (avgPrice == 0) ? 0D : (profit / avgPrice) * 100;   // 수익율
            var result          = null as JObject;
            var args            = new object[] { coinName, currPrice, prevPrice, startPrice, currentRate, candlesRate, avgPrice, tradeProfitRate };
            var buyTs           = DateTime.Now - LastBuyDate;
            var sellTs          = DateTime.Now - LastSellDate;
            var minutes         = sellTs.TotalMinutes;

            WriteLog("{0} : 현재가 {1:N0}, 직전가 {2:N0}, 시작가 {3:N0}, 직전등락폭 {4:F6}, 등락폭 {5:F6}, 평단가 {6:N0}, 수익율 {7:F6}", args);

            if (StartKRW < minTradeKRW && krwBalance > minTradeKRW && coinPrice < minTradeKRW)
            {
                // 거래 시작 금액
                StartKRW = krwBalance;
            }

            try
            {
                if (coinPrice <= minTradeKRW && krwBalance <= minTradeKRW)
                {
                    // 보유현금과 보유 코인이 최소 거래금액 보다 적으면 거래 없음
                    WriteLog("#### 거래 불가 : 보유현금 {0}, 코인보유금 {1}, 최소 거래 금액 {2},", krwBalance, coinPrice, minTradeKRW);
                }
                else if (krwBalance > minTradeKRW &&
                         sellTs.TotalMinutes >= CandleType.Minute &&
                         candlesRate <= -(triggerRate + (feeRate * 2)) &&
                         currentRate >= (feeRate * 2))
                {
                    // BUY
                    // 보유현금이 최소 거래금액 보다 많음
                    // 수익율 초과하여 떨어지다 수수료율 2배 이상 상승 했을때 거래비율 만큼 산다.
                    var total = ToOrderPrice(krwBalance);
                    result      = React.executeDeal(true, false, coinName, 0, 0, total);
                    LastBuyDate = DateTime.Now;
                    WriteLog("#### {0} BUY : 금액 {1:N0}, 수량 {2:F6}", coinName, total, total / currPrice);
                }
                else if (coinPrice > minTradeKRW &&
                         (buyTs.TotalSeconds >= CandleType.Minute * 45 && tradeProfitRate <= (feeRate - triggerRate) ||
                          tradeProfitRate >= triggerRate + (feeRate * 2)))
                {
                    // SELL
                    // 코인평가금 최소 거래금액 보다 많음
                    // 현재가가 평단가 보다 (수익율 - 수료율 * 2) 이하일때 전체 매도
                    // 현재가가 평단가 보다 (수익율 + 수료율 * 2) 이상일때 전체 매도
                    var vol = coinVol;
                    vol          = Math.Truncate(vol * 100000) / 100000;
                    result       = React.executeDeal(false, false, coinName, vol, 0, 0);
                    LastSellDate = DateTime.Now;
                    WriteLog("#### {0} SELL : 금액 {1:N0}, 수량 {2:F6}", coinName, vol * currPrice, vol);
                }
            }
            catch (Exception ex)
            {
                WriteLog(ex.StackTrace);
            }

            if (result != null)
            {
                WriteLog("#### RESULT : {0}", result.ToString());
            }

            var asset        = ApiData.getAsset();
            var krwAsset     = asset.Where(x => "KRW".Equals(x.Value <string>("currency"))).FirstOrDefault();
            var coinAsset    = asset.Where(x => coinName.Equals(x.Value <string>("currency"))).FirstOrDefault();
            var krwAmount    = 0D;
            var coinAmount   = 0D;
            var coinBalance  = 0D;
            var coinAvgPrice = 0D;

            if (krwAsset != null)
            {
                krwAmount = krwAsset.Value <double>("balance");
            }

            if (coinAsset != null)
            {
                coinBalance  = krwAsset.Value <double>("balance");
                coinAvgPrice = krwAsset.Value <double>("avg_buy_price");
                coinAmount   = coinBalance * coinAvgPrice;
            }

            var totalKrw      = krwAmount + coinAmount;
            var krwProfit     = totalKrw - StartKRW;
            var krwProfitRate = krwProfit / StartKRW * 100;
            var profits       = new object[] { coinName, StartKRW, totalKrw, krwProfit, krwProfitRate };

            txtProfitPrice.Text = krwProfit.ToString("N0");
            txtProfitRate.Text  = krwProfitRate.ToString("F6");
            WriteLog("#### {0} 수익 : 거래시작금액 {1:N0}, 현재평가 금액 {2:N0}, 수익금액 {3:N0}, 수익율 {4:F6}", profits);
        }