语言切换

HR1代码讲解

[复制链接]
小志 发表于 2020-7-8 17:11:25 | 显示全部楼层 |阅读模式
小志
2020-7-8 17:11:25 674 0 看全部
首先,根据传入参数获取买入交易所、卖出交易所、对冲交易对、每次最小交易量、每次最多交易量、最小收益、买入卖出手续费费率,然后从数据库获取交易量小数点后位数、最低成交量、最低成交金额,检测WebSocket买一卖一行情API是否有数据,没有报错退出本次对冲。检测两个交易所的对应余额,卖方交易所看基础币种余额,买方交易所看计价币种余额,如果其中一个交易所没有余额则报错退出本次对冲。根据该API获取两个交易所该交易对的价格以及交易量,用获取到的交易量比较,交易量最小的为下单量,相同选其一。然后再根据最小下单量和最多下单量进行限制交易量。检测对冲交易对基础币种可用余额够不够本次对冲,如果交易所剩余币种数量比对冲数量少,那么基础币种余额剩余多少下多少币子,然后根据最低交易量和每次最少交易量进行限制,如果不满足其中一个条件则会结束本次对冲。计价币种可用余额为0或者不足结束本次对冲。进行买入卖出金额的计算,如果买入卖出金额小于交易所规定的最小成交金额结束本次对冲。条件都满足后,按照公式算出收益率,大于我们设置的最小收益率则进行对冲下单,小于则结束对冲并报错。
  1. --LuaDBScript(HedgingRobot001)
  2. --对冲脚本
  3. require("BMT_CORE")
  4. local tprint=luadb.tableprint
  5. local log=luadb.log
  6. --A网 卖方市场   B网 买方市场
  7. local db = dbhelper("BMT")
  8. local JYSA=db:openQuery("select JYS.JYS01,JYS03,JYS04,JYS05,PZ03,PZ04,PZ05 from PZ left join JYS on JYS.JYS01 = PZ.JYS01 where PZ.PZ01= :<InputStr.PZ01A>")
  9. local JYSB=db:openQuery("select JYS.JYS01,JYS03,JYS04,JYS05,PZ03,PZ04,PZ05 from PZ left join JYS on JYS.JYS01 = PZ.JYS01 where PZ.PZ01= :<InputStr.PZ01B>")
  10. --交易对
  11. local list=lua_string_split(:<InputStr.JPM03>,'/')
  12. local base = string.lower(list[1])
  13. local quote = string.lower(list[2])
  14. local symbol =base..quote
  15. --交易所名
  16. local exA = JYSA[1].PZ03  --A名  卖方市场
  17. local exB = JYSB[1].PZ03 --B名   买方市场
  18. log(exA)
  19. log(exB)
  20. local RobotId='HR1'
  21. --小数位数
  22. local DecimalDigits=0
  23. --最低交易量
  24. local MinimalAmount=0
  25. --最低成交金额
  26. local MinimalMoney=0
  27. local t1=GettingData(exA,symbol)
  28. local DecimalDigits1=t1.DecimalDigits
  29. local MinimalAmount1=t1.MinimalAmount
  30. local MinimalMoney1=t1.MinimalMoney
  31. local t2=GettingData(exB,symbol)
  32. local DecimalDigits2=t2.DecimalDigits
  33. local MinimalAmount2=t2.MinimalAmount
  34. local MinimalMoney2=t2.MinimalMoney
  35. if DecimalDigits1 > DecimalDigits2 then
  36.         DecimalDigits=DecimalDigits2
  37. elseif DecimalDigits2 > DecimalDigits1 then
  38.         DecimalDigits=DecimalDigits1
  39. elseif DecimalDigits1==DecimalDigits2 then
  40.         DecimalDigits=DecimalDigits1
  41. end
  42. if MinimalAmount1 > MinimalAmount2 then
  43.         MinimalAmount=MinimalAmount1
  44. elseif MinimalAmount2 > MinimalAmount1 then
  45.         MinimalAmount=MinimalAmount2
  46. elseif MinimalAmount1==MinimalAmount2 then
  47.         MinimalAmount=MinimalAmount1
  48. end
  49. if MinimalMoney1 > MinimalMoney2 then
  50.         MinimalMoney=MinimalMoney1
  51. elseif MinimalMoney2 > MinimalMoney1 then
  52.         MinimalMoney=MinimalMoney2
  53. elseif MinimalMoney1==MinimalMoney1 then
  54.         MinimalMoney=MinimalMoney1
  55. end
  56. local ad=MarketPrice('local')
  57. local a=exchange(exA)
  58. local b=exchange(exB)
  59. local tb1=a:wsGetBalance(base)
  60. local tb2=b:wsGetBalance(quote)
  61. if #tb1==0 or #tb2==0 then
  62.         error('Failed to obtain balance')
  63. end
  64. --每次最少交易量
  65. local MinimumVolume=tonumber(:<InputStr.JPM09>)
  66. --每次最多交易量
  67. local MaximumVolume=tonumber(:<InputStr.JPM10>)
  68. --最小收益
  69. local MinimumRevenuePercent = tonumber(:<InputStr.JPM11>)
  70. --买入手续费费率
  71. local ServiceCharge_buy=tonumber(:<InputStr.JPM12>)
  72. --卖出手续费费率
  73. local ServiceCharge_sell=tonumber(:<InputStr.JPM13>)
  74. --判断A网和B网是否有此交易对的下单信息
  75. local deptA=a:wsGetEveryMarket(symbol)
  76. local deptB=b:wsGetEveryMarket(symbol)
  77. if deptA[1] == nil then
  78.         error(exA..':Failed to obtain the order message')
  79. end
  80. if deptB[1] == nil then
  81.         error(exB..':Failed to obtain the order message')
  82. end
  83. --获取交易所A和交易所B的下单价格
  84. local spriceA = tonumber(deptA[1].buy)--A网按买价卖
  85. local bpriceB = tonumber(deptB[1].sell)--B网按卖价买
  86. --获取A网和B网买单和卖单的数量
  87. local samountA = tonumber(deptA[1].buysize) --A网卖量
  88. local bamountB = tonumber(deptB[1].sellsize) --B网买量
  89. --数量最小的为下单量,相同选其一
  90. if samountA > bamountB then
  91.         amount = bamountB
  92. elseif samountA < bamountB then
  93.         amount = samountA
  94. elseif samountA == bamountB then
  95.         amount = samountA
  96. end
  97. --最少交易量和最多交易量限制
  98. if amount < MinimumVolume then
  99.         amount=MinimumVolume
  100. elseif amount > MaximumVolume then
  101.         amount=MaximumVolume
  102. end
  103. amount=GetPreciseDecimal(amount,DecimalDigits)
  104. if amount < MinimalAmount then error('The minimum order quantity stipulated by the exchange is:'..MinimalAmount..base) end
  105. --获取交易所对应买卖币种余额
  106. local balanceA=tonumber(tb1[1]['available'])
  107. local balanceB=tonumber(tb2[1]['available'])
  108. --基础币种余额够不够
  109. if balanceA == 0 then
  110.         --可用余额为0
  111.         error(exA..':The available balance is 0')
  112. elseif balanceA < amount then
  113.         --如果交易所剩余币种数量比对冲数量少,那么基础币种余额剩余多少下多少币子
  114.         amount=balanceA
  115. end
  116. amount=GetPreciseDecimal(amount,DecimalDigits)
  117. if amount < MinimumVolume then error(exA..'of'..base..'Currency can be placed less than each minimum transaction volume') end
  118. if amount < MinimalAmount then error('The minimum order quantity stipulated by the exchange is:'..MinimalAmount..base) end
  119. --计价币种余额够不够
  120. if balanceB == 0 then
  121.         error(exB..':The available balance is 0 ,'..quote) --可用余额为0
  122. elseif balanceB < bpriceB*amount then
  123.         error(exB..':Insufficient available balance ,'..quote)  --可用余额不够
  124. end
  125. --买入金额
  126. local buy_sum=bpriceB*amount
  127. if buy_sum < MinimalMoney then error('The minimum order quantity stipulated by the exchange is:'..MinimalMoney..quote) end
  128. --卖出金额
  129. local sell_sum=spriceA*amount
  130. if sell_sum < MinimalMoney then error('The minimum order quantity stipulated by the exchange is:'..MinimalMoney..quote) end
  131. --买入手续费
  132. local ServiceChargeA=buy_sum*ServiceCharge_buy
  133. --卖出手续费
  134. local ServiceChargeB=sell_sum*ServiceCharge_sell
  135. --收益率%=100*(卖出金额-买入金额-买入手续费-卖出手续费)/(买入金额+卖出金额)
  136. local YieldRate=100*(sell_sum-buy_sum-ServiceChargeA-ServiceChargeB)/(buy_sum+sell_sum)
  137. log(YieldRate)
  138. --如果收益率大于等于最小收益率进行对冲
  139. if YieldRate >= MinimumRevenuePercent then
  140.         local timestamp=os.time()
  141.         local sell = a:PlaceSellOrder(symbol,amount,spriceA,RobotId,timestamp)
  142.         log(exA..'Successful order, order no:'..sell)
  143.         --对冲完成把状态改成更新状态
  144.         --InvalidCacheBalance(exA,base)
  145.         local buy = b:PlaceBuyOrder(symbol,amount,bpriceB,RobotId,timestamp)
  146.         log(exB..'Successful order, order number:'..buy)
  147.         --对冲完成把状态改成更新状态
  148.         --InvalidCacheBalance(exB,quote)
  149.         --对冲成功数据插入到数据库
  150.         local nonce=os.date("%Y-%m-%d %H:%M:%S", os.time());
  151.         DC1={}
  152.         DC1.DC101 = db:getlastid("DC1","DC101")
  153.         DC1.DC102 = symbol
  154.         DC1.DC103 = exA..'→'..exB
  155.         DC1.DC104 = nonce
  156.         DC1.DC105 = exA
  157.         DC1.DC106 = spriceA
  158.         DC1.DC107 = exB
  159.         DC1.DC108 = bpriceB
  160.         DC1.DC109 = amount
  161.         DC1.DC110 = quote
  162.         DC1.DC111 = (spriceA-bpriceB)*amount-(ServiceChargeA+ServiceChargeB)
  163.         tmp_profit=ad:cashConvert(DC1.DC111,quote,'CNY')
  164.         DC1.DC112=tmp_profit['price']
  165.         db:insert("DC1",DC1)
  166. else
  167.         error('Unsatisfied hedging')
  168. end
复制代码


回复

使用道具 举报

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

本版积分规则 返回列表

小志当前离线
管理员

查看:674 | 回复:0

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