语言切换

CrossArbitrage代码讲解

[复制链接]
小志 发表于 2020-7-8 11:00:56 | 显示全部楼层 |阅读模式
小志
2020-7-8 11:00:56 769 3 看全部
首先,根据传入参数获得交易所、三个交易对、仓位、获利币种、初始余额,然后从数据库获取该网站每个交易对的成交量小数位数、最低成交量、最低成交金额、买卖手续费费率。之后再通过我们的WebSocketAPI接口获取到三个交易对的最新市场价格以及交易量同时返回插入该数据的时间,如果数据超过4分钟没有更新的话就不会继续进行套利,什么时候数据更新了什么时候继续套利。最后按照获利币种分为三大块,每个获利币种有两种循环套利,正循环和逆循环,当前市场行情符合哪种套利模式就用哪种。进入到里面后会判断交易对计价币种当前是否有余额,如果有余额按照余额乘以仓位算出可用余额,再除以交易对价格算出可交易量,再与另两个交易对可交易量比较,选用较小的交易量,按照该交易量进行运算并且把计算出的手续费转换成盈利币种进行最后的盈利计算,如果可以盈利按照算出的各个值进行下单,不可以盈利则返回错误信息。

  1. --LuaDBScript(BMT_CrossArbitrage_003)
  2. --三角套利
  3. require("BMT_CORE")
  4. local aa = dbhelper('BMT')
  5. --汇率转换
  6. local marketTag=MarketPrice('local')
  7. --交易所
  8. local jys1=:<InputStr.jys1>
  9. local jys2=:<InputStr.jys2>
  10. local jys3=:<InputStr.jys3>
  11. local a=exchange(jys1)
  12. local b=exchange(jys2)
  13. local c=exchange(jys3)
  14. --进行三角套利的交易对1(交易对3的计价币种和这个交易对的计数币种一致,计价币种和交易对2的计价币种一致)
  15. local symbol1=:<InputStr.symbol1>
  16. --进行三角套利的交易对2(交易对3的计数币种和这个交易对的计数币种一致,计价币种和交易对1的计价币种一致)
  17. local symbol2=:<InputStr.symbol2>
  18. --进行三角套利的交易对3
  19. local symbol3=:<InputStr.symbol3>
  20. --仓位
  21. local FreightSpace=tonumber(:<InputStr.FreightSpace>)
  22. --获利币种
  23. local ProfitCurrency=string.lower(:<InputStr.ProfitCurrency>)
  24. --机器人id
  25. local robotID='CrossArbitrageRobot'
  26. local list=lua_string_split(symbol3,'/')
  27. local base3=string.lower(list[1])
  28. local quote3=string.lower(list[2])
  29. local symbol3=base3..quote3
  30. local list=lua_string_split(symbol2,'/')
  31. local base2=string.lower(list[1])
  32. local quote2=string.lower(list[2])
  33. local symbol2=base2..quote2
  34. local list=lua_string_split(symbol1,'/')
  35. local base1=string.lower(list[1])
  36. local quote1=string.lower(list[2])
  37. local symbol1=base1..quote1
  38. --初始余额
  39. local balance=:<InputStr.balance>
  40. local list=lua_string_split(balance,',')
  41. local base3_balance=list[1]
  42. local quote3_balance=list[2]
  43. local quote2_balance=list[3]
  44. --base3初始余额
  45. local list=lua_string_split(base3_balance,'=')
  46. local balance_base3=tonumber(list[2])
  47. local FreightSpaceBalance3=balance_base3*FreightSpace
  48. balance_base3=balance_base3-FreightSpaceBalance3
  49. local t3=c:wsGetBalance(base3)
  50. if tonumber(t3[1]['available']) < balance_base3 then
  51.         error('下单余额已超过仓位限制')
  52. end
  53. --quote3初始余额
  54. local list=lua_string_split(quote3_balance,'=')
  55. local balance_quote3=tonumber(list[2])
  56. local FreightSpaceBalance3=balance_quote3*FreightSpace
  57. balance_quote3=balance_quote3-FreightSpaceBalance3
  58. local t2=c:wsGetBalance(quote3)
  59. if tonumber(t2[1]['available']) < balance_quote3 then
  60.         error('下单余额已超过仓位限制')
  61. end
  62. --quote2初始余额
  63. local list=lua_string_split(quote2_balance,'=')
  64. local balance_quote2=tonumber(list[2])
  65. local FreightSpaceBalance3=balance_quote2*FreightSpace
  66. balance_quote2=balance_quote2-FreightSpaceBalance3
  67. local t1=b:wsGetBalance(quote2)
  68. if tonumber(t1[1]['available']) < balance_quote2 then
  69.         error('下单余额已超过仓位限制')
  70. end
  71. --从数据库读取交易所下单所需数据
  72. local t1=GettingData(jys1,symbol1)
  73. --小数位数
  74. local DecimalDigits11=t1.DecimalDigits
  75. --最低成交量
  76. local MinimalAmount1=t1.MinimalAmount
  77. --最低成交额
  78. local MinimalMoney1=t1.MinimalMoney
  79. local t2=GettingData(jys2,symbol2)
  80. local DecimalDigits22=t2.DecimalDigits
  81. local MinimalAmount2=t2.MinimalAmount
  82. local MinimalMoney2=t2.MinimalMoney
  83. local t3=GettingData(jys3,symbol3)
  84. local DecimalDigits33=t3.DecimalDigits
  85. local MinimalAmount3=t3.MinimalAmount
  86. local MinimalMoney3=t3.MinimalMoney
  87. --交易对1买卖手续费
  88. local tt1=GettingData(jys1,symbol1)
  89. local SCbuy1=tt1.BuyServiceCharge
  90. local SCsell1=tt1.SellServiceCharge
  91. --交易对2买卖手续费
  92. local tt2=GettingData(jys2,symbol2)
  93. local SCbuy2=tt2.BuyServiceCharge
  94. local SCsell2=tt2.SellServiceCharge
  95. --交易对3买卖手续费
  96. local tt3=GettingData(jys3,symbol3)
  97. local SCbuy3=tt3.BuyServiceCharge
  98. local SCsell3=tt3.SellServiceCharge
  99. local ts=0
  100. local ts1=0
  101. local difference=0
  102. --交易对1的市场价格和交易量
  103. local table1=a:wsGetEveryMarket(symbol1)
  104. ts=os.time()
  105. ts1=tonumber(string.sub(table1[1]['ts'],1,10))
  106. difference=ts-ts1
  107. if difference>240 then
  108.         difference=difference-240
  109.         error('Data out of date,'..difference..'second')
  110. end
  111. local price1=tonumber(table1[1]['sell'])
  112. local vol1=tonumber(table1[1]['sellsize'])
  113. local price11=tonumber(table1[1]['buy'])
  114. local vol11=tonumber(table1[1]['buysize'])
  115. --交易对2的市场价格和交易量
  116. local table2=b:wsGetEveryMarket(symbol2)
  117. ts=os.time()
  118. ts1=tonumber(string.sub(table2[1]['ts'],1,10))
  119. difference=ts-ts1
  120. if difference>240 then
  121.         difference=difference-240
  122.         error('Data out of date,'..difference..'second')
  123. end
  124. local price2=tonumber(table2[1]['sell'])
  125. local vol2=tonumber(table2[1]['sellsize'])
  126. local price22=tonumber(table2[1]['buy'])
  127. local vol22=tonumber(table2[1]['buysize'])
  128. --交易对3的市场价格和交易量
  129. local table3=c:wsGetEveryMarket(symbol3)
  130. ts=os.time()
  131. ts1=tonumber(string.sub(table3[1]['ts'],1,10))
  132. difference=ts-ts1
  133. if difference>240 then
  134.         difference=difference-240
  135.         error('Data out of date,'..difference..'second')
  136. end
  137. local price3=tonumber(table3[1]['sell'])
  138. local vol3=tonumber(table3[1]['sellsize'])
  139. local price33=tonumber(table3[1]['buy'])
  140. local vol33=tonumber(table3[1]['buysize'])
  141. --最终盈利
  142. local FinalProfit=0
  143. try
  144.         if ProfitCurrency==quote2 then--usdt
  145.                 if price3 < price22/price1 then
  146.                         local table3=c:wsGetBalance(quote3)
  147.                         if #table3==0 or table3[1]['available']==0 then error(jys3..'of'..quote3..',There is no available balance in the currency') end
  148.                         --交易对3传入仓位计算出的可用余额
  149.                         local balance3=table3[1]['available']*FreightSpace
  150.                         --交易对3可以交易的数量
  151.                         local number3=GetPreciseDecimal(balance3/price3,DecimalDigits33)
  152.                         if number3 > vol3 then
  153.                                 volume=vol3
  154.                         elseif number3 < vol3 then
  155.                                 volume=number3
  156.                         elseif number3 == vol3 then
  157.                                 volume=number3
  158.                         end
  159.                         --保留几位小数
  160.                         volume=GetPreciseDecimal(volume,DecimalDigits33)
  161.                         local table1=a:wsGetBalance(quote1)
  162.                         if #table1==0 or table1[1]['available']==0 then error(jys1..'of'..quote1..',There is no available balance in the currency') end
  163.                         --交易对1传入仓位计算出的可用余额
  164.                         local balance1=table1[1]['available']*FreightSpace
  165.                         --交易对1可以交易的数量
  166.                         local number1=GetPreciseDecimal(balance1/price1,DecimalDigits11)
  167.                         if number1 < volume*price3 then
  168.                                 --现有仓位余额不足以进行此交易量下单,所以需要根据可用余额更改交易量
  169.                                 volume=number1/pirce3
  170.                                 volume=GetPreciseDecimal(volume,DecimalDigits11)
  171.                         end
  172.                         local table2=b:wsGetBalance(base2)
  173.                         if #table2==0 or table2[1]['available']==0 then error(jys2..'of'..base2..',There is no available balance in the currency') end
  174.                         --交易对2传入仓位计算出的可用余额
  175.                         local balance2=table2[1]['available']*FreightSpace
  176.                         --交易对2可以交易的数量
  177.                         local number2=GetPreciseDecimal(balance2,DecimalDigits22)
  178.                         if number2 < volume then
  179.                                 --现有仓位余额不足以进行此交易量下单,所以需要根据可用余额更改交易量
  180.                                 volume=number2
  181.                                 volume=GetPreciseDecimal(volume,DecimalDigits22)
  182.                         end
  183.                         --local ssss=price1*volume*(price22/price1 - price3)
  184.                         --1下买单对应参数(交易对3)xrpbtc
  185.                         local volume3=GetPreciseDecimal(volume,DecimalDigits33)
  186.                         if MinimalAmount3 > volume3 then error('交易所规定的最小下单量为:'..MinimalAmount3..base3..',请您适当调高仓位') end
  187.                         local expenditure3=price3*volume3
  188.                         if MinimalMoney3 > expenditure3 then error('交易所规定的最小下单金额为:'..MinimalMoney3..quote3..',请您适当调高仓位') end
  189.                         if SCbuy3 >= 0 then
  190.                                 --交易对3下买单手续费转换成usdt
  191.                                 SC3=expenditure3*SCbuy3
  192.                         elseif SCbuy3 < 0 then
  193.                                 --交易对3下买单手续费
  194.                                 SC3=Math.abs(SCbuy3)
  195.                         end
  196.                         --2下买单对应参数(交易对1)btcusdt
  197.                         local volume1=GetPreciseDecimal(expenditure3,DecimalDigits11,1)
  198.                         if MinimalAmount1 > volume1 then error('交易所规定的最小下单量为:'..MinimalAmount1..base1..',请您适当调高仓位') end
  199.                         local expenditure1=price1*volume1
  200.                         if MinimalMoney1 > expenditure1 then error('交易所规定的最小下单金额为:'..MinimalMoney1..quote1..',请您适当调高仓位') end
  201.                         if SCbuy1 >= 0 then
  202.                                 --交易对1下买单手续费
  203.                                 SC1=expenditure1*SCbuy1
  204.                         elseif SCbuy1 < 0 then
  205.                                 SC1=Math.abs(SCbuy1)
  206.                         end
  207.                         --3下卖单对应参数(交易对2)xrpusdt
  208.                         local volume2=GetPreciseDecimal(volume3,DecimalDigits22)
  209.                         if MinimalAmount2 > volume2 then error('交易所规定的最小下单量为:'..MinimalAmount2..base2) end
  210.                         local acquire2=price22*volume2
  211.                         if MinimalMoney2 > acquire2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote2..',请您适当调高仓位') end
  212.                         if SCsell2 >= 0 then
  213.                                 --交易对2下卖单手续费
  214.                                 SC2=acquire2*SCsell2
  215.                         elseif SCsell2 < 0 then
  216.                                 SC2=Math.abs(SCsell2)
  217.                         end
  218.                         local profit=acquire2-expenditure1
  219.                         --手续费转换成以盈利币种计算
  220.                         SC3=SC3*price1
  221.                         FinalProfit=profit-(SC3+SC1+SC2)
  222.                         luadb.log(symbol3..'下买单交易量为:'..volume3..',单价为:'..price3)
  223.                         luadb.log(symbol1..'下买单交易量为:'..volume1..',单价为:'..price1)
  224.                         luadb.log(symbol2..'下卖单交易量为:'..volume2..',单价为:'..price22)
  225.                         luadb.log(symbol3..'下买单手续费转换成'..ProfitCurrency..'为:'..SC3)
  226.                         luadb.log(symbol1..'下买单手续费为:'..SC1)
  227.                         luadb.log(symbol2..'下卖单手续费为:'..SC2)
  228.                         luadb.log('获利币种('..ProfitCurrency..')金额不减手续费为:'..profit)
  229.                         luadb.log('获利币种('..ProfitCurrency..')金额减去手续费为:'..FinalProfit)
  230.                         if FinalProfit > 0 then
  231.                                 local timestamp=os.time()
  232.                                 luadb.log('1下买单了')
  233.                                 local c_orderid=c:placeBuyOrder(symbol3,volume3,price3,robotID,timestamp)
  234.                                 luadb.log('1下单完成')
  235.                                 luadb.log('2下买单了')
  236.                                 local a_orderid=a:placeBuyOrder(symbol1,volume1,price1,robotID,timestamp)
  237.                                 luadb.log('2下单完成')
  238.                                 luadb.log('3下卖单了')
  239.                                 local b_orderid=b:placeSellOrder(symbol2,volume2,price22,robotID,timestamp)
  240.                                 luadb.log('3下单完成')
  241.                         else
  242.                                 error('The profit is less than 0')
  243.                         end
  244.                 elseif price33 > price2/price11  then
  245.                         local table3=c:wsGetBalance(base3)
  246.                         if #table3==0 or table3[1]['available']==0 then error(jys3..'of'..base3..',There is no available balance in the currency') end
  247.                         --交易对3传入仓位计算出的可用余额
  248.                         local balance3=table3[1]['available']*FreightSpace
  249.                         --交易对3可以交易的数量
  250.                         local number3=GetPreciseDecimal(balance3,DecimalDigits33)
  251.                         if number3 > vol33 then
  252.                                 volume=vol33
  253.                         elseif number3 < vol33 then
  254.                                 volume=number3
  255.                         elseif number3 == vol33 then
  256.                                 volume=number3
  257.                         end
  258.                         volume=GetPreciseDecimal(volume,DecimalDigits33)
  259.                         local table2=b:wsGetBalance(quote2)
  260.                         if #table2==0 or table2[1]['available']==0 then error(jys2..'of'..quote2..',There is no available balance in the currency') end
  261.                         --交易对2传入仓位计算出的可用余额
  262.                         local balance2=table2[1]['available']*FreightSpace
  263.                         --交易对2可以交易的数量
  264.                         local number2=GetPreciseDecimal(balance2/price2,DecimalDigits22)
  265.                         if number2 < volume then
  266.                                 volume=number2
  267.                                 volume=GetPreciseDecimal(volume,DecimalDigits22)
  268.                         end
  269.                         local table1=a:wsGetBalance(base1)
  270.                         if #table1==0 or table1[1]['available']==0 then error(jys1..'of'..base1..',There is no available balance in the currency') end
  271.                         --交易对1传入仓位计算出的可用余额
  272.                         local balance1=table1[1]['available']*FreightSpace
  273.                         --交易对1可以交易的数量
  274.                         local number1=GetPreciseDecimal(balance1,DecimalDigits11)
  275.                         if number1 < price33*volume then
  276.                                 volume=number1/price33
  277.                                 volume=GetPreciseDecimal(volume,DecimalDigits11)
  278.                         end
  279.                         --local ssss=price11*volume*(price33 - price2/price11)
  280.                         --4下卖单对应参数(交易对3)xrpbtc
  281.                         local volume3=GetPreciseDecimal(volume,DecimalDigits33)
  282.                         if MinimalAmount3 > volume3 then error('交易所规定的最小下单量为:'..MinimalAmount3..base3..',请您适当调高仓位') end
  283.                         local acquire3=price33*volume3
  284.                         if MinimalMoney3 > acquire3 then error('交易所规定的最小下单金额为:'..MinimalMoney3..quote3..',请您适当调高仓位') end
  285.                         --交易对3下卖单手续费
  286.                         if SCsell3 >= 0 then
  287.                                 SC3=acquire3*SCsell3
  288.                         elseif SCsell3 < 0 then
  289.                                 SC3=Math.abs(SCsell3)
  290.                         end
  291.                         --5下买单对应参数(交易对2)xrpusdt
  292.                         local volume2=GetPreciseDecimal(volume3,DecimalDigits22)
  293.                         if MinimalAmount2 > volume2 then error('交易所规定的最小下单量为:'..MinimalAmount2..base2..',请您适当调高仓位') end
  294.                         local expenditure2=price2*volume2
  295.                         if MinimalMoney2 > expenditure2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote2..',请您适当调高仓位') end
  296.                         --交易对2下买单手续费
  297.                         if SCbuy2 >= 0 then
  298.                                 SC2=expenditure2*SCbuy2
  299.                         else
  300.                                 SC2=Math.abs(SCbuy2)
  301.                         end
  302.                         --6下卖单对应参数(交易对1)btcusdt
  303.                         local volume1=GetPreciseDecimal(acquire3,DecimalDigits11,1)
  304.                         if MinimalAmount1 > volume1 then error('交易所规定的最小下单量为:'..MinimalAmount1..base1..',请您适当调高仓位') end
  305.                         local acquire1=price11*volume1
  306.                         if MinimalMoney1 > acquire1 then error('交易所规定的最小下单金额为:'..MinimalMoney1..quote1..',请您适当调高仓位') end
  307.                         --交易对1下卖单手续费
  308.                         if SCsell1 >= 0 then
  309.                                 SC1=acquire1*SCsell1
  310.                         else
  311.                                 SC1=Math.abs(SCsell1)
  312.                         end
  313.                         local profit=acquire1-expenditure2
  314.                         --手续费转换成以盈利币种计算
  315.                         SC3=SC3*price11
  316.                         FinalProfit=profit-(SC3+SC1+SC2)
  317.                         luadb.log(symbol3..'下卖单交易量为:'..volume3..',单价为:'..price33)
  318.                         luadb.log(symbol2..'下买单交易量为:'..volume2..',单价为:'..price2)
  319.                         luadb.log(symbol1..'下卖单交易量为:'..volume1..',单价为:'..price11)
  320.                         luadb.log(symbol3..'下卖单手续费转换成'..ProfitCurrency..'为:'..SC3)
  321.                         luadb.log(symbol2..'下买单手续费转换成人民币为:'..SC2)
  322.                         luadb.log(symbol1..'下卖单手续费转换成人民币为:'..SC1)
  323.                         luadb.log('获利币种('..ProfitCurrency..')金额不减手续费为:'..profit)
  324.                         luadb.log('获利币种('..ProfitCurrency..')金额减去手续费为:'..FinalProfit)
  325.                         if FinalProfit > 0 then
  326.                                 local timestamp=os.time()
  327.                                 luadb.log('4下卖单了')
  328.                                 local c_orderid=c:placeSellOrder(symbol3,volume3,price33,robotID,timestamp)
  329.                                 luadb.log('4下单完成')
  330.                                 luadb.log('5下买单了')
  331.                                 local b_orderid=b:placeBuyOrder(symbol2,volume2,price2,robotID,timestamp)
  332.                                 luadb.log('5下单完成')
  333.                                 luadb.log('6下卖单了')
  334.                                 local a_orderid=a:placeSellOrder(symbol1,volume1,price11,robotID,timestamp)
  335.                                 luadb.log('6下单完成')
  336.                         else
  337.                                 error('获利金额小于0')
  338.                         end
  339.                 end
  340.         elseif ProfitCurrency==quote3 then--btc
  341.                 if price3 < price22/price1 then
  342.                         local table2=b:wsGetBalance(base2)
  343.                         if #table2==0 or table2[1]['available']==0 then error(jys2..'of'..base2..',There is no available balance in the currency') end
  344.                         --交易对2传入仓位计算出的可用余额
  345.                         local balance2=table2[1]['available']*FreightSpace
  346.                         --交易对2可以交易的数量
  347.                         local number2=GetPreciseDecimal(balance2,DecimalDigits22)
  348.                         if number2 > vol22 then
  349.                                 volume=vol22
  350.                         elseif number2 < vol22 then
  351.                                 volume=number2
  352.                         elseif number3 == vol22 then
  353.                                 volume=number2
  354.                         end
  355.                         --保留小数点后两位
  356.                         volume=GetPreciseDecimal(volume,DecimalDigits22)
  357.                         local table3=c:wsGetBalance(quote3)
  358.                         if #table3==0 or table3[1]['available']==0 then error(jys3..'of'..quote3..',There is no available balance in the currency') end
  359.                         --交易对3传入仓位计算出的可用余额
  360.                         local balance3=table3[1]['available']*FreightSpace
  361.                         --交易对3可以交易的数量
  362.                         local number3=GetPreciseDecimal(balance3/price3,DecimalDigits33)
  363.                         if number3 < volume then
  364.                                 volume=number3
  365.                                 --保留小数点后两位
  366.                                 volume=GetPreciseDecimal(volume,DecimalDigits33)
  367.                         end
  368.                         local table1=a:wsGetBalance(quote1)
  369.                         if #table1==0 or table1[1]['available']==0 then error(jys1..'of'..quote1..',There is no available balance in the currency') end
  370.                         --交易对1传入仓位计算出的可用余额
  371.                         local balance1=table1[1]['available']*FreightSpace
  372.                         --交易对1可以交易的数量
  373.                         local number1=GetPreciseDecimal(balance1/price1,DecimalDigits11)
  374.                         if number1 < price22*volume/price1 then
  375.                                 volume=number1*price1/price22
  376.                                 --保留小数点后两位
  377.                                 volume=GetPreciseDecimal(volume,DecimalDigits11)
  378.                         end
  379.                         --local ssss=(price22/price1 - price3)*volume
  380.                         --7下卖单对应参数(交易对2)xrpusdt
  381.                         local volume2=GetPreciseDecimal(volume,DecimalDigits22)
  382.                         if MinimalAmount2 > volume2 then error('交易所规定的最小下单量为:'..MinimalAmount2..base2..',请您适当调高仓位') end
  383.                         local acquire2=price22*volume2
  384.                         if MinimalMoney2 > acquire2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote2..',请您适当调高仓位') end
  385.                         --交易对2下卖单手续费
  386.                         if SCsell2 >= 0 then
  387.                                 SC2=acquire2*SCsell2
  388.                         else
  389.                                 SC2=Math.abs(SCsell2)
  390.                         end
  391.                         --8下买单对应参数(交易对3)xrpbtc
  392.                         local volume3=GetPreciseDecimal(volume2,DecimalDigits33)
  393.                         if MinimalAmount3 > volume3 then error('交易所规定的最小下单量为:'..MinimalAmount3..base3..',请您适当调高仓位') end
  394.                         local expenditure3=price3*volume3
  395.                         if MinimalMoney3 > expenditure3 then error('交易所规定的最小下单金额为:'..MinimalMoney3..quote3..',请您适当调高仓位') end
  396.                         --交易对3下买单手续费
  397.                         if SCbuy3 >= 0 then
  398.                                 SC3=expenditure3*SCbuy3
  399.                         else
  400.                                 SC3=Math.abs(SCbuy3)
  401.                         end
  402.                         --9下买单对应参数(交易对1)btcusdt
  403.                         local volume1=GetPreciseDecimal(acquire2/price1,DecimalDigits11,1)
  404.                         if MinimalAmount1 > volume1 then error('交易所规定的最小下单量为:'..MinimalAmount1..base1..',请您适当调高仓位') end
  405.                         local expenditure2=price1*volume1
  406.                         if MinimalMoney2 > expenditure2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote1..',请您适当调高仓位') end
  407.                         --交易对1下买单手续费
  408.                         if SCbuy1 >= 0 then
  409.                                 SC1=expenditure2*SCbuy1
  410.                         else
  411.                                 SC1=Math.abs(SCbuy1)
  412.                         end
  413.                         local profit=volume1-expenditure3
  414.                         --手续费转换成以盈利币种计算
  415.                         SC2=SC2/price1
  416.                         SC1=SC1/price1
  417.                         FinalProfit=profit-(SC3+SC1+SC2)
  418.                         luadb.log(symbol2..'下卖单交易量为:'..volume2..',单价为:'..price22)
  419.                         luadb.log(symbol3..'下买单交易量为:'..volume3..',单价为:'..price3)
  420.                         luadb.log(symbol1..'下买单交易量为:'..volume1..',单价为:'..price1)
  421.                         luadb.log(symbol2..'下卖单手续费转换成'..ProfitCurrency..'为:'..SC2)
  422.                         luadb.log(symbol3..'下买单手续费转换成'..ProfitCurrency..'为:'..SC3)
  423.                         luadb.log(symbol1..'下买单手续费转换成'..ProfitCurrency..'为:'..SC1)
  424.                         luadb.log('获利币种('..ProfitCurrency..')金额不减手续费为:'..profit)
  425.                         luadb.log('获利币种('..ProfitCurrency..')金额减去手续费为:'..FinalProfit)
  426.                         if FinalProfit > 0 then
  427.                                 local timestamp=os.time()
  428.                                 luadb.log('7下卖单了')
  429.                                 local b_orderid=b:placeSellOrder(symbol2,volume2,price22,robotID,timestamp)
  430.                                 luadb.log('7下单完成')
  431.                                 luadb.log('8下买单了')
  432.                                 local c_orderid=c:placeBuyOrder(symbol3,volume3,price3,robotID,timestamp)
  433.                                 luadb.log('8下单完成')
  434.                                 luadb.log('9下买单了')
  435.                                 local a_orderid=a:placeBuyOrder(symbol1,volume1,price1,robotID,timestamp)
  436.                                 luadb.log('9下单完成')
  437.                         else
  438.                                 error('获利金额小于0')
  439.                         end
  440.                 elseif price33 > price2/price11 then
  441.                         local table2=b:wsGetBalance(quote2)
  442.                         if #table2==0 or table2[1]['available']==0 then error(jys2..'of'..quote2..',There is no available balance in the currency') end
  443.                         --交易对2传入仓位计算出的可用余额
  444.                         local balance2=table2[1]['available']*FreightSpace
  445.                         --交易对2可以交易的数量
  446.                         local number2=GetPreciseDecimal(balance2/price2,DecimalDigits22)
  447.                         if number2 > vol2 then
  448.                                 volume=vol2
  449.                         elseif number2 < vol2 then
  450.                                 volume=number2
  451.                         elseif number3 == vol2 then
  452.                                 volume=number2
  453.                         end
  454.                         --保留小数点后两位
  455.                         volume=GetPreciseDecimal(volume,DecimalDigits22)
  456.                         local table1=a:wsGetBalance(base1)
  457.                         if #table1==0 or table1[1]['available']==0 then error(jys1..'of'..base1..',There is no available balance in the currency') end
  458.                         --交易对1传入仓位计算出的可用余额
  459.                         local balance1=table1[1]['available']*FreightSpace
  460.                         --交易对1可以交易的数量
  461.                         local number1=GetPreciseDecimal(balance1,DecimalDigits11)
  462.                         if number1 < price2*volume/price11 then
  463.                                 volume=number1*price11/price2
  464.                                 --保留小数点后两位
  465.                                 volume=GetPreciseDecimal(volume,DecimalDigits11)
  466.                         end
  467.                         local table3=c:wsGetBalance(base3)
  468.                         if #table3==0 or table3[1]['available']==0 then error(jys3..'of'..base3..',There is no available balance in the currency') end
  469.                         --交易对3传入仓位计算出的可用余额
  470.                         local balance3=table3[1]['available']*FreightSpace
  471.                         --交易对3可以交易的数量
  472.                         local number3=GetPreciseDecimal(balance3,DecimalDigits33)
  473.                         if number3 < volume then
  474.                                 volume=number3
  475.                                 --保留小数点后两位
  476.                                 volume=GetPreciseDecimal(volume,DecimalDigits33)
  477.                         end
  478.                         --local ssss=(price33 - price2/price11)*volume
  479.                         --10下买单对应参数(交易对2)xrpusdt
  480.                         local volume2=GetPreciseDecimal(volume,DecimalDigits22)
  481.                         if MinimalAmount2 > volume2 then error('交易所规定的最小下单量为:'..MinimalAmount2..base2..',请您适当调高仓位') end
  482.                         local expenditure2=price2*volume2
  483.                         if MinimalMoney2 > expenditure2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote2..',请您适当调高仓位') end
  484.                         --交易对2下买单手续费
  485.                         if SCbuy2 >= 0 then
  486.                                 SC2=expenditure2*SCbuy2
  487.                         else
  488.                                 SC2=Math.abs(SCbuy2)
  489.                         end
  490.                         --11下卖单对应参数(交易对1)btcusdt
  491.                         local volume1=GetPreciseDecimal(expenditure2/price11,DecimalDigits11,1)
  492.                         if MinimalAmount1 > volume1 then error('交易所规定的最小下单量为:'..MinimalAmount1..base1..',请您适当调高仓位') end
  493.                         local acquire1=price11*volume1
  494.                         if MinimalMoney1 > acquire1 then error('交易所规定的最小下单金额为:'..MinimalMoney1..quote1..',请您适当调高仓位') end
  495.                         --交易对1下卖单手续费
  496.                         if SCsell1 >= 0 then
  497.                                 SC1=acquire1*SCsell1
  498.                         else
  499.                                 SC1=Math.abs(SCsell1)
  500.                         end
  501.                         --12下卖单对应参数(交易对3)xrpbtc
  502.                         local volume3=GetPreciseDecimal(volume2,DecimalDigits33)
  503.                         if MinimalAmount3 > volume3 then error('交易所规定的最小下单量为:'..MinimalAmount3..base3..',请您适当调高仓位') end
  504.                         local acquire3=price33*volume3
  505.                         if MinimalMoney3 > acquire3 then error('交易所规定的最小下单金额为:'..MinimalMoney3..quote3..',请您适当调高仓位') end
  506.                         --交易对3下卖单手续费
  507.                         if SCsell3 >= 0 then
  508.                                 SC3=acquire3*SCsell3
  509.                         else
  510.                                 SC3=Math.abs(SCsell3)
  511.                         end
  512.                         local profit=acquire3-volume1
  513.                         --手续费转换成以盈利币种计算
  514.                         SC2=SC2/price11
  515.                         SC1=SC1/price11
  516.                         FinalProfit=profit-(SC3+SC1+SC2)
  517.                         luadb.log(symbol2..'下买单交易量为:'..volume2..',单价为:'..price2)
  518.                         luadb.log(symbol1..'下卖单交易量为:'..volume1..',单价为:'..price11)
  519.                         luadb.log(symbol3..'下卖单交易量为:'..volume3..',单价为:'..price33)
  520.                         luadb.log(symbol2..'下买单手续费转换成'..ProfitCurrency..'为:'..SC2)
  521.                         luadb.log(symbol1..'下卖单手续费转换成'..ProfitCurrency..'为:'..SC1)
  522.                         luadb.log(symbol3..'下卖单手续费转换成'..ProfitCurrency..'为:'..SC3)
  523.                         luadb.log('获利币种('..ProfitCurrency..')金额不减手续费为:'..profit)
  524.                         luadb.log('获利币种('..ProfitCurrency..')金额减去手续费为:'..FinalProfit)
  525.                         if FinalProfit > 0 then
  526.                                 local timestamp=os.time()
  527.                                 luadb.log('10下买单了')
  528.                                 local b_orderid=b:placeBuyOrder(symbol2,volume2,price2,robotID,timestamp)
  529.                                 luadb.log('10下单完成')
  530.                                 luadb.log('11下卖单了')
  531.                                 local a_orderid=a:placeSellOrder(symbol1,volume1,price11,robotID,timestamp)
  532.                                 luadb.log('11下单完成')
  533.                                 luadb.log('12下卖单了')
  534.                                 local c_orderid=c:placeSellOrder(symbol3,volume3,price33,robotID,timestamp)
  535.                                 luadb.log('12下单完成')
  536.                         else
  537.                                 error('获利金额小于0')
  538.                         end
  539.                 end
  540.         elseif ProfitCurrency==base3 then--xrp
  541.                 if price3 < price22/price1 then
  542.                         local table3=c:wsGetBalance(quote3)
  543.                         if #table3==0 or table3[1]['available']==0 then error(jys3..'of'..quote3..',There is no available balance in the currency') end
  544.                         --交易对3传入仓位计算出的可用余额
  545.                         local balance3=table3[1]['available']*FreightSpace
  546.                         --交易对3可以交易的数量
  547.                         local number3=GetPreciseDecimal(balance3/price3,DecimalDigits33)
  548.                         if number3 > vol3 then
  549.                                 volume=vol3
  550.                         elseif number3 < vol3 then
  551.                                 volume=number3
  552.                         elseif number3 == vol3 then
  553.                                 volume=number3
  554.                         end
  555.                         --保留小数点后两位
  556.                         volume=GetPreciseDecimal(volume,DecimalDigits33)
  557.                         local table1=a:wsGetBalance(quote1)
  558.                         if #table1==0 or table1[1]['available']==0 then error(jys1..'of'..quote1..',There is no available balance in the currency') end
  559.                         --交易对1传入仓位计算出的可用余额
  560.                         local balance1=table1[1]['available']*FreightSpace
  561.                         --交易对1可以交易的数量
  562.                         local number1=GetPreciseDecimal(balance1/price1,DecimalDigits11)
  563.                         if number1 < volume*price3 then
  564.                                 volume=number1/price3
  565.                                 --保留小数点后两位
  566.                                 volume=GetPreciseDecimal(volume,DecimalDigits11)
  567.                         end
  568.                         local table2=b:wsGetBalance(base2)
  569.                         if #table2==0 or table2[1]['available']==0 then error(jys2..'of'..base2..',There is no available balance in the currency') end
  570.                         --交易对2传入仓位计算出的可用余额
  571.                         local balance2=table2[1]['available']*FreightSpace
  572.                         --交易对2可以交易的数量
  573.                         local number2=GetPreciseDecimal(balance2,DecimalDigits22)
  574.                         if number2 < price3*volume*price1/price22 then
  575.                                 volume=numer2*price22/price1/price3
  576.                                 --保留小数点后两位
  577.                                 volume=GetPreciseDecimal(volume,DecimalDigits22)
  578.                         end
  579.                         --local ssss=volume*price1/price22*(price22/price1 - price3)
  580.                         --13下买单对应参数(交易对3)xrpbtc
  581.                         local volume3=GetPreciseDecimal(volume,DecimalDigits33)
  582.                         if MinimalAmount3 > volume3 then error('交易所规定的最小下单量为:'..MinimalAmount3..base3..',请您适当调高仓位') end
  583.                         local expenditure3=price3*volume3
  584.                         if MinimalMoney3 > expenditure3 then error('交易所规定的最小下单金额为:'..MinimalMoney3..quote3..',请您适当调高仓位') end
  585.                         --交易对3下买单手续费
  586.                         if SCbuy3 >= 0 then
  587.                                 SC3=expenditure3*SCbuy3
  588.                         else
  589.                                 SC3=Math.abs(SCbuy3)
  590.                         end
  591.                         --14下买单对应参数(交易对1)btcusdt
  592.                         local volume1=GetPreciseDecimal(expenditure3,DecimalDigits11,1)
  593.                         if MinimalAmount1 > volume1 then error('交易所规定的最小下单量为:'..MinimalAmount1..base1..',请您适当调高仓位') end
  594.                         local expenditure1=price1*volume1
  595.                         if MinimalMoney1 > expenditure1 then error('交易所规定的最小下单金额为:'..MinimalMoney1..quote1..',请您适当调高仓位') end
  596.                         --交易对1下买单手续费
  597.                         if SCbuy1 >= 0 then
  598.                                 SC1=expenditure1*SCbuy1
  599.                         else
  600.                                 SC1=Math.abs(SCbuy1)
  601.                         end
  602.                         --15下卖单对应参数(交易对2)xrpusdt
  603.                         local volume2=GetPreciseDecimal(expenditure1/price22,DecimalDigts22,1)
  604.                         if MinimalAmount2 > volume2 then error('交易所规定的最小下单量为:'..MinimalAmount2..base2..',请您适当调高仓位') end
  605.                         local acquire2=price22*volume2
  606.                         if MinimalMoney2 > acquire2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote2..',请您适当调高仓位') end
  607.                         --交易对2下卖单手续费
  608.                         if SCsell2 >= 0 then
  609.                                 SC2=acquire2*SCsell2
  610.                         else
  611.                                 SC2=Math.abs(SCsell2)
  612.                         end
  613.                         local profit=volume2-volume3
  614.                         --手续费转换成以盈利币种计算
  615.                         SC3=SC3*price1/price22
  616.                         SC2=SC2/price22
  617.                         SC1=SC1/price22
  618.                         FinalProfit=profit-(SC3+SC1+SC2)
  619.                         luadb.log(symbol3..'下买单交易量为:'..volume3..',单价为:'..price3)
  620.                         luadb.log(symbol1..'下买单交易量为:'..volume1..',单价为:'..price1)
  621.                         luadb.log(symbol2..'下卖单交易量为:'..volume2..',单价为:'..price22)
  622.                         luadb.log(symbol3..'下买单手续费转换成'..ProfitCurrency..'为:'..SC3)
  623.                         luadb.log(symbol1..'下买单手续费转换成'..ProfitCurrency..'为:'..SC1)
  624.                         luadb.log(symbol2..'下卖单手续费转换成'..ProfitCurrency..'为:'..SC2)
  625.                         luadb.log('获利币种('..ProfitCurrency..')金额不减手续费为:'..profit)
  626.                         luadb.log('获利币种('..ProfitCurrency..')金额减去手续费为:'..FinalProfit)
  627.                         if FinalProfit > 0 then
  628.                                 local timestamp=os.time()
  629.                                 luadb.log('13下买单了')
  630.                                 local c_orderid=c:placeBuyOrder(symbol3,volume3,price3,robotID,timestamp)
  631.                                 luadb.log('13下单完成')
  632.                                 luadb.log('14下买单了')
  633.                                 local a_orderid=a:placeBuyOrder(symbol1,volume1,price1,robotID,timestamp)
  634.                                 luadb.log('14下单完成')
  635.                                 luadb.log('15下卖单了')
  636.                                 local b_orderid=b:placeSellOrder(symbol2,volume2,price22,robotID,timestamp)
  637.                                 luadb.log('15下单完成')
  638.                         else
  639.                                 error('获利金额小于0')
  640.                         end
  641.                 elseif price33 > price2/price11 then
  642.                         local table3=c:wsGetBalance(base3)
  643.                         if #table3==0 or table3[1]['available']==0 then error(jys3..'of'..base3..',There is no available balance in the currency') end
  644.                         --交易对3传入仓位计算出的可用余额
  645.                         local balance3=table3[1]['available']*FreightSpace
  646.                         --交易对3可以交易的数量
  647.                         local number3=GetPreciseDecimal(balance3,DecimalDigits33)
  648.                         if number3 > vol33 then
  649.                                 volume=vol33
  650.                         elseif number3 < vol33 then
  651.                                 volume=number3
  652.                         elseif number3 == vol33 then
  653.                                 volume=number3
  654.                         end
  655.                         --保留小数点后两位
  656.                         volume=GetPreciseDecimal(volume,DecimalDigits33)
  657.                         local table2=b:wsGetBalance(quote2)
  658.                         if #table2==0 or table2[1]['available']==0 then error(jys2..'of'..quote2..',There is no available balance in the currency') end
  659.                         --交易对2传入仓位计算出的可用余额
  660.                         local balance2=table2[1]['available']*FreightSpace
  661.                         --交易对2可以交易的数量
  662.                         local number2=GetPreciseDecimal(balance2/price2,DecimalDigits22)
  663.                         if number2 < price11*price33*volume/price2 then
  664.                                 volume=number2*price2/price11/price33
  665.                                 --保留小数点后两位
  666.                                 volume=GetPreciseDecimal(volume,DecimalDigits22)
  667.                         end
  668.                         local table1=a:wsGetBalance(base1)
  669.                         if #table1==0 or table1[1]['available']==0 then error(jys1..'of'..base1..',There is no available balance in the currency') end
  670.                         --交易对1传入仓位计算出的可用余额
  671.                         local balance1=table1[1]['available']*FreightSpace
  672.                         --交易对1可以交易的数量
  673.                         local number1=GetPreciseDecimal(balance1,DecimalDigits11)
  674.                         if number1 < price33*volume then
  675.                                 volume=number1/price33
  676.                                 --保留小数点后两位
  677.                                 volume=GetPreciseDecimal(volume,DecimalDigits11)
  678.                         end
  679.                         --local ssss=volume*price11/price2*(price33 - price2/price11)
  680.                         --16下卖单对应参数(交易对3)xrpbtc
  681.                         local volume3=GetPreciseDecimal(volume,DecimalDigits33)
  682.                         if MinimalAmount3 > volume3 then error('交易所规定的最小下单量为:'..MinimalAmount3..base3..',请您适当调高仓位') end
  683.                         local acquire3=price33*volume3
  684.                         if MinimalMoney3 > acquire3 then error('交易所规定的最小下单金额为:'..MinimalMoney3..quote3..',请您适当调高仓位') end
  685.                         --交易对3下卖单手续费
  686.                         if SCsell3 >= 0 then
  687.                                 SC3=acquire3*SCsell3
  688.                         else
  689.                                 SC3=Math.abs(SCsell3)
  690.                         end
  691.                         --17下买单对应参数(交易对2)xrpusdt
  692.                         local volume2=GetPreciseDecimal(price11*acquire3/price2,DecimalDigits22,1)
  693.                         if MinimalAmount2 > volume2 then error('交易所规定的最小下单量为:'..MinimalAmount2..base2..',请您适当调高仓位') end
  694.                         local expenditure2=price2*volume2
  695.                         if MinimalMoney2 > expenditure2 then error('交易所规定的最小下单金额为:'..MinimalMoney2..quote2..',请您适当调高仓位') end
  696.                         --交易对2下买单手续费
  697.                         if SCbuy2 >= 0 then
  698.                                 SC2=expenditure2*SCbuy2
  699.                         else
  700.                                 SC2=Math.abs(SCbuy2)
  701.                         end
  702.                         --18下卖单对应参数(交易对1)btcusdt
  703.                         local volume1=GetPreciseDecimal(acquire3,DecimalDigits11,1)
  704.                         if MinimalAmount1 > volume1 then error('交易所规定的最小下单量为:'..MinimalAmount1..base1..',请您适当调高仓位') end
  705.                         local acquire1=price11*volume1
  706.                         if MinimalMoney1 > acquire1 then error('交易所规定的最小下单金额为:'..MinimalMoney1..quote1..',请您适当调高仓位') end
  707.                         --交易对1下卖单手续费
  708.                         if SCsell1 >= 0 then
  709.                                 SC1=acquire1*SCsell1
  710.                         else
  711.                                 SC1=Math.abs(SCsell1)
  712.                         end
  713.                         local profit=volume2-volume3
  714.                         --手续费转换成以盈利币种计算
  715.                         SC3=SC3*price11/price2
  716.                         SC2=SC2/price2
  717.                         SC1=SC1/price2
  718.                         FinalProfit=profit-(SC3+SC1+SC2)
  719.                         luadb.log(symbol3..'下卖单交易量为:'..volume3..',单价为:'..price33)
  720.                         luadb.log(symbol2..'下买单交易量为:'..volume2..',单价为:'..price2)
  721.                         luadb.log(symbol1..'下卖单交易量为:'..volume1..',单价为:'..price11)
  722.                         luadb.log(symbol3..'下买单手续费转换成'..ProfitCurrency..'为:'..SC3)
  723.                         luadb.log(symbol2..'下买单手续费转换成'..ProfitCurrency..'为:'..SC2)
  724.                         luadb.log(symbol1..'下卖单手续费转换成'..ProfitCurrency..'为:'..SC1)
  725.                         luadb.log('获利币种('..ProfitCurrency..')金额不减手续费为:'..profit)
  726.                         luadb.log('获利币种('..ProfitCurrency..')金额减去手续费为:'..FinalProfit)
  727.                         if FinalProfit > 0 then
  728.                                 local timestamp=os.time()
  729.                                 luadb.log('16下卖单了')
  730.                                 local c_orderid=c:placeSellOrder(symbol3,volume3,price33,robotID,timestamp)
  731.                                 luadb.log('16下单完成')
  732.                                 luadb.log('17下买单了')
  733.                                 local b_orderid=b:placeBuyOrder(symbol2,volume2,price2,robotID,timestamp)
  734.                                 luadb.log('17下单完成')
  735.                                 luadb.log('18下卖单了')
  736.                                 local a_orderid=a:placeSellOrder(symbol1,volume1,price11,robotID,timestamp)
  737.                                 luadb.log('18下单完成')
  738.                         else
  739.                                 error('获利金额小于0')
  740.                         end
  741.                 end
  742.         end
  743. catch err do
  744.         error(err)
  745. end
复制代码


回复

使用道具 举报

yxf 发表于 2020-8-11 14:37:32 | 显示全部楼层
yxf
2020-8-11 14:37:32 看全部
666666666666
回复

使用道具 举报

yxf 发表于 2020-8-11 15:00:15 | 显示全部楼层
yxf
2020-8-11 15:00:15 看全部
66666666666666666666666666
回复

使用道具 举报

yxf 发表于 2020-8-11 15:01:10 | 显示全部楼层
yxf
2020-8-11 15:01:10 看全部
6666666666666666666666666666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

小志当前离线
管理员

查看:769 | 回复:3

快速回复 返回顶部 返回列表