韭菜保护程序(唐安奇通道+均仓策略)

Author: 去者伯仁, Date: 2021-04-12 12:19:27
Tags:

```'''backtest
start: 2021-04-01 00:00:00
end: 2021-04-30 23:59:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","stocks":0}]
'''

import time
class juncang_strategy():
def __init__(self,exchange):
self.p = 0.5
self.account = None
self.cny = 0
self.btc = 0
self.exchange =exchange

#K线合成函数
def k_compose(self,Recordlist,num):
newRecordlist = []
for i in range(len(Recordlist)):
if (i+1)%num == 1:
tempk = {}
tempk["Time"]=Recordlist[i]["Time"]
tempk["Open"]=Recordlist[i]["Open"]
tempk["High"]=Recordlist[i]["High"]
tempk["Low"]=Recordlist[i]["Low"]
tempk["Close"]=Recordlist[i]["Close"]
tempk["Volume"]=Recordlist[i]["Volume"]
newRecordlist.append(tempk)
elif (i+1)%num == 0:
if Recordlist[i]["High"]>tempk["High"]:
tempk["High"] = Recordlist[i]["High"]
if Recordlist[i]["Low"]<tempk["Low"]:
tempk["Low"] = Recordlist[i]["Low"]
tempk["Time"]=Recordlist[i]["Time"]
tempk["Close"]=Recordlist[i]["Close"]
tempk["Volume"]=tempk["Volume"]+Recordlist[i]["Volume"]
del(newRecordlist[-1])
newRecordlist.append(tempk)
else:
if Recordlist[i]["High"]>tempk["High"]:
tempk["High"] = Recordlist[i]["High"]
if Recordlist[i]["Low"]<tempk["Low"]:
tempk["Low"] = Recordlist[i]["Low"]
del(newRecordlist[-1])
newRecordlist.append(tempk)
return newRecordlist

#唐安奇通道计算，分析出当前什么行情
def donchian(self):
exchange.SetMaxBarLen(2000)
temp_k = _C(self.exchange.GetRecords,PERIOD_D1)
week_kline = self.k_compose(temp_k,7)
rt=False
# Log(len(week_kline),week_kline[-1]["High"],TA.Highest(week_kline, 20, 'High'))
if len(week_kline)>20:
if week_kline[-1]["High"]>TA.Highest(week_kline, 20, 'High'):
rt = '全仓'
elif week_kline[-1]["High"]<TA.Highest(week_kline, 20, 'High') and week_kline[-1]["Low"]>TA.MA(week_kline, 10)[-1]:
rt = '均仓'
elif week_kline[-1]["Low"]<TA.MA(week_kline, 10)[-1]:
rt = '空仓'
else:
rt = '均仓'
return rt
def cancelAllOrders(self):
orders = self.exchange.GetOrders()
for order in orders:
self.exchange.CancelOrder(order['Id'], order)
return True
#全仓买入函数
def allin(self):
kr =  _C(self.exchange.GetRecords,PERIOD_H1)
account = _C(self.exchange.GetAccount)
self.cny = account.Balance
Log("全仓allin")

#全仓卖出函数
def allout(self):
kr =  _C(self.exchange.GetRecords,PERIOD_H1)
account = _C(self.exchange.GetAccount)
self.btc = _N(account.Stocks,3)
if self.btc>0:
Log("空仓allout")
self.exchange.Sell(kr[-1].Close,self.btc)
#均仓函数
def balanceAccount(self):
kr =  _C(self.exchange.GetRecords,PERIOD_H1)
account = _C(self.exchange.GetAccount)
if account is None:
return

#赋值
self.account = account

#赋值
self.btc = account.Stocks
self.cny = account.Balance

accountmoney=self.btc * kr[-1].Close + self.cny
self.p = self.btc * kr[-1].Close / accountmoney
#判断self.p的值是否小于0.48
# Log(self.p)
if (0.45<self.p < 0.49):
#调用Log函数并传入参数"开始平衡", self.p
Log("开始平衡", self.p)

Log("持币数:",self.btc,"现金数:",self.cny)

#判断self.p的值是否大于0.52
elif (0.55 > self.p > 0.51):
#调用Log函数并传入参数"开始平衡", self.p
Log("开始平衡", self.p)

#调用Sell函数并传入相应的参数

Log("持币数:",self.btc,"现金数:",self.cny)
elif (self.p >= 0.55):
#调用Log函数并传入参数"开始平衡", self.p
Log("开始平衡,快速平仓", self.p)

Log("持币数:",self.btc,"现金数:",self.cny)
elif (self.p <= 0.45):
#调用Log函数并传入参数"开始平衡", self.p
Log("开始平衡，快速建仓", self.p)

Log("持币数:",self.btc,"现金数:",self.cny)
#交易循环
def loop(self):
self.cancelAllOrders()
rt=self.donchian()
if rt=='全仓':
self.allin()
elif rt=='均仓':
self.balanceAccount()
else:
self.allout()
Sleep(1000*60)

#函数main
def main():
#reaper 是构造函数的实例
reaper = juncang_strategy(exchange)
while (True):
reaper.loop()

```

More

hugogo (i+1)%num == 1:elif (i+1)%num == 0:这两个条件是啥意思？num这个值前面没定义过呀，貌似？大师方便答疑下吗？