软件中会提供几种默认止盈止损策略,但有时还是无法完全满足用户的多样性需要,算法交易模型的函数可取到盘口价格和持仓合约的信息(持仓价格、数量、和盈亏等),通过编写算法交易模型可定制属于您自己的止盈止损策略。
跟踪止盈是软件默认提供的策略,但如果希望在盈利达到一定值时再启动跟踪止盈策略,就无法实现了。那么在开仓后,算法交易模型就会开始取盘口价格和持仓价格实时监测,满足了条件会自动发平仓委托。源码如下:
//止盈止损 Data data0:"m1709"; Vars Global_Numeric N;//下单手数 Global_Numeric M1; //价位倍数1 Global_Numeric M2; //价位倍数2 Global_Numeric M3; //价位倍数3 Global_Numeric BID; //买一价 Global_Numeric ASK; //卖一价 Global_Numeric NEWP; //最新价 Global_Numeric MINP; //最小变动价位 Global_Numeric BKC; //做多条件 Global_Numeric BKID; //买开委托 Global_Numeric BKFLG; //买开标志 Global_Numeric BKAP; //买开委托成交均价 Global_Numeric BHP; //多头最高价 Global_Numeric SPID; //卖平委托 Global_Numeric SPFLG; //卖平标志 Global_Numeric BRP; //多头可用持仓 Global_Numeric BZYFLG; //多头止盈标志 Begin N = 2; //下单手数 M1 = 3; //价位倍数1 M2 = 1; //价位倍数2 M3 = 3; //价位倍数3 BKC = 1; //做多条件 BID = Price("Bid1"); //买一价 ASK = Price("Ask1"); //卖一价 NEWP = Price("New"); //最新价 MINP = Price("MinPrice");//最小变动价位 BRP = F_BuyRemainPosition(); //多头可用持仓 if(A_IsExchangeOpen() == 1) //如果当前状态是开盘 { //----------------------成交判断--------------------// if(BKFLG == 1) //如果有买开委托 { if(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 { Commentary("【多头开仓:买开委托成交!】"); BKAP = F_OrderFilledPrice(BKID); //买开委托成交均价 BKFLG = 2; //买开委托已成交 } } if(SPFLG > 0) //如果有卖平委托 { if(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交 { if(SPFLG == 1) //如果是多头止盈卖平委托 { Commentary("【多头止盈:卖平委托成交!】"); } else if(SPFLG == 2) //如果是多头止损卖平委托 { Commentary("【多头止损:卖平委托成交!】"); } BKFLG = 0; //买开标志归0 SPFLG = 0; //卖平标志归0 BZYFLG = 0; //多头止盈标志归0 } } //----------------------委托处理--------------------// if(BKFLG == 0) //如果没有买开委托 { if(BKC == 1) //如果满足做多条件 { Commentary("【多头开仓:买开委托发出!】"); BKID = A_SendOrder(Enum_Buy,Enum_Entry,N,ASK); //以对价发出N手的买开委托 BKFLG = 1; //已发出买开委托 } } if(BKFLG == 2 && SPFLG == 0) //如果买开委托已成交,且没有卖平委托 { if(BZYFLG == 0) //如果多头止盈未开启 { if(NEWP >= BKAP + M1 * MINP) //如果最新价大于等于买开委托成交均价加M1个价位 { Commentary("【多头止盈:多头止盈开启!】"); BHP = NEWP; //多头最高价设为最新价 BZYFLG = 1; //多头止盈开启 } } else if(BZYFLG == 1) //如果多头止盈已开启 { BHP = max(NEWP,BHP); //多头最高价 if(NEWP <= BHP - M2 * MINP) //如果最新价小于等于多头最高价减M2个价位 { if(BRP > 0) //如果有多头可用持仓 { Commentary("【多头止盈:卖平委托发出!】"); SPID = A_SendOrder(Enum_Sell,Enum_Exit,BRP,BID); //以对价发出多头可用持仓手数的卖平委托 SPFLG = 1; //已发出多头止盈卖平委托 BZYFLG = 2; //多头止盈已卖平 } } } if(BZYFLG != 2) //如果多头止盈未卖平 { if(NEWP <= BKAP - M3 * MINP) //如果最新价小于等于买开委托成交均价减M3个价位 { Commentary("【多头止损:卖平委托发出!】"); SPID = A_SendOrder(Enum_Sell,Enum_Exit,BRP,BID); //以对价发出多头可用持仓手数的卖平委托 SPFLG = 2; //已发出多头止损卖平委托 } } } } End
算法交易模型执行效果如下图所示,开仓之后满足止损平仓条件,会自动发出平仓委托:
