设为首页 收藏本站 切换语言

打造稳健的MT4 黄金交易策略

| 发表于 2022-12-8 11:13:05 | 显示全部楼层 |复制链接
在开始本文之前首先明确我的几个交易上的价值观,若你不认同,可跳过下面精采的5000字了(为什么是5000?多少字,这不重要,在此我只是向中华文明致敬,并希望以自己从事信息化解决方案多年的经验为中国金融献出一点思想)。我的核心价值观如下:

金融交易是一个复杂系统,轻微的差别导致结果大相径庭。复杂系统是一个科学研究的领域术语,意为不能通过部分还原整体的行为。比如:人就是一个复杂的系统,你不能通过计算细胞的行为来推测出人的情绪。金融交易作为复杂系统,导致的结果是:完全相同交易策略的机器,甚至跟着某个大牛的交易信号,最终赢利情况也有很大差别。
技术指标的用途是告诉你现在处于什么状态,并不能预测未来,你永远不知道下一刻会发生什么。几乎所有技术指标都能准确反映过去的行情。为什么呢?因为其只是用了些不同的数学(统计学)方法直观的告诉了你:过去发生了什么。而现状是由过去导致的,故指标是能够反映现状的。若你通过技术指标知道现在是上涨行情,做多是正确的。问题是,你无法预知能涨到什么时候。下文我将说明我怎么去解决这个问题。
顺势而为,借势而进,造势而起,乘势而上!哈哈,其实我只想说,逆势加仓不是我的风格。
以下是5000字!会重点说明我的交易策略是如何做到一年翻3倍,及为什么不会爆仓。你也可以依此策略来编写量化交易程序。当然,mt4上的我已经编写完成,近期会考虑开源出来。其他交易系统也可以依此策略来编写。
一、整体策略

我会使用m30做大趋势判断,m1做小趋势判断,实时行情变动作为走势判断(这里回应上文,技术指标表达过去的情况,只有当前价格变动才是最直接的反映,过去是客观的,未来很主观)。以下是整个策略的核心逻辑:顺的时候开仓加仓,不顺的时候减仓,这是不会错的。


二、合适的开仓量及开仓位置保可以快速盈利平仓,及低仓位过渡风险期

默认的参数是1000美元(美分)前5单的开仓是分别是:0.01手(1手100盎司)、不多于0.02手、不多于0.04手、不多于0.08手、不多于0.16手,第6单以顺势1000点就盈利平仓计算购买量。


当大趋势的技术指标与小趋势的技术指标一致且强烈,这说明这走势已经成形,并且很可能可以持续一段时间,是个开仓的好时机。这时侯,我选择的方式是再追踪几百点,看行情价格是否如指标反映再开仓。若已经有同向操作的仓位,开单的矩离大于550点,再开始追踪开创,减小开仓位置太集中的风险。


至于为什么是550点,这是我的技术指标判断小趋势行情的落差中位值是1810点。也就说有一半的情况,小趋势走1810点之后会反过来,这种反过来有可能预示着大的行情将要反转,我希望低仓位过渡(实际上大多情况下不超过1张单,下文会说明我是怎么做到,除非1盎司黄金的落差有1000美元,不然不会爆仓)。另外前5单也是成倍递增的,这是希望可以快速盈利平仓。


第6单是一张可以1秒救地球的单,我们改了个名字“海豹特击队”。若前5单一直顺势加仓都无办法盈利平仓,就在极其严格的条件下启动海豹特击队了:当前行情突破前3条m5 k线的最高价或最低价3%。


特别注意了,这里所说的盈利平仓是指,这6张单加起来盈利,并不是某一张单盈利。

三、3个仓位池设计确保不息工作
趋势单是当前依把第二点描述加仓开仓的单,是盈利的主力(一个聪明的设计肯定不止一种赢利方式,哈哈)。但当技术指标判断大趋势(M30)已经反过来了,就得先把与新趋势下做单方向相反的单先锁起来,在新方向下继续依据第二点描述做单。此时锁定起来的单,形成锁定单仓位池。

     锁定单意思就是说之前行情是做多的,现在该做空了,那就不要在做多的方向上补单了。也不是说锁定后就不管它了,而是降低其盈利要求,只要它任何一张单独的单达到盈利1000点(即1美元),就开始追踪止赢,直到回撤300点(0.3美元),就盈利平仓。这样做一方面可以有一定机率再次降低风险的仓位(简单逻辑,开仓最大的单总是先盈利,而且更有趣的是有一定机率转向的时候整体浮亏,最后的单是浮盈的),另一方面是不要错过任何一个盈利的机会。

      最后要说的是保留单。做多做空再做多,那么原来因转换趋势而锁定的做多订单就得捡起来了。但此时有可能捡起来的订单,开单价与现时行情差矩太大,这样会导致快速补到4、5张单,也不能快速平仓,高仓位风险就来了,而且浪费行情。更糟糕的情况是,还未平仓,趋势又转了,这下一下子就会锁住非常高的仓位了。保留单仓位池就是解决这个问题的,锁定的单开仓价与行情价差太大,就先忽略它,做趋势单。直到价差小于3000点(假设第5张单与行情差3000点,此时浮亏大约是10%了),就按对应的开单方向转入锁定池或趋势池。

       另外,保留单有可能会保留很长时间,这不用担心。若理解了上面描述的,你应该知道,保留单基本都是低仓位的单,而且双向都有。首先,这在一定程度已经自带对冲功能了,其次行情总会向某一方向走,时间长了终会解除保留的。再者,按1盎司黄金落差100美元(100!)算,最多会形成双向的6张单(我预留10个坑位),最大浮亏也不超过30%。这是浮亏,不是真亏,就放着,让它跑回来就行了。还有,若你发现一张0.01手的单进入了锁单池或保留单并浮亏越来越大,请忽略它,总有机会让它盈利的。退一万步说,这张单能让你爆仓的条件是每盎司黄金上涨或下跌1000美元,但若真能有1000美元幅度,你会赚到笑。若双向都有单,那就真不用担心,自觉形成对冲了,哈哈。

四、三档移动止赢机制设计确保利润最大化

这是一个标准的移动止赢机制,比如第1档:当前趋势的订单总浮盈达到1000点(3美元)开始追踪,如果一直上涨,上涨到10美元、30美元都不会平仓,直到从最高点减少500点(0.5美元)才平仓。

     这里特别的是,我设计三档移动止赢机制,这三档都只是对趋势单有效。(实质上非趋势单是不会触碰到)

五、大小趋势加管壁突破互相咬合的技术指标再次降低风险

大小趋势(m30及m5)判断是结合hiken ashi smoothed 及macd技术指标,但大小趋势的判断准则上略有不同。

   大趋势要稳定,否则短暂的反向可能会导致反向订单的产生,造成反向仓位风险。看上图尾段has绿色的位置,若这图是在m30上的,则会判断为弱趋势,不改变做单方向,当然也不会再继续加仓。直至macd柱(看前一条k线)走到零轴上方并且has是绿色(看前一条k线),这时候才会判断为上升。这样以has为主,通过macd的组合为大趋势滤波,可以稳定平均时间在9小时以上的一波大行情。如图上红框都会稳定做sell单。

    小趋势要反应敏捷,在顺势时果段加仓,快速实现趋势单盈利平仓,在逆势时果段减仓降低风险。同样,看上图尾段has绿色的位置,若这图是在m5上的,则会判断为上升,只要macd柱在singnl线上方(看当前k线),并且has绿(看当前k线)即可。要敏捷为什么不用m1呢?因为我们还需要稳定一小段时间让ea有足够时间去赢利平仓。

   也有小趋势上has与macd判断是相反的时候,这时候其实是个振荡期,已经一定机率预示小趋势会反转,真进一步说,有一定机率预示着大趋势也会反。也就是做单方向可能需要反过来了。所以做小趋势变弱开始,就会追踪盈利减仓了。和上面说的一样,盈利一单追踪止赢减一单。

    这里还有一问题,就是如我价值观2所说的,技术指标是过去的反映。假若当前金价突破大涨或者跳水,技术指标是来不及反映的。这里我通过5条1分钟k线反向突破管壁开仓不加仓的策略去识别。管道壁这个思路来源于这个ea的指导者,也是发起人(下文会提及),这是行家的20年经验。下图1引自我与他的联天记录。当前后来,我通过一些数学方法验证其实是有科学根据的,下图2是我用python输出最近一周的区间突破值的散点图。横坐标是向下突破值,纵坐标是向上突破值,红色是我的m5组合判断为下降,绿是上升,蓝是弱趋势。有趣吧,一周38万个行情数据,38万个点,形成了一线直线。得出的道理很简单,蓝点弱趋势是行情反转概率最高的地方,在这地方不加仓(趋势下第2单之后)就是了。但开仓,若不开仓这么会让ea非常安全,但也经常不做单。上文说过了:其实低仓位那怕行情反转也无关系。

六、印象深刻的一些失败的试验

  • 选用更敏感的指标及更快的k线。
  • 浮亏过大对冲控制风险。

不细说了,主要原因是现在是北京时间9月1日17点31分。


七、感谢及补充说明
上文很多数据计算是按1000美元的本金算的,实际我的ea设计复利机制。进入了量化交易,你就得适应与浮亏共存,只要一开仓浮亏就存在,当盈利了就平仓,这是本策略的运作机制。

   本ea的开发及测试是从7月22日开始(为什么我记得清楚,因为这是我的机器上MT4最早的复盘数据),到本文编写完成,相熟的个别朋友已经在实盘上盈利了。1个月可以完成开发,不是强调我的编码能力有多强(哈哈,自信还是有的),而是因为我们有很强的行业专家作经验指导。这里要感谢贾总把20年经验变成一页页的a4文档,实际上在我刚开始编码时,我连什么是浮亏都得问。也要感谢锋哥、kj等人的支持,凭信任直接上实盘测试,也给了很多有价值的反馈。

同时我也想向同事证明,我们公司定位:不挑行业“做最好的信息化解决方案”,是可行的。我们差了的经验,我们的合作伙伴有,我们只需要做好信息化的这一块即可!对了,还得感谢一本书《金字塔原理》。依靠文字描述是无法达到编码的严紧级别的,这它的mice法则,是它的金字塔结构思想,让我理顺及补充每一种可能的情况。故,我也要咱们的每一个同事必须认真读一遍。

  1. //+------------------------------------------------------------------+
  2. //|                                             TestBreakThrouth.mq5 |
  3. //|                                            Copyright 2022,xszyou |
  4. //|                                           https://www.y00000.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2022,xszyou"
  7. #property link      "https://www.ooooo.com"
  8. #property version   "2022.11.08 v2.0.3"
  9. #property strict
  10. #property description " v2.0.3"
  11. #property description "1、还原基本逻辑不循环不锁浮亏;"
  12. #property description " v2.0.2"
  13. #property description "1、修复达到条件不锁浮亏的bug;"
  14. #property description " v2.0.1"
  15. #property description "1、增大落差,降低区间增长幅度;"
  16. #property description "2、到达浮亏或者指定单数开对冲单锁定浮亏;"
  17. #property description "3、优化日志系统;"
  18. #property description " v2.0.0"
  19. #property description "1、改用3轮循环制,用盈利区间换风险;"
  20. #property description "2、增加最大开单数参数,到达后不再开单"
  21. //+------------------------------------------------------------------+
  22. //| Expert initialization function                                   |
  23. //+------------------------------------------------------------------+
  24. input string set_auto = "============【自动交易】============";//=========【自动交易】========
  25. input int set0 = 555; //ea编号
  26. input int set1 = 10000;//多少金额购买0.01手
  27. input double set2 = 2.3;//开单区间(元)
  28. input double set3 = 1.3;//追踪止赢金额(元)
  29. input double set4 = 1.3;//到达赢利点区间(元)
  30. input double set5 = 0.5; //回撤多少平仓
  31. input int set6 = 6;//最大开单数
  32. input bool set9 = false;//结束后不再开新单
  33. int ma = 0;
  34. int time = 30;//开单间隔
  35. input int forceClosePrice = 100000;//浮亏多少强平
  36. double topBorder = 0;//上边界
  37. double bottomBorder = 0;//下边界
  38. int orderCount = 0;//订单数量
  39. int lastOrderOperator = OP_BUY;//最后的订单操作
  40. double followPrice = 0;
  41. bool follow = false;
  42. long nextOrderTime = 0;
  43. int mulriple = 1;
  44. int OnInit()
  45.   {
  46.    printfPro("init");
  47.    ma = set0;
  48.    printfPro("orders:");
  49.    for(int i=0;i<OrdersTotal();i++)
  50.      {
  51.       if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == ma)
  52.         {
  53.          OrderPrint();
  54.         }
  55.      }
  56.    printfPro("OrdersTotal:" + calcEaOrder("all", ma) + ",profit:" + calcTotalProfit(0, "all", ma));
  57.    printfPro("ma:" + ma);
  58.    topBorder = 0;//上边界
  59.    bottomBorder = 0;//下边界
  60.    orderCount = 0;//订单数量
  61.    lastOrderOperator = OP_BUY;//最后的订单操作
  62.    followPrice = 0;
  63.    follow = false;
  64. //---
  65.    return(INIT_SUCCEEDED);
  66.   }
  67. //+------------------------------------------------------------------+
  68. //| Expert deinitialization function                                 |
  69. //+------------------------------------------------------------------+
  70. void OnDeinit(const int reason)
  71.   {
  72. //---
  73.   }
  74. //+------------------------------------------------------------------+
  75. //| Expert tick function                                             |
  76. //+------------------------------------------------------------------+
  77. void OnTick()
  78.   {   
  79.    //浮亏过高强平
  80.    if(calcTotalProfit(0, "all", ma) < (0 - forceClosePrice))
  81.      {
  82.       closeAll();
  83.       printfPro("浮亏强平");
  84.      }
  85.    //更新追踪
  86.    if(orderCount != calcEaOrder("all", ma))
  87.      {
  88.       orderCount = calcEaOrder("all", ma);
  89.       if(orderCount > 0 && EDOrderSelect(orderCount - 1, ma))
  90.         {
  91.          topBorder = OrderOpenPrice();//上边界
  92.          bottomBorder = OrderOpenPrice();//下边界
  93.          lastOrderOperator = OrderType();//最后的订单操作
  94.         }else
  95.            {
  96.               topBorder = 0;//上边界
  97.               bottomBorder = 0;//下边界
  98.            }
  99.       followPrice = 0;
  100.       follow = false;
  101.       printfPro("重新开始追踪");
  102.      }
  103.      mulriple = AccountBalance() / set1 < 1 ? 1 : AccountBalance() / set1;
  104.    if(topBorder == 0)
  105.      {
  106.       topBorder = Ask;
  107.      }
  108.    if(bottomBorder == 0)
  109.      {
  110.       bottomBorder = Bid;
  111.      }
  112.    //开首单,隔开时间,防止几个窗口的ea同时开首单
  113.    if(orderCount == 0)
  114.      {
  115.       if(Ask > topBorder + 0.3 && !set9 && (OrdersTotal() == 0 || (OrderSelect(OrdersTotal() - 1, SELECT_BY_POS) && TimeCurrent() > OrderOpenTime() + 60)))
  116.         {
  117.          if(buy(0.01 * mulriple, OrdersTotal() + ":" + ma + "" + (orderCount + 1), Ask, ma))
  118.            {
  119.             orderCount ++;
  120.             topBorder = Ask;
  121.             lastOrderOperator = OP_BUY;
  122.             printfPro("开仓buy:" + 0.01 * mulriple);
  123.             nextOrderTime = (long)TimeCurrent() + time;
  124.            }
  125.         }
  126.       if(Bid < bottomBorder - 0.3 && !set9 && (OrdersTotal() == 0 || (OrderSelect(OrdersTotal() - 1, SELECT_BY_POS) && TimeCurrent() > OrderOpenTime() + 60)))
  127.         {
  128.          if(sell(0.01 * mulriple, OrdersTotal() + ":" + ma + "" + (orderCount + 1), Bid, ma))
  129.            {
  130.             orderCount ++;
  131.             bottomBorder = Bid;
  132.             lastOrderOperator = OP_SELL;
  133.             printfPro("开仓sell:" + 0.01 * mulriple);
  134.             nextOrderTime = (long)TimeCurrent() + time;
  135.            }
  136.         }
  137.      }
  138.    //加仓或移动止盈
  139.    if(lastOrderOperator == OP_BUY && orderCount > 0)
  140.      {
  141.        if(Bid < topBorder - set2)
  142.          {
  143.           if(orderCount < set6 )
  144.             {
  145.              //反向加仓
  146.              double p = MarketInfo(Symbol(), MODE_TICKVALUE) * (set4 / Point);//1手到达计算盈利追踪线盈利多少
  147.              double profix = calcTotalProfit((0 - set4 - (Ask - Bid))/Point, "all", ma);//计算到达盈利追踪线浮亏多少
  148.              double lots = NormalizeDouble((MathAbs(profix) + set3 * mulriple) / p, 2);
  149.              printfPro("准备加仓sell:" + lots);
  150.              if(sell(lots, OrdersTotal() + ":" + ma + "" +  (orderCount + 1), Bid, ma))
  151.                {
  152.                 printfPro("成功加仓sell:" + lots);
  153.                 bottomBorder = Bid;
  154.                 orderCount ++;
  155.                 lastOrderOperator = OP_SELL;
  156.                 nextOrderTime = (long)TimeCurrent() + time;
  157.                }
  158.             }
  159.          }
  160.        //移动止盈
  161.        if(follow == false && calcTotalProfit(0, "all", ma) >= set3  * mulriple)
  162.          {
  163.           follow = true;
  164.           followPrice = calcTotalProfit(0, "all", ma);
  165.           printfPro("追踪平仓:" + followPrice);
  166.          }
  167.        if(follow == true)
  168.          {
  169.           followPrice = followPrice < calcTotalProfit(0, "all", ma) ? calcTotalProfit(0, "all", ma) : followPrice;
  170.          }
  171.        if(follow == true && followPrice - calcTotalProfit(0, "all", ma) >= set5  * mulriple)
  172.          {
  173.            double temp = calcTotalProfit(0, "all", ma);
  174.            if(closeAll())
  175.              {
  176.               printfPro("盈利平仓:" + temp);
  177.               follow = false;
  178.               followPrice = 0;
  179.               topBorder = 0;
  180.               bottomBorder = 0;
  181.               orderCount = 0;
  182.               nextOrderTime = (long)TimeCurrent() + time;
  183.              }
  184.          }
  185.      }
  186.      if(lastOrderOperator == OP_SELL && orderCount > 0)
  187.      {
  188.        if(Ask > bottomBorder + set2)
  189.          {
  190.            if(orderCount < set6)
  191.              {
  192.               //反向加仓
  193.                 double p = MarketInfo(Symbol(), MODE_TICKVALUE) * (set4 / Point);//1手到达计算盈利追踪线盈利多少
  194.                 double profix = calcTotalProfit((0 + set4 + (Ask - Bid))/Point, "all", ma);//计算到达盈利追踪线浮亏多少
  195.                 double lots = NormalizeDouble((MathAbs(profix) + set3 * mulriple) / p, 2);
  196.                 printfPro("准备加仓buy:" + lots);
  197.                 if(buy(lots, OrdersTotal() + ":" + ma + "" +  (orderCount + 1), Ask, ma))
  198.                   {
  199.                    printfPro("成功加仓buy:" + lots);
  200.                    topBorder = Ask;
  201.                    orderCount ++;
  202.                    lastOrderOperator = OP_BUY;
  203.                    nextOrderTime = (long)TimeCurrent() + time;
  204.                   }
  205.              }
  206.          }
  207.        //移动止盈
  208.        if(follow == false && calcTotalProfit(0, "all", ma) >= set3 * mulriple)
  209.          {
  210.           follow = true;
  211.           followPrice = calcTotalProfit(0, "all", ma);
  212.           printfPro("追踪平仓:" + followPrice);
  213.          }
  214.        if(follow == true)
  215.          {
  216.           followPrice = followPrice < calcTotalProfit(0, "all", ma) ? calcTotalProfit(0, "all", ma) : followPrice;
  217.          }
  218.        if(follow == true && followPrice - calcTotalProfit(0, "all", ma) >= set5 * mulriple)
  219.          {
  220.            double temp = calcTotalProfit(0, "all", ma);
  221.            if(closeAll())
  222.              {
  223.               printfPro("盈利平仓:" + temp);
  224.               follow = false;
  225.               followPrice = 0;
  226.               topBorder = 0;
  227.               bottomBorder = 0;
  228.               orderCount = 0;
  229.               nextOrderTime = (long)TimeCurrent() + time;
  230.              }
  231.          }
  232.      }
  233.   }
  234. //+------------------------------------------------------------------+
  235. //买入多单
  236. bool buy(double lots, string comment, double price, int magic)
  237. {
  238.    return OrderSend(Symbol(),OP_BUY,lots,MarketInfo(Symbol(),MODE_ASK),0,0,0,"(" + magic + ")" + comment,magic,0,clrRed);
  239. }
  240. //买入空单
  241. bool sell(double lots, string comment, double price, int magic)
  242. {
  243.    return OrderSend(Symbol(),OP_SELL,lots,MarketInfo(Symbol(),MODE_BID),0,0,0,"(" + magic + ")" + comment,magic,0,clrRed);
  244. }
  245. //计算EA总盈亏
  246. double calcTotalProfit(double point, string type, int ma )
  247. {
  248.    double b_profit = 0;
  249.    double s_profit = 0;
  250.    for (int i= OrdersTotal() - 1; i >= 0; i--)
  251.    {
  252.          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  253.              {
  254.                   if( ma != 0 && OrderMagicNumber()==ma && OrderSymbol()==Symbol() )
  255.                      {
  256.                           if(OrderType()==OP_BUY)
  257.                              {
  258.                                b_profit+=OrderProfit()+(MarketInfo(Symbol(), MODE_TICKVALUE)*point*OrderLots())+OrderCommission()+OrderSwap(); //多盈亏                           
  259.                              }     
  260.                           if(OrderType()==OP_SELL)
  261.                              {
  262.                                s_profit+=OrderProfit()-(MarketInfo(Symbol(), MODE_TICKVALUE)*point*OrderLots())+OrderCommission()+OrderSwap(); //空盈亏                                                                        
  263.                              }      
  264.                       }
  265.                }
  266.      }
  267.      if(type == "sell")
  268.        {
  269.         return s_profit;
  270.        }
  271.      if(type == "buy")
  272.        {
  273.         return b_profit;
  274.        }
  275.      //printfPro("浮盈:" + (b_profit + s_profit));
  276.      return b_profit + s_profit;
  277. }
  278. bool closeAll()
  279.   {
  280.    Close_All_Order_DeadLine(Symbol(),"EA","BS",ma);
  281.    return true;
  282.   }
  283. //+------------------------------------------------------------------+
  284. //计算EA的订单数量
  285. int calcEaOrder(string op, int ma)
  286. {
  287.    int total = 0;
  288.    for (int i= OrdersTotal() - 1; i >= 0; i--)
  289.    {
  290.          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  291.              {
  292.                   if( OrderMagicNumber() == ma && OrderSymbol() == Symbol() )
  293.                      {
  294.                         if(op == "all")
  295.                           {
  296.                            total ++;   
  297.                           }
  298.                          if(op == "buy" && OrderType()==OP_BUY)
  299.                            {
  300.                             total ++;   
  301.                            }
  302.                           if(op == "sell" && OrderType()==OP_SELL)
  303.                             {
  304.                              total ++;   
  305.                             }
  306.                       }
  307.                }
  308.      }
  309.      return total;
  310. }
  311. //========所有单===================================================从神经刀偷过来
  312. void Close_All_Order_DeadLine (string symbol,string CountType,string Order_Type,int MaMa)
  313. {
  314.           for(int i=OrdersTotal()-1;i>=0;i--)
  315.             {
  316.                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  317.                  {
  318.                        if(symbol=="ALL" )//统计仓库所有货币 && 所有开单时间不能大于截止时间
  319.                          {
  320.                                if(CountType=="ALL")//EA及手工单  (不再筛选了 直接统计)
  321.                                    {
  322.                                            Close_Order(Order_Type);
  323.                                    }
  324.                                if(CountType=="EA")//EA单
  325.                                    {
  326.                                        if( OrderMagicNumber()==MaMa )   
  327.                                           {
  328.                                            Close_Order(Order_Type);                          
  329.                                           }                             
  330.                                    }
  331.                                if(CountType=="HAND")//手工单
  332.                                    {
  333.                                        if( OrderMagicNumber()==0 )   
  334.                                           {
  335.                                            Close_Order(Order_Type);                          
  336.                                           }                             
  337.                                    }  
  338.                                if(CountType=="EA_HAND")//手工单
  339.                                    {
  340.                                        if( OrderMagicNumber()==0 || OrderMagicNumber()==MaMa )   
  341.                                           {
  342.                                            Close_Order(Order_Type);                          
  343.                                           }                             
  344.                                    }                                          
  345.                          }
  346.          //==================================================================================               
  347.                        if(symbol!="ALL" && symbol==OrderSymbol() )//只统计指定货币 && 所有开单时间不能大于截止时间
  348.                          {
  349.                                if(CountType=="ALL")//EA及手工单  (不再筛选了 直接统计)
  350.                                    {
  351.                                            Close_Order(Order_Type);
  352.                                    }
  353.                                if(CountType=="EA")//EA单
  354.                                    {
  355.                                        if( OrderMagicNumber()==MaMa )   
  356.                                           {
  357.                                            Close_Order(Order_Type);                        
  358.                                           }                             
  359.                                    }
  360.                                if(CountType=="HAND")//手工单
  361.                                    {
  362.                                        if( OrderMagicNumber()==0 )   
  363.                                           {
  364.                                            Close_Order(Order_Type);   
  365.                                           }                       
  366.                                    }   
  367.                                if(CountType=="EA_HAND")//手工单
  368.                                    {
  369.                                        if( OrderMagicNumber()==0 || OrderMagicNumber()==MaMa )   
  370.                                           {
  371.                                            Close_Order(Order_Type);                        
  372.                                           }                             
  373.                                    }                                          
  374.                          }  
  375.          //==================================================================================            
  376.                  }
  377.             }//for end
  378. }//void End
  379. void Close_Order(string type)
  380. {
  381.    if(type=="LS_ALL")//删除挂单
  382.      {   
  383.          if(OrderType()>=2)
  384.            {
  385.              OrderDelete(OrderTicket());
  386.            }            
  387.      }  
  388.    if(type=="B")
  389.      {
  390.          if(OrderType()==OP_BUY )                             
  391.            {
  392.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300,clrYellow);
  393.            }     
  394.      }
  395.    if(type=="S")
  396.      {
  397.          if(OrderType()==OP_SELL)
  398.            {
  399.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300,clrYellow);
  400.            }     
  401.      }
  402.    if(type=="B_ALL")
  403.      {
  404.          if(OrderType()==OP_BUY )                             
  405.            {
  406.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  407.            }   
  408.          if(OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT )
  409.            {
  410.              OrderDelete(OrderTicket());
  411.            }               
  412.      }
  413.    if(type=="S_ALL")
  414.      {
  415.          if(OrderType()==OP_SELL)
  416.            {
  417.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  418.            }   
  419.          if(OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT )
  420.            {
  421.              OrderDelete(OrderTicket());
  422.            }               
  423.      }
  424.    if(type=="BS")
  425.      {
  426.          if(OrderType()==OP_BUY )                             
  427.            {
  428.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300,clrYellow);
  429.            }  
  430.          if(OrderType()==OP_SELL)
  431.            {
  432.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300,clrYellow);
  433.            }                           
  434.      }
  435.    if(type=="ALL")
  436.      {
  437.          if(OrderType()==OP_BUY )                             
  438.            {
  439.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  440.            }  
  441.          if(OrderType()==OP_SELL)
  442.            {
  443.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  444.            }   
  445.          if(OrderType()>1)
  446.            {
  447.              OrderDelete(OrderTicket());
  448.            }                          
  449.      }
  450. //===========================================================[WIN]============     
  451.    if(type=="B_B_Stop")
  452.      {
  453.          if(OrderType()==OP_BUY )                             
  454.            {
  455.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  456.            }     
  457.          if(OrderType()==OP_BUYSTOP)
  458.            {
  459.              OrderDelete(OrderTicket());
  460.            }            
  461.      }   
  462.    if(type=="B_Stop")
  463.      {   
  464.          if(OrderType()==OP_BUYSTOP)
  465.            {
  466.              OrderDelete(OrderTicket());
  467.            }            
  468.      }      
  469.    if(type=="S_S_Stop")
  470.      {
  471.          if(OrderType()==OP_SELL)
  472.            {
  473.              OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  474.            }     
  475.          if(OrderType()==OP_SELLSTOP)
  476.            {
  477.              OrderDelete(OrderTicket());
  478.            }            
  479.      }   
  480.    if(type=="S_Stop")
  481.      {  
  482.          if(OrderType()==OP_SELLSTOP)
  483.            {
  484.              OrderDelete(OrderTicket());
  485.            }            
  486.      }  
  487.    if(type=="B_Limit")
  488.      {  
  489.          if(OrderType()==OP_BUYLIMIT)
  490.            {
  491.              OrderDelete(OrderTicket());
  492.            }            
  493.      }   
  494.    if(type=="S_Limit")
  495.      {  
  496.          if(OrderType()==OP_SELLLIMIT)
  497.            {
  498.              OrderDelete(OrderTicket());
  499.            }            
  500.      }                 
  501. //===========================================================[WIN]============
  502.      if(type=="BS_WIN")//统计Sell and SellStop
  503.         {
  504.            if(OrderType()==OP_SELL || OrderType()==OP_BUY)
  505.               {
  506.                   if( OrderProfit()+OrderCommission()+OrderSwap()>0 )
  507.                     {
  508.                         if(OrderType()==OP_BUY )                             
  509.                           {
  510.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  511.                           }  
  512.                         if(OrderType()==OP_SELL)
  513.                           {
  514.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  515.                           }                        
  516.                     }
  517.               }                             
  518.         }
  519.      if(type=="B_WIN")//统计Sell and SellStop
  520.         {
  521.            if(OrderType()==OP_BUY )
  522.               {
  523.                   if( OrderProfit()+OrderCommission()+OrderSwap()>0 )
  524.                     {
  525.                         if(OrderType()==OP_BUY )                             
  526.                           {
  527.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  528.                           }  
  529.                     }
  530.               }                             
  531.         }   
  532.      if(type=="S_WIN")//统计Sell and SellStop
  533.         {
  534.            if(OrderType()==OP_SELL )
  535.               {
  536.                   if( OrderProfit()+OrderCommission()+OrderSwap()>0 )
  537.                     {
  538.                         if(OrderType()==OP_SELL)
  539.                           {
  540.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  541.                           }
  542.                     }
  543.               }                             
  544.         }      
  545. //===========================================================[LOSS]============
  546.      if(type=="BS_LOSS")//统计Sell and SellStop
  547.         {
  548.            if(OrderType()==OP_SELL || OrderType()==OP_BUY)
  549.               {
  550.                   if( OrderProfit()+OrderCommission()+OrderSwap()<0 )
  551.                     {
  552.                         if(OrderType()==OP_BUY )                             
  553.                           {
  554.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  555.                           }  
  556.                         if(OrderType()==OP_SELL)
  557.                           {
  558.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  559.                           }                        
  560.                     }
  561.               }                             
  562.         }
  563.      if(type=="B_LOSS")//统计Sell and SellStop
  564.         {
  565.            if(OrderType()==OP_BUY )
  566.               {
  567.                   if( OrderProfit()+OrderCommission()+OrderSwap()<0 )
  568.                     {
  569.                         if(OrderType()==OP_BUY )                             
  570.                           {
  571.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),300);
  572.                           }  
  573.                     }
  574.               }                             
  575.         }   
  576.      if(type=="S_LOSS")//统计Sell and SellStop
  577.         {
  578.            if(OrderType()==OP_SELL )
  579.               {
  580.                   if( OrderProfit()+OrderCommission()+OrderSwap()<0 )
  581.                     {
  582.                         if(OrderType()==OP_SELL)
  583.                           {
  584.                             OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),300);
  585.                           }
  586.                     }
  587.               }                             
  588.         }            
  589. }
  590. //计算开单量
  591. double calcTotalLots(string op, int ma)
  592. {
  593.    double lots = 0.00;
  594.    for (int i= OrdersTotal() - 1; i >= 0; i--)
  595.    {
  596.          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  597.              {
  598.                   if( OrderMagicNumber() == ma && OrderSymbol()==Symbol() )
  599.                      {
  600.                           if(op == "all")
  601.                             {
  602.                              lots += OrderLots();
  603.                             }
  604.                           if(op == "buy" && OrderType()==OP_BUY)
  605.                              {
  606.                                lots += OrderLots();                           
  607.                              }     
  608.                           if(op == "sell" && OrderType()==OP_SELL)
  609.                              {
  610.                                lots += OrderLots();                                                                        
  611.                              }      
  612.                       }
  613.                }
  614.      }
  615.      return lots;
  616. }
  617. //替换orderselect
  618. bool EDOrderSelect(int index, int ma)
  619. {
  620.    int count = -1;
  621.    for(int i=0;i<OrdersTotal();i++)
  622.      {
  623.       if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == ma)
  624.         {
  625.          count ++;
  626.         }
  627.       if(count == index)
  628.         {
  629.          return true;
  630.         }
  631.      }
  632.    return false;
  633. }
  634. //日志输出
  635. string afterPrint = "";
  636. void printfPro(string text, bool once = false)
  637. {
  638.    if(!once || text != afterPrint)
  639.      {
  640.       printf("(" + ma + ")" + text);
  641.       afterPrint=text;
  642.      }
  643. }
复制代码
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论1

EA支架
DD
| 发表于 2022-12-8 14:05:49 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)