Нужна помощь.

 
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
// to simplify the coding and speed up access
// data are put into internal variables
  

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
    if(iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 1)==High[0]&&iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 1) ==High[0])
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
   if(iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 1, 0)==Low[0]&&iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12,1, 0) ==Low[0] )
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
          if(iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 1, 0)==Low[0]&&iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12,1, 0) ==Low[0] )
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 1)==High[0]&&iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 1) ==High[0])
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Хочу фильтровать колебания цены в советнике при помощи индикатора zig-zag. Проюзав интернет набрёл на советник на основе вышеуказанного индикатора.

При компиляции данный код выдаёт ошибку

return value of 'OrderSelect' should be checked zig-zag.mq4     76      7
Помогите пожалуйста подправить данный код.
 
Игорь:
Хочу фильтровать колебания цены в советнике при помощи индикатора zig-zag. Проюзав интернет набрёл на советник на основе вышеуказанного индикатора.

При компиляции данный код выдаёт ошибку

Помогите пожалуйста подправить данный код.

Ну так он же Вам пишет:   return value of 'OrderSelect' should be checked zig-zag.mq4     76      7 ,  т.е. значение OrderSelect нужно проверить, даже указана строка и позиция в коде...

 
Sergey Kolemanov:

Ну так он же Вам пишет:   return value of 'OrderSelect' should be checked zig-zag.mq4     76      7 ,  т.е. значение OrderSelect нужно проверить, даже указана строка и позиция в коде...

Да пишет, я начинаю править там ещё хлеще ошибки выходят. Там этих return столько, что я решил переделать данный код. Все равно потом в свой робот его вставлять. Вот что у меня получилось

//+------------------------------------------------------------------+
//|                                    Test advisor on iDeMarker.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                         https:/goga342@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//------------------параметры советника -------------------------------
extern double lots=0.01; //
extern int Magic=1111678111;
extern int Slippage=1;
//double sell_level=0.7;
//double buy_level=0.3;

extern double StopLoss=50;
extern double TakeProfit=50;
extern double TrailingStop=30;
double SL,TP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
      TakeProfit *=10;
      StopLoss   *=10;
      Slippage   *=10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   int ticket;
// int cnt,total;

// открытие продаж

   if(CountSell()==0 && iCustom(NULL,0,"ZigZag_Rosh",12,5,3,1,0)==Low[0] && iCustom(NULL,0,"ZigZag_Rosh",48,20,12,1,0)==Low[0])
     {
      SL = NormalizeDouble(Bid+StopLoss*Point, Digits);
      TP = NormalizeDouble(Bid-TakeProfit*Point, Digits);
        {

         ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            // закрытие продаж
            if(CountSell()>0 && iCustom(NULL,0,"ZigZag_Rosh",12,5,3,0,1)==High[0] && iCustom(NULL,0,"ZigZag_Rosh",48,20,12,0,1)==High[0])
              {
               for(int i=OrdersTotal()-1; i>=0; i--)
                 {
                  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
                    {
                     if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE))
                           Print("Ошибка открытия ордера на покупку !");
                    }
                 }
              }
           }
        }
     }
// открытие покупок

   if(CountBuy()==0 && iCustom(NULL,0,"ZigZag_Rosh",12,5,3,0,1)==High[0] && iCustom(NULL,0,"ZigZag_Rosh",48,20,12,0,1)==High[0])
     {
      TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);
      SL = NormalizeDouble(Ask-StopLoss*Point, Digits);
        {
         ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            // закрытие покупок    
            if(CountBuy()>0 && iCustom(NULL,0,"ZigZag_Rosh",12,5,3,1,0)==Low[0] && iCustom(NULL,0,"ZigZag_Rosh",48,20,12,1,0)==Low[0])
              {
               for(int i=OrdersTotal()-1; i>=0; i--)
                 {
                  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
                    {
                     if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
                        if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrNONE))
                           Print("Ошибка открытия ордера на продажу!");
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
int CountSell()//проверкна открытие ордеров на продажу
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()// проверкна открытие ордеров на покупку
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

При компиляции ошибок и предупреждений нет. Правда позиции не открывает (открыл только 1 позицию в покупку и закрыл её по тейку). 

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

 

Поправил обе версии, есть недочёты 


Файлы:
1.5.mq4  10 kb
1.6.mq4  9 kb
 
FXwin:

Поправил обе версии, есть недочёты 


Здравствуйте(извиняюсь сразу ни знаю как Вас звать). Спасибо за подправленный код. Скажите пожалуйста зачем в данном коде нужна функция  "Подсчет открытых ордеров по типу"(это делается для чего)? Если вам не трудно подскажите: 1. как сделать так, чтобы открывался на графике один зиг-заг. 2. как сделать так, чтобы сделки открывались не посередине движения, а к примеру открывалась сделка на минимуме, а закрывалась на максимуме.

Заранее спасибо.

 
Игорь:

Здравствуйте(извиняюсь сразу ни знаю как Вас звать). Спасибо за подправленный код. Скажите пожалуйста зачем в данном коде нужна функция  "Подсчет открытых ордеров по типу"(это делается для чего)? Если вам не трудно подскажите: 1. как сделать так, чтобы открывался на графике один зиг-заг. 2. как сделать так, чтобы сделки открывались не посередине движения, а к примеру открывалась сделка на минимуме, а закрывалась на максимуме.

Заранее спасибо.

Это тоже самое что в коде
int CountSell()//проверкна открытие ордеров на продажу 
int CountBuy()// проверкна открытие ордеров на покупку

только в компактной версии

1. Не понятен вопрос, наверно на график присоединить индикатор зиг-заг
2. А от куда знать что именно это и есть минимум или максимум? Пока свеча не закроется ни кто не знает что достигли какого-то пика.

 
FXwin:

Это тоже самое что в коде
int CountSell()//проверкна открытие ордеров на продажу 
int CountBuy()// проверкна открытие ордеров на покупку

только в компактной версии

1. Не понятен вопрос, наверно на график присоединить индикатор зиг-заг
2. А от куда знать что именно это и есть минимум или максимум? Пока свеча не закроется ни кто не знает что достигли какого-то пика.

Спасибо за разъяснения по поводу проверка на открытие ордера (в дальнейшем буду применять в своей работе).

Теперь, что касается 2 пунктов (или вопросов).

1. При тесте данного кода на графике образуется 2 зиг-зага (2 ломанные) вместо одной. Как сделать так, чтобы на графике отображался 1 зиг-заг?

2. В коде советника есть строка

   if(CountSell()==0 && iCustom(NULL,0,"ZigZag_Rosh",12,5,3,1,0)==Low[0] && iCustom(NULL,0,"ZigZag_Rosh",48,20,12,1,0)==Low[0])

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

Теперь по поводу открытия позиций я напишу как понимаю. Если, что поправите меня.  Позиции для открытия сделки происходит тогда, индикатор зиг-заг сформировал уже 1 плечо. Сделка открываться в противоположную сторону. Пример: индикатор образовал 1 диагональ (с нижнего левого угла до правого верхнего угла). Советник открывает позицию в противоположную сторону, то есть  с  левого верхнего угла и сделка закрывается когда будет сформирована 2 диагональ, то есть  образовалась линия с  левого верхнего угла до до правого нижнего угла. Вот как то так. Я понимаю, что это пишется через массивы. Но я думал,что если индикатор встроенный, то массивы не нужны.

   Спасибо за помощь.