有两个ema参数,ema1(A2)和ema2(A3),当其中一个ema设置大于100的时候,fmz实盘跑的时候ema跟币安的值对不上,(ema小于100的时候正常),导致开单信号会提前或者延迟5-10根k线.
'''backtest
start: 2021-11-01 00:00:00
end: 2021-11-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["M",8],["A2",100],["A3",200],["K3",500],["K2",300]]
'''
def accuracy(): #获取交易所精度
global BV1,CV1
exchanges[i].SetContractType('swap')
currency1=_C(exchanges[i].GetCurrency)
ticker1=_C(exchanges[i].GetTicker)
account1=_C(exchanges[i].GetAccount)
all_BV1list=['ALICE_USDT','DODO_USDT','UNFI_USDT','LITU_USDT','ZEN_USDT','FIL_USDT','AAVE_USDT','KSM_USDT','EGLD_USDT','TRB_USDT','CRV_USDT',
'BAL_USDT','DOT_USDT','SNX_USDT','WAVES_USDT','RLC_USDT','BAND_USDT','KAVA_USDT','SXP_USDT','OMG_USDT','ZRX_USDT','ALGO_USDT',
'THETA_USDT','QTUM_USDT','BAT_USDT','IOTA_USDT','ONT_USDT','XTZ_USDT','EOS_USDT','XRP_USDT','ICP_USDT','NEO_USDT','ATOM_USDT',
'BNB_USDT','LINK_USDT','ETC_USDT','BNB_USDT','YFII_USDT','YFI_USDT','DEFI_USDT','MKR_USDT','COMP_USDT','ZEC_USDT','DASH_USDT',
'XMR_USDT','LTC_USDT','BCH_USDT','ETH_USDT','BTC_USDT']
list1=['ALICE_USDT','DODO_USDT','UNFI_USDT','LITU_USDT','ZEN_USDT','FIL_USDT','AAVE_USDT','KSM_USDT','EGLD_USDT','TRB_USDT','CRV_USDT',
'BAL_USDT','DOT_USDT','SNX_USDT','WAVES_USDT','RLC_USDT','BAND_USDT','KAVA_USDT','SXP_USDT','OMG_USDT','ZRX_USDT','ALGO_USDT',
'THETA_USDT','QTUM_USDT','BAT_USDT','IOTA_USDT','ONT_USDT','XTZ_USDT','EOS_USDT','XRP_USDT']
list2=['ICP_USDT','NEO_USDT','ATOM_USDT','BNB_USDT','LINK_USDT','ETC_USDT','BNB_USDT']
list3=['YFII_USDT','YFI_USDT','DEFI_USDT','MKR_USDT','COMP_USDT','ZEC_USDT','DASH_USDT','XMR_USDT','LTC_USDT','BCH_USDT','ETH_USDT','BTC_USDT']
if currency1 in list1:
BV1=1
if currency1 in list2:
BV1=2
if currency1 in list3:
BV1=3
if currency1 not in all_BV1list:
BV1=0
#价格精度计算
if currency1!='YFI_USDT':
RR1=str(ticker1["Last"])
content1=RR1.split(".")[-1]
weishu1=len(content1)
CV1=weishu1
else:
CV1=0
global n1
account1=_C(exchange.GetAccount)
walletbalance=account1["Balance"]
P=0.01P0float(walletbalance)
n1=round(P/ticker1["Last"],BV1)
if n1==0:
n1=n1+10**(-BV1)
def main():
while True:
global i
for i in range(len(exchanges)):
exchanges[i].SetContractType('swap')
accuracy()
exchanges[i].SetMarginLevel(M)
ticker1=_C(exchanges[i].GetTicker)
currency1=_C(exchanges[i].GetCurrency)
position1=_C(exchanges[i].GetPosition)
r=_C(exchanges[i].GetRecords)
if r and len(r)>9:
EMA=TA.EMA(r,A2)
EMA2=TA.EMA(r,A3)
longsignal=EMA[-3]<EMA2[-3] and EMA[-2]>EMA2[-2]
shortsignal=EMA[-3]>EMA2[-3] and EMA[-2]<EMA2[-2]
if len(position1)==0:
if longsignal: #1分钟金叉
Log(currency1,'多头信号成立')
exchanges[i].SetDirection('buy')
exchanges[i].Buy(-1,n1)
Log('倒数第二个EMA2:',EMA2[-2],'倒数第三个EMA2:',EMA2[-3])
Log('倒数第二个EMA1:',EMA[-2],'倒数第三个EMA1:',EMA[-3])
#开空信号
if shortsignal: #1分钟死叉
Log(currency1,'空头信号成立')
exchanges[i].SetDirection('sell')
exchanges[i].Sell(-1,n1)
Log('倒数第二个EMA2:',EMA2[-2],'倒数第三个EMA2:',EMA2[-3])
Log('倒数第二个EMA1:',EMA[-2],'倒数第三个EMA1:',EMA[-3])
if len(position1)==1:
if position1[0]["Type"]==0:
if ticker1["Last"]>position1[0].Price+K3:
Log(currency1,'多头触发止盈')
exchanges[i].SetDirection('closebuy')
exchanges[i].Sell(-1,position1[0].Amount)
Log('倒数第二个EMA2:',EMA2[-2],'倒数第三个EMA2:',EMA2[-3])
Log('倒数第二个EMA1:',EMA[-2],'倒数第三个EMA1:',EMA[-3])
if ticker1["Last"]<position1[0].Price-K2:
Log(currency1,'多头触发止损')
exchanges[i].SetDirection('closebuy')
exchanges[i].Sell(-1,position1[0].Amount)
Log('倒数第二个EMA2:',EMA2[-2],'倒数第三个EMA2:',EMA2[-3])
Log('倒数第二个EMA1:',EMA[-2],'倒数第三个EMA1:',EMA[-3])
if position1[0]["Type"]==1:
if ticker1["Last"]<position1[0].Price-K3:
Log(currency1,'空头触发止盈')
exchanges[i].SetDirection('closesell')
exchanges[i].Buy(-1,position1[0].Amount)
Log('倒数第二个EMA2:',EMA2[-2],'倒数第三个EMA2:',EMA2[-3])
Log('倒数第二个EMA1:',EMA[-2],'倒数第三个EMA1:',EMA[-3])
if ticker1["Last"]>position1[0].Price+K2:
Log(currency1,'空头触发止损')
exchanges[i].SetDirection('closesell')
exchanges[i].Buy(-1,position1[0].Amount)
Log('倒数第二个EMA2:',EMA2[-2],'倒数第三个EMA2:',EMA2[-3])
Log('倒数第二个EMA1:',EMA[-2],'倒数第三个EMA1:',EMA[-3])
Sleep(S)
百度或者知乎搜索下 EMA 算法, 这类迭代算法算出的指标值和传入的数据量大小有关(也就是K线线柱数量)。线柱数量越多,算出的越接近。你可以算算EMA100基本是一样的,EMA200有点误差就是因为EMA200 计算需要更多的线柱(K线BAR)。 这类基础概念百度下、知乎下就有。
- 1
