帮忙看下ema交叉信号开单的问题

Author: 吱吱吱吱在, Created: 2021-11-04 11:34:33, Updated:

有两个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®>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)

More

小小梦 百度或者知乎搜索下 EMA 算法, 这类迭代算法算出的指标值和传入的数据量大小有关(也就是K线线柱数量)。线柱数量越多,算出的越接近。你可以算算EMA100基本是一样的,EMA200有点误差就是因为EMA200 计算需要更多的线柱(K线BAR)。 这类基础概念百度下、知乎下就有。