清仓方法

楼主  收藏   举报   帖子创建时间:  2019-05-05 15:00 回复:0 关注量:966
本节所讲的“清仓”并不是全部持仓单平仓,而是指针对具有相同条件的订单平仓,例如所有盈利的订单平仓。 为了实现这种操作, 有两个知识点需要掌握, 一是遍历所有持仓单,二是筛选特定条件的目标订单。


for 语句完成遍历持仓单任务,MQL4 将持仓单按照时间远近顺序分配了序号,例如当前持仓单数量为 2,那么第 1 张持仓单顺序号为 0,第 2 张持仓单顺序号为 1。


if 语句中的“OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)”表示按序号选择订单,如果被选中返回 true,否则返回 false。筛选条件的设置真是一门学问,稍有差池,结果就会大相径庭。我们继续添加条件,当持仓单被选中后,需要增加一个货币对筛选条件,即“OrderSymbol()==Symbol()” , 将持仓单货币对锁定在当前货币对里, 再在增加一个特征码筛选条件“OrderMagicNumber()==MyMagicNum” ,将持仓单锁定在 EA 监管的范围内,最后增加一项“OrderProfit()>0” ,将持仓单锁定在盈利范围内。此时就完成了目标订单的选择。


总结筛选组合条件:选中订单+当前货币对+EA 可监管+订单盈利。


平仓动作需要注意的是买入单和卖出单使用的平仓价格不同,买入单用 Bid 平仓,卖出单用 Ask 平仓,因此在代码中还需要做进一步区分。清仓操作还包括撤销挂单, 可以利用订单类型再增加一个筛选条件, 撤销订单的操作只需要用“OrderDelete(OrderTicket());”命令即可,与报价无关。


  1. for (cnt=0;cnt< OrdersTotal();cnt++) //用循环语句实现遍历持仓单
  2. {
  3. if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MyMagicNum &&
  4. OrderProfit()>0)
  5. {
  6. if (OrderType()==OP_BUYSTOP) //买入单
  7. {
  8. iWait();
  9. OrderClose(OrderTicket(),OrderLots(),Bid,0);
  10. }
  11. if (OrderType()==OP_SELLSTOP) //卖出单
  12. {
  13. iWait();
  14. OrderClose(OrderTicket(),OrderLots(),Ask,0);
  15. }
  16. }
  17. }
打赏