策略原理:
7 d! l8 `$ s; s* J7 w3 b6 Z 多头入场:5日均线上穿65日均线且当前价格大于200日均线
0 \+ R. K4 C; L' n4 m8 e 空头入场:5日均线下穿65日均线且当前价格小于200日均线- {6 j9 _0 o0 b }5 D7 N; r7 J
出场:动态跟踪止损出场: C7 e- b$ y& o
4 Y& p) d. A& O" P. V7 O* t' e0 S
策略代码:
9 I8 x4 S5 H2 A# F" gfunction Strategy1(default_unit,default_exitway,freq)%
1 c$ a& V, n( ?5 A+ \# j# W/ }targetList = traderGetTargetList(); %获取目标资产信息 HandleList = traderGetHandleList(); %获取账户句柄 global entrybar; for k=1:length(targetList); 0 q. b' c/ g. g% g" Z) P1 b8 L) W) F
%--------------------仓位、K线、当前bar的提取-----------------------------% %获取当前仓位 [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code); %策略中每次取数据的长度 lags=200; dlags=20; barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code); %数据长度限制 if(barnum<lags) continue; end if(barnum<dlags) continue; end %获取K线数据 [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq, 0-lags, 0,false,'FWard'); [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'day',1, 0-dlags, 0,false,'FWard'); if legth(close)<lags || length(Dclose)<dlags continue; end; %-------------------------交易逻辑-------------------------------% %----------入场信号--------------------% TRvalue=TR(Dclose,Dhigh,Dlow); ATR=ma(TRvalue,10); ma2=ma(close,200); ma0=ma(close,5); ma1=ma(close,65); buycon=ma0(end)>ma1(end) && ma0(end-1)<ma1(end-1) && close(end)>ma2(end); sellshortcon=ma0(end)<ma1(end) && ma0(end-1)>ma1(end-1) && close(end)<ma2(end); if default_exitway==1 sellcon=ma0(end)<ma1(end) && ma0(end-1)>ma1(end-1); buytocovercon=ma0(end)>ma1(end) && ma0(end-1)<ma1(end-1); elseif default_exitway==2 TRvalue=TR(close,high,low); ATR=ma(TRvalue,4); barsinceentry=barnum-entrybar(k); [~,entryopen,entryhigh,entrylow,entryclose,~,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq, 0-barsinceentry, 0,false,'FWard'); range=4*ATR(end-1); [sellcon,buytocovercon]=exitway1(entryopen,entryclose,entryhigh,entrylow,marketposition,range); elseif default_exitway==3 barsinceentry=barnum-entrybar(k); [~,entryopen,entryhigh,entrylow,entryclose,~,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq, 0-barsinceentry, 0,false,'FWard'); enterprice=entryclose(1); percent=0.5; ATRparam=1; sellcon=0; buytocovercon=0; if marketposition>0 stoplossprice=enterprice-ATRparam*ATR(end); stopearnprice=enterprice+ATRparam*ATR(end); [sellcon,buytocovercon]=exitway3(entryopen,entryclose,entryhigh,entrylow,marketposition,stoplossprice,stopearnprice,percent); elseif marketposition<0 stoplossprice=enterprice+ATRparam*ATR(end); stopearnprice=enterprice-ATRparam*ATR(end); [sellcon,buytocovercon]=exitway3(entryopen,entryclose,entryhigh,entrylow,marketposition,stoplossprice,stopearnprice,percent); end; end; %---------------------------入场操作--------------------------------% if sellcon && marketposition>0 orderID1=traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell'); if orderID1==0 continue; end; end; if buytocovercon && marketposition<0 orderID2=traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell'); if orderID2==0 continue; end; end; if buycon && marketposition<=0 buyunit=default_unit; orderID3=traderBuy(HandleList(1),targetList(k).Market,targetList(k).Code,buyunit,0,'market','buy'); if orderID3==0 continue; end; entrybar(k)=barnum; end; if sellshortcon && marketposition>=0 sellshortunit=default_unit; orderID4=traderSellShort(HandleList(1),targetList(k).Market,targetList(k).Code,sellshortunit,0,'market','sell'); if orderID4==0 continue; end; entrybar(k)=barnum; end; end end " I- A: }3 N/ i& K
8 P; P1 u& M4 M& [9 K |