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()); } }
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); }
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()); } }
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); }