经过编程、回测,考虑了初步出场策略,把源码贴出来提供大家交流学习,也请多批评~
int 双向挂单出场策略()
{
//模式一,单子太多就止损出场
if( 读取该魔术码已成交单子(Magic)>=30 ) { 无条件平指定魔术码所有单子(Magic); return 1; } //|| 超过N个单子就强制止损
//模式二,多单、空单同时大于6单此时很难解套,止损出场
if( 止损出场_满足多3空3天地锁() ) { 无条件平指定魔术码所有单子(Magic); return 1; }
//模式三,保本出场,这也是最主要出场方式~如果 持有1个空单2个多单,为避免第3个多单成交经计算在,第3个单子成交前是可以保本的。所以当持单子【3个】就启动保本是合理的~
if( 读取该魔术码已成交单子(Magic)>=持有N个单子就启动保本 && AccountProfit()>=0 )
{
if( 无条件平指定魔术码所有单子(Magic) ) { Sleep(9000); return 1; } // 如果止盈满足、也顺利平仓,返回1
else return 0; // 如果止盈满足、但没有顺利平仓,返回0
}
//模式四,盈利出场,这也是最佳情况,此时空单没成交只持有多单,继续涨触及止盈离场……
double 订单总盈利 = 0.0; double 订单总手数 = 0.0; double 订单平均盈利 = 0.0;
// 读取当前持仓及盈利情况
for (int m = OrdersTotal() - 1 ; m >= 0 ; m=m - 1)
{
if ( !(OrderSelect(m,SELECT_BY_POS,MODE_TRADES)) || OrderSymbol() != Symbol() || OrderMagicNumber() != Magic || ( OrderType()!=0 && OrderType()!=1) ) continue;
订单总盈利 += OrderProfit();
订单总手数 += OrderLots();
}
if( 订单总盈利> 每次递增手数*每手对应止盈倍率 )
{
if( 无条件平指定魔术码所有单子(Magic) ) { Sleep(9000); return 1; } // 如果止盈满足、也顺利平仓,返回1
else return 0; // 如果止盈满足、但没有顺利平仓,返回0
}
return -1; //没有满足出场条件,返回-1
}
|