MQL4. Закрытие по Зигзаг

 

Помогите прописать закрытие по Зигзаг. Все перепробовала закрытие не получается.

//+------------------------------------------------------------------+
//|                                                           ZZ.mq4 |
//|                                                         Mr. Gold |
//|                                         anna.furmanova@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Mr. Gold"
#property link      "anna.furmanova@yandex.ru"
#property version   "1.00"
#property strict
#include <My Lib.mqh>

extern string ZigXard             = "===== Параметры ZigXard =====";
extern int ExtDepth               = 57;
extern int ExtDeviation           = 65;
extern int ExtBackstep            = 40;

extern int MaxRisk                = 2;
extern int MG                     = 888;
extern double Lots                = 0.01;

extern bool Clock                 = true;
extern int TestingMode            = 1;

static int PreBars=0;
static int DT=0;

datetime Today=0;
static int prevtime=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string CurDay()
  {
   string CurDay;
   switch(DayOfWeek())
     {
      case 0: CurDay = "Вс";break;
      case 1: CurDay = "Пн";break;
      case 2: CurDay = "Вт";break;
      case 3: CurDay = "Ср";break;
      case 4: CurDay = "Чт";break;
      case 5: CurDay = "Пт";break;
      case 6: CurDay = "Сб";break;
     }
   return(CurDay);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(TestingMode>0)
     {
      if(TestingMode==1)
        {
         if(Bars == PreBars) return(0);
         else PreBars=Bars;
           } else {
         if(Bars!=PreBars)
           {
            DT=0;
            PreBars=Bars;
           }
         if(TimeCurrent() < Time[0]+DT) return(0);
         else DT=DT+Period()*60/TestingMode;
        }
     }
   if(Clock) ObjectSetText("Clock",TimeToStr(TimeCurrent(),TIME_MINUTES)+", "+CurDay(),20,"Tahoma",Maroon);
   if(GlobalVariableCheck("g_TestingMode")==true)
      TestingMode=GlobalVariableGet("g_TestingMode");

   if(DayOfWeek()==0 || DayOfWeek()==6) return(0);
   if(!IsTradeAllowed()) return(0);
   if(Time[0]==Today) return(0);
   Today=Time[0];

   double Zig_0=iCustom(Symbol(),0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,1);
   double Zig_1=iCustom(Symbol(),0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,1);

   int tiket,cnt,total=OrdersTotal();

   if(Time[0]==prevtime)
      return(0);
   prevtime=Time[0];

   if(OrdersTotal()<1)
     {
      int oBuy=0,oSell=0;
      if(Zig_0>0 && oBuy+oSell==0)
        {
         int i=2;
         while(iCustom(NULL,0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,i)==0) i++;
         double Zig_1=iCustom(NULL,0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,i);
         double Lot=GetLot(MaxRisk);
         if(Lot==0) {Alert("Недостаточно средств!");return(0);}
         if(Zig_0<Zig_1)
           {
            OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MG,0);
           }
         if(Zig_0>Zig_1)
           {
            OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MG,0);
           }
        }
     }
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
           {
            if(Zig_0>Zig_1)
              {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
               return(0);
              }
           }
         else
           {
            if(Zig_0<Zig_1)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
           }
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+
 

Надо в цикле бежать в глубь истории до нахождения значения в буфере, да нужно не одно значение, а несколько, чтобы определить направление.

В любом случае этот зигзаг для эксперта очень плохая затея,  тормоза невероятные.

 
Anna_89:

Помогите прописать закрытие по Зигзаг. Все перепробовала закрытие не получается.

Первая проблема в этих строках. Надо-бы убедиться что там не пустые значения а именно 0, в чём я сомневаюсь.

         int i=2;
         while(iCustom(NULL,0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,i)==0) i++;
         double Zig_1=iCustom(NULL,0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,i);

Да и вообще не мешало-бы посмотреть что это за ZigZag Не обязательно сам индикатор или его код, хотя-бы картинку. Сколько там буферов, когда отрисовывается новая ступень?

Если ориентироваться на тот который в комплекте, то код вообще некудышный. Искать значения Zig_0 и Zig_1 надо в одном цикле. Если найдено первое значение и оно равно High той-же свечи, то дальше надо искать значение равное Low Таким образом получим два значения которые можно сравнивать.

Или можно подумать, нет-ли варианта обойтись одним значением ZigZag`a Ведь если это значение равно High свечи, то следующее будет явно ниже этого и будет равно Low и так-же наоборот.

 
Файлы:
 
Anna_89:

Это уже ближе к правильному ответу. Используется два буфера, соответственно надо в цикле определять оба их значения.


   Zig_0=iCustom(Symbol(),0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,i);
   Zig_1=iCustom(Symbol(),0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,1,i);

И выход из цикла по условию

if(Zig_0 > 0 && Zig_1 > 0) break;

 
Alexey Viktorov:

Это уже ближе к правильному ответу. Используется два буфера, соответственно надо в цикле определять оба их значения.


И выход из цикла по условию

if(Zig_0 > 0 && Zig_1 > 0) break;

наверно так:

if(Zig_0 > 0 || Zig_1 > 0) break;
 
Alexey Viktorov:

Это уже ближе к правильному ответу. Используется два буфера, соответственно надо в цикле определять оба их значения.


И выход из цикла по условию

if(Zig_0 > 0 && Zig_1 > 0) break;

И выход из цикла if(Zig_0 > 0 && Zig_1 > 0) break; нужно вставлять в отдельный блок закрытия? Например сюда:

 for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
           {
            if(Zig_0 > 0 || Zig_1 > 0)
              {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
               return(0);
              }
           }
         else
           {
            if(Zig_0 < 0 || Zig_1 < 0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
           }
        }
     }
 
Anna_89:

И выход из цикла if(Zig_0 > 0 && Zig_1 > 0) break; нужно вставлять в отдельный блок закрытия? Например сюда:

 for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
           {
            if((Zig_0 > 0 && Zig_0!=EMPTY_VALUE) || (Zig_1 > 0 && Zig_1!=EMPTY_VALUE))
              {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
               return(0);
              }
           }
         else
           {
            
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              
           }
        }
     }
лучше так 
 

Закрытие все равно не ставится. Идет сделка только на продажу. Посмотрите пожалуйста, где ошибка. 

//+------------------------------------------------------------------+
//|                                                           ZZ.mq4 |
//|                                                         Mr. Gold |
//|                                         anna.furmanova@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Mr. Gold"
#property link      "anna.furmanova@yandex.ru"
#property version   "1.00"
#property strict
#include <My Lib.mqh>

extern string ZigXard             = "===== Параметры ZigXard =====";
extern int ExtDepth               = 57;
extern int ExtDeviation           = 65;
extern int ExtBackstep            = 40;

extern int MaxRisk                = 2;
extern int MG                     = 888;
extern double Lots                = 0.01;

extern bool Clock                 = true;
extern int TestingMode            = 1;

static int PreBars=0;
static int DT=0;

datetime Today=0;
static int prevtime=0;
int tiket,cnt,total=OrdersTotal();
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string CurDay()
  {
   string CurDay;
   switch(DayOfWeek())
     {
      case 0: CurDay = "Вс";break;
      case 1: CurDay = "Пн";break;
      case 2: CurDay = "Вт";break;
      case 3: CurDay = "Ср";break;
      case 4: CurDay = "Чт";break;
      case 5: CurDay = "Пт";break;
      case 6: CurDay = "Сб";break;
     }
   return(CurDay);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(TestingMode>0)
     {
      if(TestingMode==1)
        {
         if(Bars == PreBars) return(0);
         else PreBars=Bars;
           } else {
         if(Bars!=PreBars)
           {
            DT=0;
            PreBars=Bars;
           }
         if(TimeCurrent() < Time[0]+DT) return(0);
         else DT=DT+Period()*60/TestingMode;
        }
     }
   if(Clock) ObjectSetText("Clock",TimeToStr(TimeCurrent(),TIME_MINUTES)+", "+CurDay(),20,"Tahoma",Maroon);
   if(GlobalVariableCheck("g_TestingMode")==true)
      TestingMode=GlobalVariableGet("g_TestingMode");

   if(DayOfWeek()==0 || DayOfWeek()==6) return(0);
   if(!IsTradeAllowed()) return(0);
   if(Time[0]==Today) return(0);
   Today=Time[0];

   double Lot=GetLot(MaxRisk);
   if(Lot==0) {Alert("Недостаточно средств!");return(0);}

   int signal;

   double y3=0,y3_1=0,y2=0,y2_1=0,y1=0,y1_1=0,Zig_0,Zig_1;
   int    x3,x3_1,x2,x2_1,x1,x1_1;

   for(int i=1; i<Bars; i++)
     {
      Zig_0=iCustom(Symbol(),0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,0,i);
      if(Zig_0!=0)
                if(y1==0) { x1=i; y1=Zig_0; }
      else if(y2==0) { x2=i; y2=Zig_0; }
      else if(y3==0) { x3=i; y3=Zig_0; }
        {
         if(Zig_0>0 && Zig_0!=EMPTY_VALUE)
           {
            tiket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MG,0,Red);
           }
        }
      Zig_1=iCustom(Symbol(),0,"Bi D ZigXard-Pointer-V3",ExtDepth,ExtDeviation,ExtBackstep,1,i);
      if(Zig_1!=0)
                if(y1_1==0) { x1_1=i; y1_1=Zig_1; }
      else if(y2_1==0) { x2_1=i; y2_1=Zig_1; }
      else if(y3_1==0) { x3_1=i; y3_1=Zig_1; }
        {
         if(Zig_1>0 && Zig_1!=EMPTY_VALUE)
           {
            tiket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MG,0,Red);
           }
        }
     }
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
           {
            if(Zig_0>0 && Zig_0!=EMPTY_VALUE)
              {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
               return(0);
              }
           }
         else
           {
            if(Zig_1>0 && Zig_1!=EMPTY_VALUE)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
           }
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+
 
Vladislav Andruschenko:

наверно так:

Vladislav Andruschenko:
лучше так 

Влад, а посмотреть код о котором идёт речь не позволяет религия? Да и код индикатора приложен именно для того чтобы убедиться в том что используется нуль а не пустое значение.

 

я исправлял не те ошибки. 

и всегда проверяю на непустое значение. неважно что там установлено в переменной пустого значения.  


if(Zig_0 > 0 && Zig_1 > 0) break;

 не имеет логического завершения, индикатор не выдаст на два буфера точки 

Причина обращения: