Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1271

 
Пользовательские символы можно создать без использования меню MT5, а просто подложив нужные файлы в нужные папки?
 

Здравствуйте. Написал функцию, которая проверяет условия для входа в позицию.

Проблема в том, что если условие (выделено желтым) не выполняется - функция не завершает свою работу, а переходит к следующему условию. Таким образом сигнал отрабатывает не правильно.

Что нужно сделать, чтобы при невыполнении одного из условий функции - завершалась работа всей функции, сразу после некорректного условия?

bool BuySignal_new()
{
   double Sig_Up[];                 // динамический массив для хранения значений индикатора на покупку для каждого бара
   double Sig_Down[];               // динамический массив для хранения значений индикатора на продажу для каждого бара
   ArraySetAsSeries (Sig_Up,true);   // устанавливаем индексацию как в таймсерии ( т.е. 5,4,3,2,1,0) в динамич. массиве для индикатора
   ArraySetAsSeries (Sig_Down,true); // устанавливаем индексацию как в таймсерии ( т.е. 5,4,3,2,1,0) в динамич. массиве для индикатора
   ResetLastError();
   double close = NormalizeDouble(iClose(_Symbol,_Period,1),Digits());
   double close_1 = NormalizeDouble(iClose(_Symbol,_Period,0),Digits());
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),Digits());
if(CopyBuffer(Handle_stepma_line,0,1,5,Sig_Up)==5 && CopyBuffer(Handle_stepma_line,1,1,4,Sig_Down)==4 )
  {
   Print("Данные скопированы. Ошибок нет.");
   
  } 
else
    {
     Print("Ошибка копирования. Нет данных");
     return(false);
    }

if (Sig_Up[1] < Sig_Down[1] && Sig_Up[0] > Sig_Down[0])
  {
   Print("условие 1 - ок");
  }
else
    {
    Print("условие 1 НЕ выполненно");
    return(false);
    }
if (close < Sig_Up[1]&& Bid > Sig_Up[0])
  { 
   Print ("условие 2 - ок");
   return(true);
  }   
else
    {
    Print("условие 2 НЕ выполненно");
    return(false);
    }   
 
Sergey:

Что нужно сделать, чтобы при невыполнении одного из условий функции - завершалась работа всей функции, сразу после некорректного условия?

уберите ветвления по else, можно так попробовать сделать:

   if(CopyBuffer(Handle_stepma_line, 0, 1, 5, Sig_Up) != 5)
   {
      Print("Ошибка копирования. Нет данных");
      return(false);
   }

   if(CopyBuffer(Handle_stepma_line, 1, 1, 4, Sig_Down) != 4)
   {
      Print("Ошибка копирования. Нет данных");
      return(false);
   }


   if(!(Sig_Up[1] < Sig_Down[1] && Sig_Up[0] > Sig_Down[0]))
   {
      Print("условие 1 НЕ выполненно");
      return(false);
   }

   if (!(close < Sig_Up[1] && Bid > Sig_Up[0]))
   {
      Print("условие 2 НЕ выполненно");
      return(false);
   }
//--- если дошли сюда, то все условия выполнены
   return(true);
 
Igor Makanu:

уберите ветвления по else, можно так попробовать сделать:

спасибо, буду пробовать.

 

 Как в Mql5 будет выглядеть код 

if (Close[1]-Open[1]>visota*Point)

{

....

}

 
Dmitriywelcome:

 Как в Mql5 будет выглядеть код 

Примерно так

   MqlRates rates[2]; 
   int copied = CopyRates(NULL, 0, 0, 2, rates);
   if(rates[0].close-rates[0].open > visota*_Point)
     {
      /******************/
     }
Необходимые проверки сами прикрутите.
 
Dmitriywelcome:

 Как в Mql5 будет выглядеть код 

Можно и так

if(iClose(NULL,0,1)-iOpen(NULL,0,1)>visota*_Point)
 

можно и так:

#define Close(shift) iClose(NULL,0,shift)
#define Open(shift)  iOpen(NULL,0,shift)
....
if (Close(1) - Open(1) > visota*_Point)
 

44

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

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

Для этого же бара пытаюсь прописать  условие:

если цена закрытия текущей свечи выше линии индикатора  и цена Bid на любом из последующих баров больше линии индикатора - ..условие 1

Как это правильно сделать?

if (m_position.Select(_Symbol))         //проверка на наличие позиции
   { 
    Print ("Позиция открыта");
    if(m_position.PositionType()==POSITION_TYPE_BUY)
    {
     Print ("Открыта на покупку");
     if (close_1 > Sig_Up[0])   //цена закрытия текущей свечи выше линии индикатора 
       {
        int cl = 4;
     if (cl && Bid > Sig_Up[0])  // Bid больше линии индикатора
       {
        ....
     }
     }                        
     }                                                           
     }
 
Igor Makanu:

можно и так:

а с нумерацией баров ничего не надо разве делать. Т.е. код из четверки с первым баром для пятерки будет тоже с первым баром без переворота нумерации?