Advertisement
Guest User

Untitled

a guest
Apr 9th, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 6.35 KB | None | 0 0
  1. import os, algorithm, parseopt2, times, strutils, sequtils
  2. import exchange, bittrexSimulator, bittrexReal, technicalAnalysis, candlesMonitor
  3.  
  4.  
  5. # KIV
  6. let apikey    = "X"
  7. let apisecret = "Y"
  8. # Nik
  9. #let apikey    = "X2"
  10. #let apisecret = "Y2"
  11.  
  12. when defined simulate:
  13.   var bittrex = newFakeBittrex(parse("2017-12-12t09:00:00", "yyyy-MM-dd'T'HH:mm:ss") + 5.hours, customMarkets = "btc-1st; btc-ada; btc-adx; btc-ardr; btc-ark; btc-bat; btc-bay; btc-bcc; btc-btg; btc-cfi; btc-cpc; btc-cvc; btc-edg; btc-eng; btc-etc; btc-eth; btc-hmq; btc-lsk; btc-ltc; btc-mco; btc-mue; btc-nav; btc-nbt; btc-neo; btc-nxt; btc-omg; btc-pay; btc-pivx; btc-powr; btc-qtum; btc-rcn; btc-rep; btc-rise; btc-salt; btc-strat; btc-sys; btc-trig; btc-unb; btc-vox; btc-vtc; btc-waves; btc-wings; btc-xem; btc-xlm; btc-xmr; btc-xrp; btc-xzc")
  14. else:
  15.   var bittrex = newBittrex(apikey, apisecret)
  16. proc trader(monitor: CandlesMonitor)
  17.  
  18. var
  19.   order: Order
  20.   buyRate, sellRate: float
  21.   needSell: bool
  22.   bitcoin, altcoin: float
  23.  
  24. proc updateBalances() =
  25.   GC_fullCollect()
  26.   let response = bittrex.getBalances()
  27.   for i in response:
  28.     if i.currency == "btc":
  29.       bitcoin = i.balance
  30.     if monitors.len > 0 and needSell and (order.marketName.split('-')[1] == i.currency):
  31.       altcoin = i.balance
  32.   if (bitcoin >= 0.1) and not defined(simulate):
  33.     bitcoin = 0.1    
  34.  
  35. proc updateMonitorsList() =
  36.   GC_fullCollect()
  37.   echo getTime()
  38.   echo "-----------------------------------"
  39.   monitors = newSeq[CandlesMonitor]()
  40.   updateBalances()
  41.   echo "Bitcoin: ", formatFloat(bitcoin, ffDecimal, 8)
  42.  
  43.   stdout.write "Markets: "
  44.   stdout.flushFile()
  45.   for i in bittrex.getMarketsInfo():
  46.     if i.coin1Name == "btc":# and i.volume > 800.0 and i.last > 0.00001:
  47.       newMonitor(bittrex, i.name, hour, trader)
  48.       stdout.write(i.name & "; ")
  49.       stdout.flushFile()
  50.   echo " (", monitors.len div 2, " markets)"
  51.   #echo "Bittrex's time: ", monitors[0].candles.time[^1]
  52.   echo "-----------------------------------"
  53.   echo getTime()
  54.  
  55. proc buy(market: CandlesMonitor; price: float) =
  56.   bittrex.cancelOrder(order)
  57.   buyRate = price
  58.   let buyQ = (bitcoin/buyRate) * 0.9975
  59.   order = bittrex.trade(market.name, true, buyRate, buyQ)
  60.   if order.isOpen:  
  61.     echo market.candles.time[^1], " buy-order ", market.name, " by ", formatFloat(buyRate, ffDecimal, 8)
  62.   else:
  63.     echo "Can't set buy-order"
  64.     updateBalances()
  65.  
  66. proc sell(market: string; price: float) =
  67.   bittrex.cancelOrder(order)
  68.   sellRate = price
  69.   order = bittrex.trade(market, false, sellRate, altcoin)
  70.   if order.isOpen:
  71.     echo order.openDate, " sell-order ", market, " by ", formatFloat(sellRate, ffDecimal, 8)
  72.   else:
  73.     echo "Can't set sell-order"
  74.     updateBalances()
  75.    
  76. proc checkOrder() =
  77.   if order.isOpen:
  78.     bittrex.checkOrder(order)
  79.     if not order.isOpen:
  80.       needSell = not needSell
  81.       echo order.closedDate, " closed "
  82.       #keepIf(monitors, proc(x: CandlesMonitor): bool = x.name == order.marketName)
  83.       updateBalances()
  84.       if not order.buyOrder:
  85.         echo "-----------------------------------"
  86.         #echo "Bitcoin: ", formatFloat(bitcoin, ffDecimal, 8)
  87.         echo order.marketName, " profit: ", formatFloat((sellRate/buyRate)*100-100.5, ffDecimal, 2), '%'
  88.         echo "Tickers skipped: ", monitors[0].skippedCounter
  89.         echo "-----------------------------------"
  90.         #updateMonitorsList()
  91.  
  92. #########################################################
  93. var counter = 0
  94.  
  95. if not needSell:
  96.   updateMonitorsList()
  97.  
  98. while true:
  99.   counter += 1
  100.   #echo counter
  101.   checkOrder()
  102.   when defined simulate:
  103.     candlesMonitor.checkAll(toTime bittrex.time)
  104.     bittrex.sleep(60.seconds)
  105.   else:
  106.     candlesMonitor.checkAll(getTime())
  107.     os.sleep(2500)
  108.    
  109.  
  110. proc trader(monitor: CandlesMonitor) =
  111.   if not needSell:
  112.     var candles = monitor.candles      
  113.      
  114.     proc myVolumeIndicator(this: DataProvider; index: int): float =
  115.       if index == 0: return 0.0
  116.       if candles.high[index]-candles.low[index] > 0.00000001:
  117.         return this[index-1] + candles.volume[index]*( (candles.close[index]-candles.open[index]) / (candles.high[index]-candles.low[index]) )
  118.       else:
  119.         return this[index-1]
  120.     var
  121.       myVolume = getCustomIndicator(candles, myVolumeIndicator, "myVolumeIndicator")
  122.       bb = getBollingerBands(myVolume, 50, 5.0)
  123.      
  124.     proc update5(this: DataProvider; index: int): float =
  125.       if index == 0: return 0.0
  126.       if bb.top[index] < myVolume[index] and bb.bot[index-1] < myVolume[index-1] and bb.top[index-1] > myVolume[index-1]:
  127.         for i in 1..24:
  128.           if this[index-i] > 99.0:
  129.             return 0.0
  130.         return 100.0
  131.       return 0.0    
  132.    
  133.     var result = getCustomIndicator(candles, update5, "result")
  134.      
  135.     if (result[^1] > 99) and (result[^2] < 99):
  136.       #buy(monitor, candles[^1])
  137.       echo "! " & monitor.name
  138.  
  139.   if needSell and not order.isOpen:
  140.     let close = monitor.candles[^1]
  141.     sell(order.marketName, buyRate * 1.055)
  142.  
  143. #[proc trader(monitor: CandlesMonitor) =
  144.   if monitor.interval != oneMin: return
  145.   if not needSell:
  146.     let close = monitor.candles[^1]
  147.     var keltnerBot: float
  148.     for m in monitors:
  149.       if (m.name == monitor.name) and (m.interval == thirtyMin):
  150.         keltnerBot = getKeltnerChannel(m.candles, 50, 5).bot[^1]
  151.     if close <= keltnerBot:
  152.       buy(monitor, close)
  153.  
  154.   if needSell and not order.isOpen and order.marketName == monitor.name:
  155.     let close = monitor.candles[^1]
  156.     sell(monitor, buyRate * 1.015)]#
  157.        
  158. #[
  159. proc setSellState(marketName: string) =
  160.   # Оставляем только один маркет, на котором надо продать
  161.   markets = newSeq[Market]()
  162.   markets.add(newMarket(marketName))
  163.   current = markets[0]
  164.   # Отменяем ордер на продажу, если есть
  165.   # TODO
  166.   # Находим инфу по покупке
  167.   let order = getOrderHistory(marketname)[0]
  168.   if (order.exchange == marketName) and (order.orderType == "limit_buy"):
  169.     needSell = true
  170.     buyRate = order.rate
  171.     updateBalance()
  172.     echo "Forced sell: ", current.name, ". Buy rate: ", formatFloat(buyRate, ffDecimal, 8)
  173.  
  174.    
  175. ###############################################################################
  176.  
  177. for kind, key, val in getopt():
  178.   if kind == cmdArgument:
  179.     setSellState(key.toLowerAscii)]#
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement