ytg_Parabolic_exp





//+------------------------------------------------------------------+
//|                                            ytg_Parabolic_exp.mq4 |
//|                                                     Yuriy Tokman |
//|                                            yuriytokman@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Yuriy Tokman"
#property link      "yuriytokman@gmail.com"

extern int timeframe  = 240;
extern double step    = 0.009;
extern double maximum = 0.2;

extern int    StopLoss         = 500;  // Ðàçìåð ñòîïà â ïóíêòàõ
extern int    TakeProfit       = 500; // Ðàçìåð òåéêà â ïóíêòàõ
extern double Lotsi = 0.1;
extern int    MagicNumber      = 28081975;   //Ìàãè÷åñêîå ÷èñëî îðäåðîâ

color clOpenBuy                = LightBlue;     // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè
color clOpenSell               = LightCoral;    // Öâåò çíà÷êà îòêðûòèÿ ïðîäàæè
color clCloseBuy               = Blue;     // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color clCloseSell              = Coral;    // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
extern int    Slippage         = 30;            // Ïðîñêàëüçûâàíèå öåíû
extern int    NumberOfTry      = 5;             // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê
bool   UseSound                = True;          // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
string NameFileSound           = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
int    NumberAccount           = 0;             // Íîìåð òîðãîâîãî ñ÷¸òà
bool   ShowComment             = True;          // Ïîêàçûâàòü êîììåíòàðèé
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
bool  gbDisabled               = False;         // Ôëàã áëîêèðîâêè ñîâåòíèêà
bool  gbNoInit                 = False;         // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
//------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+
#include <stdlib.mqh>        // Ñòàíäàðòíàÿ áèáëèîòåêà ÌÒ4

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);  
   double parab = NormalizeDouble(iSAR(Symbol(),timeframe,step,maximum,0),dg);   
   double sl=0, tp=0,ti=0,new_sl,new_tp;
   double SPREAD    = MarketInfo(Symbol(),MODE_SPREAD);//Ñïðýä â ïóíêòàõ
   double STOPLEVEL    = MarketInfo(Symbol(),MODE_STOPLEVEL);   
   double low = iLow(Symbol(),timeframe,0);
   double high = iHigh(Symbol(),timeframe,0);   
   double mp=MarketInfo(Symbol(), MODE_POINT);
   double pa=MarketInfo(Symbol(), MODE_ASK);
   double pb=MarketInfo(Symbol(), MODE_BID);
   
//----
   if(NevBar())
   {
//-------------------------------------------------------------buy
    if(!ExistOrders(NULL,OP_BUYLIMIT,MagicNumber) && parab<low && pb>parab+STOPLEVEL*mp)//îðäåðà íåò
    {//óñòàíàâëèâàåì     
     if (StopLoss  >0) sl=parab-StopLoss*mp;   else sl=0;
     if (TakeProfit>0) tp=parab+TakeProfit*mp; else tp=0;     
     SetOrder(NULL,OP_BUYLIMIT,Lotsi,parab,sl,tp,MagicNumber,0);
    }
    if(ExistOrders(NULL,OP_BUYLIMIT,MagicNumber) && pb>parab+STOPLEVEL*mp)//îðäåð åñòü
    {//ìîäèôèöèðóåì
     ti = TicketPos(NULL,OP_BUYLIMIT,MagicNumber);
     if (OrderSelect(ti, SELECT_BY_TICKET))
       {
        if (StopLoss  >0) sl=parab-StopLoss*mp;   else sl=0;
        if (TakeProfit>0) tp=parab+TakeProfit*mp; else tp=0;
        ModifyOrder(parab,sl,tp,Turquoise);
       }
    }
//--------------------------------------------------------------sell
    if(!ExistOrders(NULL,OP_SELLLIMIT,MagicNumber) && parab>high && pa<parab-STOPLEVEL*mp)//îðäåðà íåò
    {//óñòàíàâëèâàåì     
     if (StopLoss  >0) sl=parab+StopLoss*mp;   else sl=0;
     if (TakeProfit>0) tp=parab-TakeProfit*mp; else tp=0;     
     SetOrder(NULL,OP_SELLLIMIT,Lotsi,parab,sl,tp,MagicNumber,0);
    }
    if(ExistOrders(NULL,OP_SELLLIMIT,MagicNumber) && pa<parab-STOPLEVEL*mp)//îðäåð åñòü
    {//ìîäèôèöèðóåì
     ti = TicketPos(NULL,OP_SELLLIMIT,MagicNumber);
     if (OrderSelect(ti, SELECT_BY_TICKET))
       {
        if (StopLoss  >0) sl=parab+StopLoss*mp;   else sl=0;
        if (TakeProfit>0) tp=parab-TakeProfit*mp; else tp=0;
        ModifyOrder(parab,sl,tp,Turquoise);
       }
    }
//-----------------------------------------------------------------
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ íîâîãî áàðà                                                |
//-----------------------------------------------------------------------------+
bool NevBar(){
   static int PrevTime=0;
   if (PrevTime==iTime(Symbol(),timeframe,0)) return(false);
   PrevTime=iTime(Symbol(),timeframe,0);
   return(true);}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 12.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ îðäåðîâ.                         |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ óñòàíîâêè)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 13.03.2008                                                     |
//|  Îïèñàíèå : Óñòàíîâêà îðäåðà.                                              |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    pp - öåíà                                                               |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Ñðîê èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color    clOpen;
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());

  if (sy=="" || sy=="0") sy=Symbol();
  msl=MarketInfo(sy, MODE_STOPLEVEL);
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, ex, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
        Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
        continue;
      }
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      // Íåïðàâèëüíûå ñòîïû
      if (err==130) {
        switch (op) {
          case OP_BUYLIMIT:
            if (pp>pa-msl*mp) pp=pa-msl*mp;
            if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
            if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
            break;
          case OP_BUYSTOP:
            if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
            if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
            if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
            break;
          case OP_SELLLIMIT:
            if (pp<pb+msl*mp) pp=pb+msl*mp;
            if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
            if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
            break;
          case OP_SELLSTOP:
            if (pp>pb-msl*mp) pp=pb-msl*mp;
            if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
            if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
            break;
        }
        Print("SetOrder(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè");
      }
      Print("Error(",err,") set order: ",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 (pa==0 && pb==0) Message("SetOrder(): Ïðîâåðüòå â îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      // Ñëèøêîì ÷àñòûå çàïðîñû (8) èëè ñëèøêîì ìíîãî çàïðîñîâ (141)
      if (err==8 || err==141) Sleep(1000*100);
      if (err==139 || err==140 || err==148) break;
      // Îæèäàíèå îñâîáîæäåíèÿ ïîäñèñòåìû òîðãîâëè
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      // Îáíóëåíèå äàòû èñòå÷åíèÿ
      if (err==147) {
        ex=0; continue;
      }
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà                             |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    TimeFrame - òàéìôðåéì (êîëè÷åñòâî ñåêóíä)      (0 - òåêóùèé ÒÔ)         |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  switch (TimeFrame) {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("Daily");
    case PERIOD_W1:  return("Weekly");
    case PERIOD_MN1: return("Monthly");
    default:         return("UnknownPeriod");
  }
}
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("Buy Limit");
    case OP_SELLLIMIT: return("Sell Limit");
    case OP_BUYSTOP  : return("Buy Stop");
    case OP_SELLSTOP : return("Sell Stop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    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 - öåíîâîé óðîâåíü òåéêà                                              |
//|    cl - öâåò çíà÷êà ìîäèôèêàöèè                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  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, 0, 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                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 19.02.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò òèêåò ïîñëåäíåé îòêðûòîé ïîçèöèè èëè -1             |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
int TicketPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  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_BUYLIMIT || OrderType()==OP_SELLLIMIT) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}



Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:


Indicators Used:

Parabolic Stop and Reverse system


Custom Indicators Used:

Order Management characteristics:

Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy

Other Features:

It plays sound alerts

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.40 Total Net Profit:-300.62

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.67 Total Net Profit:-50.08

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:1.14 Total Net Profit:49.77

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.22 Total Net Profit:-700.24

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.56 Total Net Profit:-1006.17

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.50 Total Net Profit:-94.74

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:2.48 Total Net Profit:144.63

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:2.94 Total Net Profit:110.24

Request Backtest for ytg_Parabolic_exp


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

Pair: Period: