16_ZigAndZag_trade_V2





//+------------------------------------------------------------------+
//|                                             ZigAndZag_trader.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <stdlib.mqh>
//---- input parameters
extern double    Lots=0.1;//òîðãóåìûé ëîò
extern int       ZZbar=1;//áàðîâ íàçàä ñ êîòîðîãî áåðåì ñèãíàë ê òîðãîâëå
extern int       Closebar=3;//áàðîâ íàçàä ñ êîòîðîãî áåðåì ñèãíàë ê çàêðûòèþ 
extern int       CloseBars=5;//çàïðåò çàêðûòèÿ íà êîë-âî áàðîâ ñ ìîìåíòà îòêð îðäåðà 
extern int       Maxord=10;//êîëè÷åñòâî òîðãóåìûõ îðäåðîâ(ïîêà îñòàâèòü 1)âîìîæíî áóäåò ìóëüòèîðäåðíàÿ ñèñòåìà
extern int       Sl=0;//ñòîïëîñ ïîäáèðàåòñÿ ïðè îïòèìèçàöèè
extern int       Tp=0;//òåéê ïîäáèðàåòñÿ ïðè îïòèìèçàöèè
extern int       bu=0;//
extern int       Rew=0;//ðåâåðñ ïîçèöèé
extern int       ClosePos=1;//Ðàçðåøàåò çàêðûòèå ïîçèöèé ïî ñèãíàëó èíäèêàòîðà
extern bool      Drive=false;
extern bool      _Bu=false;
extern bool      Autolot=true;//âêëþ÷åíèå - îòêëþ÷åíèå àâòîëîòà
extern int       magic=78977;//ìàãèê
//-----------------------
static int prevtime = 0 ;
bool buy,sell,close,NumberOfTry=3,UseSound=false;
bool first=true,newday=true;
double MinLot, MaxLot, MarginMinLot;   
int    MinLotDgts,Slippage=3,period,GrossPeriod,GrossTrand=0;
string NameFileSound = "expert.wav";   // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
color  clOpenBuy     = Blue;           // Öâåò çíà÷êà îòêðûòèÿ Buy
color  clOpenSell    = Red;            // Öâåò çíà÷êà îòêðûòèÿ Sell
bool   MarketWatch=true;
bool   gbDisabled    = False;          // Áëîêèðîâêà
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void FirstCalc()
{
// 
// Ïðåäñòàðòîâûé ðàñ÷åò. Âûïîëíÿåòñÿ îäèí ðàç - ïðè çàïóñêå
// (è êàæäûé ðàç ïîñëå ñáîÿ ñâÿçè).
//
      first=false;
//+--- Ìèíèìàëüíûé è ìàêñèìàëüíûé ðàçìåðû ëîòîâ
   MinLot=MarketInfo(Symbol(),MODE_MINLOT);
   if(MinLot<0.1) MinLotDgts=2; // ðàçìåðíîñòü ìèíëîòà   
   else
   {
      if(MinLot<1.0) MinLotDgts=1;
      else MinLotDgts=0;
   }
   MaxLot=MarketInfo(Symbol(),MODE_MAXLOT);   
//----
   return;
}
//+------------------------------------------------------------------+
void init(){
   if(Period()==5){period= 15;GrossPeriod=30;}
   if(Period()==15){period= 30;GrossPeriod=60;}
   if(Period()==30){period= 60;GrossPeriod=240;}
   if(Period()==60){period= 240;GrossPeriod=1440;}
   if(Period()==240){period= 1440;GrossPeriod=10080;}
   if(Period()==1440){period= 10080;GrossPeriod=43200;}
   if(Period()<5||Period()>10080){GrossPeriod=0;}return;}
//-------------------------------------------------------------------   
int start()
  {
   if(NewDay()){newday=true;}
   if(GrossPeriod==0){Comment("Íå ïðàâèëüíûé ïåðèîä, Ðàáoòà îñòàíîâëåííà!"); return(0);}
   if(first==true) FirstCalc();
// Æäåì, êîãäà ñôîðìèðóåòñÿ íîâûé áàð
   if (Time[0] == prevtime) return(0);
      prevtime = Time[0];  
buy=false;sell=false;         close=false;
//------------Ïåðåâîä â áåçóáûòîê------------------------------------+
if(OrdersTotal()>0&&_Bu){
  for(int x=0;x<OrdersTotal();x++){
   if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)){
    Bu(OrderTicket());}}}
//------------×èòàåì èíôó èç èíäèêàòîðà------------------------------+
 //if(iCustom(NULL,GrossPeriod,"ZigAndZag",5,ZZbar)!=0){GrossTrand=1;SetArrow(241,3,true,Red);}
 //if(iCustom(NULL,GrossPeriod,"ZigAndZag",6,ZZbar)!=0){GrossTrand=(-1);SetArrow(242,3,false,Red);}
 if(iCustom(NULL,period,"ZigAndZag",4,Closebar)!=0){close=true;SetArrow(251,3,false,White);}
 if(iCustom(NULL,GrossPeriod,"ZigAndZag",5,ZZbar)!=0){buy=true;SetArrow(241,1,true,Blue);}
 if(iCustom(NULL,GrossPeriod,"ZigAndZag",6,ZZbar)!=0){sell=true;SetArrow(242,1,false,Red);}
 //Comment(close+"\n"+buy+"\n"+sell+"\n"+OrdersTotal());
 Comment(GrossPeriod+"\n"+GrossTrand);
//------------Îòêðûòèå îðäåðîâ---------------------------------------+
 if(Rew==0&&newday){//OpenPosition("",OP_BUY,Lots,Lots,Tp,magic)
 if(buy&&OrdersTotal()<Maxord){OpenPosition("",OP_BUY,Lots,Sl,Tp,magic);buy=false;newday=false; } 
 if(sell&&OrdersTotal()<Maxord){OpenPosition("",OP_SELL,Lots,Sl,Tp,magic);sell=false;newday=false; }}
 if(Rew>0&&newday){
 if(buy&&OrdersTotal()<Maxord){OpenPosition("",OP_SELL,Lots,Sl,Tp,magic);sell=false;newday=false; } 
 if(sell&&OrdersTotal()<Maxord){OpenPosition("",OP_BUY,Lots,Sl,Tp,magic);buy=false; newday=false;}} 
//------------Çàêðûòèå îðäåðîâ---------------------------------------+ 
 if(OrdersTotal()>0){
  if(((GetPosType()==0&&sell)||(GetPosType()==1&&buy))){
  for(int i=0;i<OrdersTotal();i++){
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(ClosePos==0){
     if(iBarShift(NULL,CloseBars,OrderOpenTime())>0){del(OrderTicket());close=false;}}
    if(ClosePos>0){del(OrderTicket());close=false;} 
     }}}} 
//----
   return(0);
  }
//-------------------------------------------------------------------+
int GetPosType(){
 for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){return(OrderType());}}}
bool NewDay(){if(TimeHour(TimeCurrent())==0&&TimeMinute(TimeCurrent())<10){return(true);}return(false);}     
//+------------------------------------------------------------------+
void SetArrow(int kod,int razm,bool ApDn,color col){if(Drive){
 string Name=TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES);
 if(!ApDn){double prs=Ask+20*Point;}else{prs=Bid-20*Point;}
 //Comment(prs+"\n"+Name);
 if(!ObjectCreate(Name,OBJ_ARROW,0,0,0,0,0,0,0)){Comment(GetLastError());return;}
 if(!ObjectSet(Name,OBJPROP_ARROWCODE,kod)){Comment(GetLastError());}
 if(!ObjectSet(Name,OBJPROP_STYLE,DRAW_ARROW)){Comment(GetLastError());}
 if(!ObjectSet(Name,OBJPROP_TIME1,Time[0])){Comment(GetLastError());}
 if(!ObjectSet(Name,OBJPROP_PRICE1,prs)){Comment(GetLastError());}
 if(!ObjectSet(Name,OBJPROP_WIDTH,razm)){Comment(GetLastError());} 
 if(!ObjectSet(Name,OBJPROP_COLOR,col)){Comment(GetLastError());}}

 return;}

//-----------------------------------------------------------------------------+
//  Ôóíêöèÿ çàêðûâàåò ðûíî÷íûé îðäåð ñ ïåðåäàííûì åé ìàãèêîì                   |
//-----------------------------------------------------------------------------+
int del(int ticket){
int err;
GetLastError();//îáíóëÿåì îøèêó
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
string symbol = OrderSymbol();
//----------------------------
if(OrderType()==OP_BUY){
 RefreshRates();
  double prise = MarketInfo(symbol,MODE_BID);
   OrderClose(ticket,OrderLots(),prise,3,Green);
    err = GetLastError();}
if(OrderType()==OP_SELL){
 RefreshRates();
  prise = MarketInfo(symbol,MODE_ASK);
   OrderClose(ticket,OrderLots(),prise,3,Green);
    err = GetLastError();}
//---------------------------        
if (err == 0&&UseSound){PlaySound("expert.wav");}
 else{PlaySound("timeout.wav");Print(err);} 
  return(err);}
//-------------------------------------------------------------------+
// ôóíêöèÿ ïåðåâîäèò ÑË â áó èëè íà íóæíûé óðîâåíü                   +
//+------------------------------------------------------------------+
 int Bu(int ti=0)
 {
  int err;double sl;
  if(ti==0){return(-1);}
  if(OrderSelect(ti,SELECT_BY_TICKET,MODE_TRADES)&&(OrderCloseTime()==0)){
    if(bu==0){sl=OrderOpenPrice();}else{
      if(OrderType()==OP_BUY) {sl=NormalizeDouble((OrderOpenPrice()+bu*Point),Digits);}
       if(OrderType()==OP_SELL){sl=NormalizeDouble((OrderOpenPrice()-bu*Point),Digits);}} 
    if(OrderType()==OP_BUY){
     if(sl<MarketInfo(OrderSymbol(),MODE_BID)-(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){ 
      err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}} 
    if(OrderType()==OP_SELL){
     if(sl>MarketInfo(OrderSymbol(),MODE_ASK)+(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){ 
      err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}}}      
 return(err);
 }
//--------------------------------------------------------------------+  
//-----------------------------------------------------------------------------+
//___________________ÊÈÌÓ_______ÐÅÑÏÅÊÒ________È_____ÓÂÀÆÓÕÀ___________________|
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    m - òåêñò ñîîáùåíèÿ                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà óñòàíîâêè îðäåðà                                              |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    ex - äàòà èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=Red;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);

  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 06.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}
//-----------------------------------------------------------------------------
double GetOrderLot(){
   for (int i=0; i<OrdersTotal(); i++){
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){double lot = OrderLots();}}
     if(lot==0){lot=Lots;}else{lot=lot+Lots;}
     return(lot);}
     
  
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 10.04.2008                                                     |
//|  Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå.                            |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double Sl=0, double Tp=0, int mn=0) {
  
  color    clOpen;
  datetime ot;
  double   pp, pa, pb, sl, tp;
  int      dg, err, it, ticket=0;
  string   lsComm="";
  if(Autolot){ll=GetOrderLot();}
  
  if (op<1){
   if (Sl>0) sl=MarketInfo(Symbol(),MODE_ASK)-Sl*Point; else sl=0;
   if (Tp>0) tp=MarketInfo(Symbol(),MODE_ASK)+Tp*Point; else tp=0;
  }else{
   if (Sl>0) sl=MarketInfo(Symbol(),MODE_BID)+Sl*Point; else sl=0;
   if (Tp>0) tp=MarketInfo(Symbol(),MODE_BID)-Tp*Point; else tp=0;
   }   
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && IsStopped()) {
      Print("OpenPosition(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    if (MarketWatch)
      ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, lsComm, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      // Âûâîä ñîîáùåíèÿ îá îøèáêå
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
    if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
  }
}
//+----------------------------------------------------------------------------+







Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:




Custom Indicators Used:
ZigAndZag

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached

Other Features:

It plays sound alerts

BackTest : EURUSD on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.51 Total Net Profit:-19.60

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.00 Total Net Profit:152.72

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:-877.04

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.70 Total Net Profit:-261.70

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:-9955.82

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:-10057.55

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.00 Total Net Profit:-2734.05

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.00 Total Net Profit:-9888.15

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:-474.96

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for 16_ZigAndZag_trade_V2


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: