龙虎大师

 找回密码
 立即注册

微信登录,快人一步

查看: 491|回复: 51

[MQL4(MT4)] [ea]BollTrade_Ron_MT4_v03c

[复制链接]

478

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
90687
发表于 2019-4-29 13:14:43 | 显示全部楼层 |阅读模式
  1. //+------+
  2. //|BollTrade
  3. //+------+
  4. #property copyright "Ron Thompson"
  5. #property link      "http://www.lightpatch.com/forex"


  6. // user input
  7. extern double ProfitMade   =       3;    // how much money do you expect to make
  8. extern double LossLimit    =      20;    // how much loss can you tolorate
  9. extern double BDistance    =       3;    // plus how much
  10. extern int    BPeriod      =       4;    // Bollinger period
  11. extern int    Deviation    =       2;    // Bollinger deviation
  12. extern double Lots         =       1.0;  // how many lots to trade at a time
  13. extern bool   LotIncrease  =    true;    // grow lots based on balance = true

  14. // non-external flag settings
  15. int    Slippage=2;                       // how many pips of slippage can you tolorate
  16. bool   logging=false;                    // log data or not
  17. bool   logerrs=false;                    // log errors or not
  18. bool   logtick=false;                    // log tick data while orders open (or not)
  19. bool   OneOrderOnly=true ;               // one order at a time or not

  20. // naming and numbering
  21. int    MagicNumber  = 200607121116;      // allows multiple experts to trade on same account
  22. string TradeComment = "_bolltrade_v01.txt";   // comment so multiple EAs can be seen in Account History
  23. double StartingBalance=0;                // lot size control if LotIncrease == true

  24. // Bar handling
  25. datetime bartime=0;                      // used to determine when a bar has moved
  26. int      bartick=0;                      // number of times bars have moved

  27. // Trade control
  28. bool   TradeAllowed=true;                // used to manage trades


  29. // Min/Max tracking and tick logging
  30. int    maxOrders;                        // statistic for maximum numbers or orders open at one time
  31. double maxEquity;                        // statistic for maximum equity level
  32. double minEquity;                        // statistic for minimum equity level
  33. double maxOEquity;                       // statistic for maximum equity level per order
  34. double minOEquity;                       // statistic for minimum equity level per order
  35. double EquityPos=0;                      // statistic for number of ticks order was positive
  36. double EquityNeg=0;                      // statistic for number of ticks order was negative
  37. double EquityZer=0;                      // statistic for number of ticks order was zero

  38. // used for verbose error logging
  39. #include <stdlib.mqh>


  40. //+-------------+
  41. //| Custom init |
  42. //|-------------+
  43. // Called ONCE when EA is added to chart or recompiled

  44. int init()
  45.   {
  46.    if(LotIncrease)
  47.      {
  48.       StartingBalance=AccountBalance()/Lots;
  49.       logwrite(TradeComment,"LotIncrease ACTIVE Account balance="+AccountBalance()+" Lots="+Lots+" StartingBalance="+StartingBalance);
  50.      }
  51.     else
  52.      {
  53.       logwrite(TradeComment,"LotIncrease NOT ACTIVE Account balance="+AccountBalance()+" Lots="+Lots);
  54.      }

  55.    logwrite(TradeComment,"Init Complete");
  56.    Comment(" ");
  57.   }

  58. //+----------------+
  59. //| Custom DE-init |
  60. //+----------------+
  61. // Called ONCE when EA is removed from chart

  62. int deinit()
  63.   {

  64.    // always indicate deinit statistics
  65.    logwrite(TradeComment,"MAX number of orders "+maxOrders);
  66.    logwrite(TradeComment,"MAX equity           "+maxEquity);
  67.    logwrite(TradeComment,"MIN equity           "+minEquity);

  68.    // so you can see stats in journal
  69.    Print("MAX number of orders "+maxOrders);
  70.    Print("MAX equity           "+maxEquity);
  71.    Print("MIN equity           "+minEquity);


  72.    logwrite(TradeComment,"DE-Init Complete");
  73.    
  74.    Comment(" ");
  75.   }


  76. //+-----------+
  77. //| Main      |
  78. //+-----------+
  79. // Called EACH TICK and each Bar[]

  80. int start()
  81.   {

  82.    int      cnt=0;
  83.    int      gle=0;
  84.    int      ticket=0;
  85.    int      OrdersPerSymbol=0;
  86.    int      OrdersBUY=0;
  87.    int      OrdersSELL=0;
  88.   
  89.    // stoploss and takeprofit and close control
  90.    double SL=0;
  91.    double TP=0;
  92.    double CurrentProfit=0;
  93.    double CurrentBasket=0;
  94.    
  95.    // direction control
  96.    bool BUYme=false;
  97.    bool SELLme=false;
  98.       
  99.    // bar counting
  100.    if(bartime!=Time[0])
  101.      {
  102.       bartime=Time[0];
  103.       bartick++;
  104.       TradeAllowed=true;
  105.      }

  106.    // Lot increasement based on AccountBalance when expert is started
  107.    // this will trade 1.0, then 1.1, then 1.2 etc as account balance grows
  108.    // or 0.9 then 0.8 then 0.7 as account balance shrinks
  109.    if(LotIncrease)
  110.      {
  111.       Lots=NormalizeDouble(AccountBalance()/StartingBalance,1);
  112.       if(Lots>500.0) Lots=500.0;
  113.      }


  114.    OrdersPerSymbol=0;
  115.    for(cnt=OrdersTotal();cnt>=0;cnt--)
  116.      {
  117.       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  118.       if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
  119.         {
  120.          OrdersPerSymbol++;
  121.          if(OrderType()==OP_BUY) {OrdersBUY++;}
  122.          if(OrderType()==OP_SELL){OrdersSELL++;}
  123.         }
  124.      }
  125.    
  126.    // keep some statistics
  127.    if(OrdersPerSymbol>maxOrders) maxOrders=OrdersPerSymbol;

  128.      
  129.    //+-----------------------------+
  130.    //| Insert your indicator here  |
  131.    //| And set either BUYme or     |
  132.    //| SELLme true to place orders |
  133.    //+-----------------------------+
  134.    
  135.    double bup=iBands(Symbol(),0,BPeriod,Deviation,0,PRICE_OPEN,MODE_UPPER,0);
  136.    double bdn=iBands(Symbol(),0,BPeriod,Deviation,0,PRICE_OPEN,MODE_LOWER,0);
  137.    
  138.    if(Close[0]>bup+(BDistance*Point)) SELLme=true;
  139.    if(Close[0]<bdn-(BDistance*Point))  BUYme=true;
  140.    

  141.    //+------------+
  142.    //| End Insert |
  143.    //+------------+

  144.    //ENTRY LONG (buy, Ask)
  145.    if( (OneOrderOnly && OrdersPerSymbol==0 && BUYme)||(!OneOrderOnly && TradeAllowed && BUYme) )
  146.      {
  147.       while(true)
  148.         {
  149.          if(LossLimit ==0) SL=0; else SL=Ask-((LossLimit+10)*Point );
  150.          if(ProfitMade==0) TP=0; else TP=Ask+((ProfitMade+10)*Point );
  151.          ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,TradeComment,MagicNumber,White);
  152.          gle=GetLastError();
  153.          if(gle==0)
  154.            {
  155.             if(logging) logwrite(TradeComment,"BUY Ticket="+ticket+" Ask="+Ask+" Lots="+Lots+" SL="+SL+" TP="+TP);
  156.             maxOEquity=0;
  157.             minOEquity=0;
  158.             EquityPos=0;
  159.             EquityNeg=0;
  160.             EquityZer=0;
  161.             TradeAllowed=false;
  162.             break;
  163.            }
  164.             else
  165.            {
  166.             if(logerrs) logwrite(TradeComment,"-----ERROR-----  opening BUY order :"+gle+" ticket="+ticket+" "+ErrorDescription(gle));
  167.            }
  168.         }//while   
  169.      }//BUYme
  170.         

  171.    //ENTRY SHORT (sell, Bid)
  172.    if( (OneOrderOnly && OrdersPerSymbol==0 && SELLme)||(!OneOrderOnly && TradeAllowed && SELLme) )
  173.      {
  174.       while(true)
  175.         {
  176.          if(LossLimit ==0) SL=0; else SL=Bid+((LossLimit+10)*Point );
  177.          if(ProfitMade==0) TP=0; else TP=Bid-((ProfitMade+10)*Point );
  178.          ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,TradeComment,MagicNumber,Red);
  179.          gle=GetLastError();
  180.          if(gle==0)
  181.            {
  182.             if(logging) logwrite(TradeComment,"SELL Ticket="+ticket+" Bid="+Bid+" Lots="+Lots+" SL="+SL+" TP="+TP);
  183.             maxOEquity=0;
  184.             minOEquity=0;
  185.             EquityPos=0;
  186.             EquityNeg=0;
  187.             EquityZer=0;
  188.             TradeAllowed=false;
  189.             break;
  190.            }
  191.             else
  192.            {
  193.             if(logerrs) logwrite(TradeComment,"-----ERROR-----  opening SELL order :"+gle+" ticket="+ticket+" "+ErrorDescription(gle));
  194.            }
  195.         }//while
  196.      }//SELLme

  197.      
  198.    // accumulate statistics
  199.    CurrentBasket=AccountEquity()-AccountBalance();
  200.    if(CurrentBasket>maxEquity) { maxEquity=CurrentBasket; maxOEquity=CurrentBasket; }
  201.    if(CurrentBasket<minEquity) { minEquity=CurrentBasket; minOEquity=CurrentBasket; }
  202.    if(CurrentBasket>0)  EquityPos++;
  203.    if(CurrentBasket<0)  EquityNeg++;
  204.    if(CurrentBasket==0) EquityZer++;
  205.    

  206.    //
  207.    // Order Management
  208.    //
  209.    for(cnt=OrdersTotal();cnt>=0;cnt--)
  210.      {
  211.       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  212.       if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber )
  213.         {
  214.         
  215.          if(OrderType()==OP_BUY)
  216.            {
  217.             CurrentProfit=Bid-OrderOpenPrice() ;
  218.             if(logtick) logwrite(TradeComment,"BUY  CurrentProfit="+CurrentProfit/Point+" CurrentBasket="+CurrentBasket/Point);


  219.             //
  220.             // Did we make a profit
  221.             //======================
  222.             //
  223.             if(ProfitMade>0 && CurrentProfit>=(ProfitMade*Point))
  224.               {
  225.                while(true)
  226.                  {
  227.                   OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
  228.                   gle=GetLastError();
  229.                   if(gle==0)
  230.                     {
  231.                      if(logging) logwrite(TradeComment,"CLOSE BUY PROFIT Ticket="+OrderTicket()+" SL="+SL+" TP="+TP);
  232.                      if(logging) logwrite(TradeComment,"MAX order equity "+maxOEquity);
  233.                      if(logging) logwrite(TradeComment,"MIN order equity "+minOEquity);
  234.                      if(logging) logwrite(TradeComment,"order equity positive ticks ="+EquityPos);
  235.                      if(logging) logwrite(TradeComment,"order equity negative ticks ="+EquityNeg);
  236.                      if(logging) logwrite(TradeComment,"order equity   zero   ticks ="+EquityZer);
  237.                      break;
  238.                     }
  239.                    else
  240.                     {
  241.                      if(logerrs) logwrite(TradeComment,"-----ERROR----- CLOSE BUY PROFIT Bid="+Bid+" error="+gle+" "+ErrorDescription(gle));
  242.                     }
  243.                  }//while
  244.               }//if
  245.               

  246.             //
  247.             // Did we take a loss
  248.             //====================
  249.             //
  250.             if( LossLimit>0 && CurrentProfit<=(LossLimit*(-1)*Point)  )
  251.               {
  252.                while(true)
  253.                  {
  254.                   OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
  255.                   gle=GetLastError();
  256.                   if(gle==0)
  257.                     {
  258.                      if(logging) logwrite(TradeComment,"CLOSE BUY LOSS Ticket="+OrderTicket()+" SL="+SL+" TP="+TP);
  259.                      if(logging) logwrite(TradeComment,"MAX order equity "+maxOEquity);
  260.                      if(logging) logwrite(TradeComment,"MIN order equity "+minOEquity);
  261.                      if(logging) logwrite(TradeComment,"order equity positive ticks ="+EquityPos);
  262.                      if(logging) logwrite(TradeComment,"order equity negative ticks ="+EquityNeg);
  263.                      if(logging) logwrite(TradeComment,"order equity   zero   ticks ="+EquityZer);
  264.                      break;
  265.                     }
  266.                    else
  267.                     {
  268.                      if(logerrs) logwrite(TradeComment,"-----ERROR----- CLOSE BUY LOSS Bid="+Bid+" error="+gle+" "+ErrorDescription(gle));
  269.                     }
  270.                  }//while
  271.                  
  272.               }//if
  273.               
  274.            } // if BUY


  275.          if(OrderType()==OP_SELL)
  276.            {

  277.             CurrentProfit=OrderOpenPrice()-Ask;
  278.             if(logtick) logwrite(TradeComment,"SELL CurrentProfit="+CurrentProfit/Point+" CurrentBasket="+CurrentBasket/Point);


  279.             //
  280.             // Did we make a profit
  281.             //======================
  282.             //
  283.             if( ProfitMade>0 && CurrentProfit>=(ProfitMade*Point) )
  284.               {
  285.                while(true)
  286.                  {
  287.                   OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
  288.                   gle=GetLastError();
  289.                   if(gle==0)
  290.                     {
  291.                      if(logging) logwrite(TradeComment,"CLOSE SELL PROFIT Ticket="+OrderTicket()+" SL="+SL+" TP="+TP);
  292.                      if(logging) logwrite(TradeComment,"MAX order equity "+maxOEquity);
  293.                      if(logging) logwrite(TradeComment,"MIN order equity "+minOEquity);
  294.                      if(logging) logwrite(TradeComment,"order equity positive ticks ="+EquityPos);
  295.                      if(logging) logwrite(TradeComment,"order equity negative ticks ="+EquityNeg);
  296.                      if(logging) logwrite(TradeComment,"order equity   zero   ticks ="+EquityZer);
  297.                      break;
  298.                     }
  299.                      else
  300.                     {
  301.                      if(logerrs) logwrite(TradeComment,"-----ERROR----- CLOSE SELL PROFIT Ask="+Ask+" error="+gle+" "+ErrorDescription(gle));
  302.                     }
  303.                  }//while                 
  304.               }//if


  305.             //
  306.             // Did we take a loss
  307.             //====================
  308.             //
  309.             if( LossLimit>0 && CurrentProfit<=(LossLimit*(-1)*Point) )
  310.               {
  311.                while(true)
  312.                  {
  313.                   OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
  314.                   gle=GetLastError();
  315.                   if(gle==0)
  316.                     {
  317.                      if(logging) logwrite(TradeComment,"CLOSE SELL LOSS Ticket="+OrderTicket()+" SL="+SL+" TP="+TP);
  318.                      if(logging) logwrite(TradeComment,"MAX order equity "+maxOEquity);
  319.                      if(logging) logwrite(TradeComment,"MIN order equity "+minOEquity);
  320.                      if(logging) logwrite(TradeComment,"order equity positive ticks ="+EquityPos);
  321.                      if(logging) logwrite(TradeComment,"order equity negative ticks ="+EquityNeg);
  322.                      if(logging) logwrite(TradeComment,"order equity   zero   ticks ="+EquityZer);
  323.                      break;
  324.                     }
  325.                      else
  326.                     {
  327.                      if(logerrs) logwrite(TradeComment,"-----ERROR----- CLOSE SELL LOSS Ask="+Ask+" error="+gle+" "+ErrorDescription(gle));
  328.                     }
  329.                  }//while

  330.               }//if

  331.            } //if SELL
  332.            
  333.         } // if(OrderSymbol)
  334.         
  335.      } // for

  336.   } // start()


  337. void logwrite (string filename, string mydata)
  338.   {
  339.    int myhandle;
  340.    myhandle=FileOpen(Symbol()+"_"+filename, FILE_CSV|FILE_WRITE|FILE_READ, ";");
  341.    if(myhandle>0)
  342.      {
  343.       FileSeek(myhandle,0,SEEK_END);
  344.       FileWrite(myhandle, mydata+" "+CurTime());
  345.       FileClose(myhandle);
  346.      }
  347.   }

复制代码


回复

使用道具 举报

478

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
90687
 楼主| 发表于 2019-4-29 13:14:46 | 显示全部楼层
21世纪,什么最重要——我!
回复 支持 反对

使用道具 举报

248

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
90758
发表于 2019-4-29 13:15:26 | 显示全部楼层
医生问病人是怎么骨折的。病人说,我觉得鞋里有沙子,就扶着电线杆抖鞋。TMD有个混蛋经过那里,以为我触电了,便抄起木棍给了我两棍子!
回复 支持 反对

使用道具 举报

217

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
91388
发表于 2019-4-29 13:15:53 | 显示全部楼层
吊炸了!哈哈
回复 支持 反对

使用道具 举报

470

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
91443
发表于 2019-4-29 13:15:58 | 显示全部楼层
你的朋友最好以你自己为中心发散,允许少数支点连接,千万不要把朋友圈变成密不透风的多边型,你要为自己留底牌。
回复 支持 反对

使用道具 举报

470

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
91443
发表于 2019-4-29 13:15:58 | 显示全部楼层
顶你一下.
回复 支持 反对

使用道具 举报

233

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
90639
发表于 2019-4-29 13:16:00 | 显示全部楼层
老天不公啊.....
回复 支持 反对

使用道具 举报

444

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
91167
发表于 2019-4-29 13:16:04 | 显示全部楼层
帮你顶,人还是厚道点好
回复 支持 反对

使用道具 举报

492

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
91305
发表于 2019-4-29 13:16:19 | 显示全部楼层
问世间情为何物?一物降一物。
回复 支持 反对

使用道具 举报

468

主题

6万

帖子

9万

积分

高级VIP会员

Rank: 8Rank: 8

积分
91121
发表于 2019-4-29 13:16:48 | 显示全部楼层
若说无缘,三千大千世界,十万菩提众生,怎么单单与你想见?若说有缘,这灯花百结之后,只有灰烬,没有复燃.三尺深雪,一夜月光,至此无语!
回复 支持 反对

使用道具 举报

QQ|Archiver|手机版|小黑屋|努金智能 ( 沪ICP备18033831号-1 )

GMT+8, 2020-1-28 15:52 , Processed in 0.074811 second(s), 43 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表