【漆学军】分享我自用多年的马丁策略EA完整源码及参数(winkey),曾半年将我账户翻3倍  

| 发表于 2021-6-7 17:59:00 | 显示全部楼层 |复制链接
马丁策略一直都是具有很大争议的,因为有太多的人使用这个策略爆仓了,但是依然有人使用这个赚钱了。那些使用这个策略爆仓了的人会认为马丁策略不行,是垃圾,我是不同意这种说法的。

比如说过马路有人被车撞死了,你是要取消马路,还是要取消汽车呢?
吃饭有人被噎死了,那就不要在吃饭了吗?
正因为上面问题的答案都是不能,所以我们也不能说马丁策略是垃圾策略。

天下大势,分久必合,合久必分。
外汇行情,涨久必跌,跌久必涨。
万事万物无不遵从这种因果循环的规律。
就像正弦曲线图一样,上下上下周而复始,循环往复。
34317762b5fb2e39686a7fa966825043.png
而马丁策略正是适合这种波动形状的震荡行情。如果行情只上涨不下跌,或者只下跌不上涨,那么使用马丁策略是不适合的。

为什么大多数人使用马丁策略会亏损?是因为太贪婪了。

打个比方,EURUSD,一波行情波动个100点不回头是很常见的,但是有些人10000美金账户,0.1手起步,每隔10个点就加仓,而且加仓手数是直接翻倍为0.2手,0.4手,0.8手,1.6手。。。,这么做,盈利起来自然是很快,但是账户很可能抗不过100点就会显示资金不够用,无法下更多的单子,最终导致账户很快爆仓。

如果能够想到办法降低预期盈利,那么也就大大降低了风险。

有两种方法可做到:
加大加仓间隔,每隔60点到600点加仓。
减少加仓手数倍数,交易手数不要每次直接2倍往上翻,可以设定每次的手数是前一次单子手数的1.5倍即可。
使用了低风险的马丁策略之后,盈利的时间就变得越来越长了,虽然盈利并不多,但是在长时间积累之后,实际的盈利率其实并不低。
3ac01051dcc8c02fb8c5a7e7be299720.png
这款EA是我在2011年开发的,命名为Winkey,意为盈利的密码,今天稍加了修改,只是为了适应当前的MT4平台。当年测试这个EA的时候,我用了一个500美金的真实账户,半年账户做到了1800美金,当时用的参数加仓间隔是60点,加仓手数倍数是1.2倍。这就是我使用马丁策略盈利的经验,分享给大家。

EA程序完整源码如下,可复制粘贴过去使用,但是请注意参数做成了数组,需要在数组里面直接修改加仓间隔和加仓手数倍数:
(截图为部分代码,截图下面是全部完整的winkey代码,200行左右。)
35344c02dc76da04a6777be5a82ac14e.png
全部源码如下:
  1. //+------------------------------------------------------------------+
  2. //|                                                       Winkey.mq4 |
  3. //|                                Copyright @2021, 80364276@qq.com  |
  4. //|                                          http://www.study-ea.com |
  5. //+------------------------------------------------------------------+
  6. //去掉了全局变量设置。
  7. //去掉了加仓方案设置,加仓方案按照数组里面设置。
  8. //增加了停止开新仓的设置,意思是当前一波结束了不再下单。
  9. //ea运行途中可随时设置参数,不会影响运行效果。
  10. //-------------------------------------------------------------------
  11. #property copyright "Copyright @2011, 80364276@qq.com "
  12. #property link      "http://www.study-ea.com"
  13. #property version   "1.00"
  14. #property description "间隔:0, 20,20,15,15,20,20,30。"
  15. #property description "倍率:1, 2, 1, 2, 1, 3, 2, 4。"
  16. #property description "最大交易量5手,大于5手不开仓。"
  17. #property strict
  18. //-------------------------------------------------------------------
  19. input int Magic=1800; //魔术码
  20. input bool IsStop=false; //当前一波结束是否停止
  21. input double lots=0.01; //初始手数
  22. //-加仓时的间隔点数,数组从0开始
  23. int Interval_Pips[20]= {0, 20,20,15,15,20,20,30};
  24. //-加仓时的交易量倍数
  25. int Interval_Lots[20]= {1, 2, 1, 2, 1, 3, 2, 4};
  26. int slippage=3;
  27. input int TP=300; //止盈点数
  28. input int SL=2000;//止损点数
  29. //止损点数为第一单的止损点数计算出来的价格作为每一单的止损价。加仓的时候会考虑下单价格距离止损价太近就不加仓。
  30. string comt="WinKey->";
  31. int i,db=1;
  32. int Digitslots;
  33. //+------------------------------------------------------------------+
  34. //| expert initialization function                                   |
  35. //+------------------------------------------------------------------+
  36. int OnInit()
  37.   {
  38. //----
  39.    double minlot=MarketInfo(Symbol(),MODE_MINLOT);
  40.    if(minlot==0.001) Digitslots=3;
  41.    if(minlot==0.01) Digitslots=2;
  42.    if(minlot==0.1) Digitslots=1;
  43.    if(MarketInfo(Symbol(),MODE_DIGITS)==5 || MarketInfo(Symbol(),MODE_DIGITS)==3)
  44.      {
  45.       Print("五位小数平台.");
  46.       db=10;
  47.      }
  48.    else   Print("四位小数平台.");
  49. //----
  50.    return(0);
  51.   }
  52. //+------------------------------------------------------------------+
  53. //| expert deinitialization function                                 |
  54. //+------------------------------------------------------------------+
  55. void OnDeinit(const int reason)
  56.   {
  57. //----
  58.    Comment("");
  59. //----
  60.    return;
  61.   }
  62. //+------------------------------------------------------------------+
  63. //| expert start function                                            |
  64. //+------------------------------------------------------------------+
  65. void OnTick()
  66.   {
  67. //----
  68.    int buys=0,sells=0,signal=0;
  69.    int result=0;
  70.    double LastBuyPrice=0,LastSellPrice=0,SLp=0,TPp=0;
  71.    double top=0,tol=0,avp=0;
  72. //----统计
  73.    for(i=0; i<=OrdersTotal()-1; i++)
  74.      {
  75.       result=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
  76.       if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
  77.       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
  78.         {
  79.          if(OrderType()==OP_BUY)
  80.            {
  81.             buys++;
  82.             LastBuyPrice=OrderOpenPrice();
  83.             tol=tol+OrderLots();
  84.             top=top+OrderLots()*OrderOpenPrice();
  85.             if(SLp==0 && SL>0) SLp=OrderOpenPrice()-SL*db*Point;
  86.            }
  87.          if(OrderType()==OP_SELL)
  88.            {
  89.             sells++;
  90.             LastSellPrice=OrderOpenPrice();
  91.             tol=tol+OrderLots();
  92.             top=top+OrderLots()*OrderOpenPrice();
  93.             if(SLp==0 && SL>0) SLp=OrderOpenPrice()+SL*db*Point;
  94.            }
  95.         }
  96.      }
  97.    if(tol>0)
  98.      {
  99.       avp=NormalizeDouble(top/tol,Digits);
  100.       if(buys>0) TPp=avp+TP*db*Point;
  101.       if(sells>0) TPp=avp-TP*db*Point;
  102.      }
  103. //----显示信息---
  104.    int ti;
  105.    if(buys>0) ti=buys;
  106.    else ti=sells;
  107.    string dsy="\nWinKey\n";
  108.    dsy=dsy+"===================\n";
  109.    dsy=dsy+"P.Lots             ="+DoubleToStr(NormalizeDouble(lots,Digitslots),Digitslots)    +"\n";
  110.    dsy=dsy+"P.SL               ="+IntegerToString(SL)    +"\n";
  111.    dsy=dsy+"P.TP              ="+IntegerToString(TP)    +"\n";
  112.    dsy=dsy+"P.MAGIC       ="+IntegerToString(Magic)    +"\n";
  113.    dsy=dsy+"===================\n";
  114.    dsy=dsy+"B.Numbers      ="+IntegerToString(buys)    +"\n";
  115.    dsy=dsy+"S.Numbers      ="+IntegerToString(sells)   +"\n";
  116.    dsy=dsy+"LastB.Price      ="+DoubleToStr(LastBuyPrice,Digits)  +"\n";
  117.    dsy=dsy+"LastS.Price      ="+DoubleToStr(LastSellPrice,Digits)  +"\n";
  118.    dsy=dsy+"SL.Price          ="+DoubleToStr(SLp,Digits)  +"\n";
  119.    dsy=dsy+"TP.Price         ="+DoubleToStr(TPp,Digits)  +"\n";
  120.    dsy=dsy+"NEXT.Lots      ="+DoubleToStr(NormalizeDouble(Interval_Lots[ti]*lots,Digitslots),Digitslots)    +"\n";
  121.    dsy=dsy+"NEXT.Pips      ="+IntegerToString(Interval_Pips[ti])    +"\n";
  122.    dsy=dsy+"===================\n";
  123.    Comment(dsy);
  124. //----修改订单
  125.    for(i=0; i<=OrdersTotal()-1; i++)
  126.      {
  127.       result=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
  128.       if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
  129.       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
  130.         {
  131.          if(OrderType()==OP_BUY)
  132.            {
  133.             if(SLp>0 && DoubleToStr(OrderStopLoss(),Digits)!=DoubleToStr(SLp,Digits))
  134.               {
  135.                result=OrderModify(OrderTicket(),OrderOpenPrice(),SLp,OrderTakeProfit(),0,Green);
  136.                if(result<0) Print("BUY 止损修改出错"+DoubleToStr(OrderStopLoss(),Digits)+"-->"+DoubleToStr(SLp,Digits));
  137.                else return;
  138.               }
  139.             if(TPp>0 && DoubleToStr(OrderTakeProfit(),Digits)!=DoubleToStr(TPp,Digits))
  140.               {
  141.                result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TPp,0,Green);
  142.                if(result<0) Print("BUY 止盈修改出错"+DoubleToStr(OrderTakeProfit(),Digits)+"-->"+DoubleToStr(TPp,Digits));
  143.                else return;
  144.               }
  145.            }
  146.          if(OrderType()==OP_SELL)
  147.            {
  148.             if(SLp>0 && DoubleToStr(OrderStopLoss(),Digits)!=DoubleToStr(SLp,Digits))
  149.               {
  150.                result=OrderModify(OrderTicket(),OrderOpenPrice(),SLp,OrderTakeProfit(),0,Red);
  151.                if(result<0) Print("SELL 止损修改出错"+DoubleToStr(OrderStopLoss(),Digits)+"-->"+DoubleToStr(SLp,Digits));
  152.                else return;
  153.               }
  154.             if(TPp>0 && DoubleToStr(OrderTakeProfit(),Digits)!=DoubleToStr(TPp,Digits))
  155.               {
  156.                result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TPp,0,Red);
  157.                if(result<0) Print("SELL 止盈修改出错"+DoubleToStr(OrderTakeProfit(),Digits)+"-->"+DoubleToStr(TPp,Digits));
  158.                else return;
  159.               }
  160.            }
  161.         }
  162.      }
  163. //--------------------------------------------------
  164. //第一单
  165.    if(buys+sells==0 && IsStop==false)
  166.      {
  167.       signal=signal();
  168.       if(signal==1 && NormalizeDouble(lots*Interval_Lots[buys],Digitslots)<=5)
  169.          result=OrderSend(Symbol(), OP_BUY, NormalizeDouble(lots*Interval_Lots[buys],Digitslots), Ask, slippage*db, 0, 0, comt+"0", Magic, 0, Green);
  170.       if(signal==-1 && NormalizeDouble(lots*Interval_Lots[sells],Digitslots)<=5)
  171.          result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(lots*Interval_Lots[sells],Digitslots), Bid, slippage*db, 0, 0, comt+"0", Magic, 0, Red);
  172.       return;
  173.      }
  174. //----
  175.    if(buys==0 && sells>0 && NormalizeDouble(lots*Interval_Lots[sells],Digitslots)<=5)
  176.      {
  177.       if(Bid-LastSellPrice>=Interval_Pips[sells]*db*Point && TimeCurrent()-Time[0]<60 && SLp-Bid>Interval_Pips[sells]*db*Point)
  178.         {
  179.          result=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lots*Interval_Lots[sells],Digitslots),Bid,slippage*db,0,0,comt+IntegerToString(sells),Magic,0,Red);
  180.          return;
  181.         }
  182.      }
  183.    if(buys>0 && sells==0 && NormalizeDouble(lots*Interval_Lots[buys],Digitslots)<=5)
  184.      {
  185.       if(LastBuyPrice-Ask>=Interval_Pips[buys]*db*Point && TimeCurrent()-Time[0]<60 && Ask-SLp>Interval_Pips[buys]*db*Point)
  186.         {
  187.          result=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lots*Interval_Lots[buys],Digitslots),Ask,slippage*db,0,0,comt+IntegerToString(buys),Magic,0,Green);
  188.          return;
  189.         }
  190.      }
  191. //----
  192.    return;
  193.   }
  194. //+------------------------------------------------------------------+
  195. int signal()
  196.   {
  197.    int res;
  198.    if(Close[1]<Open[1]) res=-1;
  199.    else res=1;
  200.    return(res);
  201.   }
  202. //+------------------------------------------------------------------+
复制代码
举报

评论 使用道具

精彩评论7

daerwushen
DD
| 发表于 5 天前 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

Leonjo
DDD
| 发表于 5 天前 来自手机 | 显示全部楼层
感謝分享資訊
举报

点赞 评论 使用道具

zjfzjf2
DDD
| 发表于 5 天前 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

mydiis
DDD
| 发表于 4 天前 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

漢聲山峰
DDD
| 发表于 4 天前 | 显示全部楼层
謝謝分享
举报

点赞 评论 使用道具

巴比伦雄鹰
DDD
| 发表于 4 天前 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

s1030hk
DDD
| 发表于 4 天前 | 显示全部楼层
小手一抖,积分到手
举报

点赞 评论 使用道具

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