Скачать MetaTrader 5

Проблема с установкой индикатора...

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
extern.fx
467
extern.fx  
input string symbol = "EURUSD";
input ENUM_TIMEFRAMES timeframe = PERIOD_H4;
input datetime from_date = D'2010.01.01 00:00';
input datetime to_date = D'2010.03.01 00:00';

int ind_handle;
input int ind_buffer_num = 0;
input int ind_period = 14;
input ENUM_APPLIED_PRICE ind_applied_price = PRICE_CLOSE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) < 0 );
      Print( "Ошибка установки индикатора на ", symbol, " ", timeframe, ".", " Ошибка №", GetLastError() );
   Print( "Ошибки при инициализации: ", GetLastError(), "\nХэндл: ", ind_handle );
//---
   return(0);

}

А это лог...


2010.08.03 02:03:04    Externis (EURUSD,H1)    Хэндл: 10
2010.08.03 02:03:04    Externis (EURUSD,H1)    Ошибки при инициализации: 0
2010.08.03 02:03:04    Externis (EURUSD,H1)    Ошибка установки индикатора на EURUSD 16388. Ошибка №0

И в дальнейшем при вызове CopyBuffer, так же возникает ошибка...

В чем здесь проблема?

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
Aleksey Lebedev
6059
Aleksey Lebedev  
extern.fx:

В чем здесь проблема?


   if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) < 0 );


по условию выполняется пустой оператор.

Результат if - вроде всегда false должно быть. С нолём сравнивается не ind_handle, а булевый результат присваивания..

А хэндл таки получен, ошибки здесь нет :)


зы: странно, что хендл получен, всетаки первым должно выполнится сравнение, затем присваивание

Vladimir Batrudinov
4930
Vladimir Batrudinov  
Swan:

   if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) < 0 );


зы: странно, что хендл получен, всетаки первым должно выполнится сравнение, затем присваивание

Не верно. Сначала присваивание, затем сравнение. Это ведь не как "попытка" должно функционировать, а в том виде в каком условие описано...

PS

Только как я понимаю проверять нужно на инвалидность хэндла....

Sergey Gritsay
6616
Sergey Gritsay  
extern.fx:
input string symbol = "EURUSD";
input ENUM_TIMEFRAMES timeframe = PERIOD_H4;
input datetime from_date = D'2010.01.01 00:00';
input datetime to_date = D'2010.03.01 00:00';

int ind_handle;
input int ind_buffer_num = 0;
input int ind_period = 14;
input ENUM_APPLIED_PRICE ind_applied_price = PRICE_CLOSE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) < 0 );
      Print( "Ошибка установки индикатора на ", symbol, " ", timeframe, ".", " Ошибка №", GetLastError() );
   Print( "Ошибки при инициализации: ", GetLastError(), "\nХэндл: ", ind_handle );
//---
   return(0);

}

А это лог...


2010.08.03 02:03:04    Externis (EURUSD,H1)    Хэндл: 10
2010.08.03 02:03:04    Externis (EURUSD,H1)    Ошибки при инициализации: 0
2010.08.03 02:03:04    Externis (EURUSD,H1)    Ошибка установки индикатора на EURUSD 16388. Ошибка №0

И в дальнейшем при вызове CopyBuffer, так же возникает ошибка...

В чем здесь проблема?

  как таковой ошибки нет, просто вы немного не правильно оформили код, вот правильный вариант

input string symbol="EURUSD";
input ENUM_TIMEFRAMES timeframe=PERIOD_H4;
input datetime from_date=D'2010.01.01 00:00';
input datetime to_date=D'2010.03.01 00:00';

int ind_handle;
input int ind_buffer_num=0;
input int ind_period=14;
input ENUM_APPLIED_PRICE ind_applied_price=PRICE_CLOSE;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ind_handle=iMomentum(symbol,timeframe,ind_period,ind_applied_price);
   if(ind_handle<0)
      Print("Не удалось создать индикатор, Ошибка № - : ",GetLastError());
   else
      Print("Индикатор создан на ", symbol, ", ТФ ", timeframe,", Хэндл: ",ind_handle);

//---
   return(0);
  }
Vladimir Batrudinov
4930
Vladimir Batrudinov  
sergey1294:

  как таковой ошибки нет, просто вы немного не правильно оформили код, вот правильный вариант

В условии действительно есть ошибка, только как я сказал, сравнивать ПРАВЕЛЬНЕЙ не с 0, а "инвалидным хэндлом" (хотя кому как).

  if(ind_handle == INVALID_HANDLE)
  {
  Print( "Ошибка установки индикатора на ",symbol, " ",timeframe, ".", " Ошибка №", GetLastError() );
  }

При этом зачем сообщать об успехе остается загадкой...

Sergey Gritsay
6616
Sergey Gritsay  
Interesting:

В условии действительно есть ошибка, только как я сказал, сравнивать ПРАВЕЛЬНЕЙ не с 0, а "инвалидным хэндлом" (хотя кому как).

При этом зачем сообщать об успехе остается загадкой...

 согласен с тобой. что касается сообщения об успехе, видимо человеку это нужно, мы с вами указали ему на его ошибки, дальше дело хозяйское.

P.S

Еще пару советов, перед копированием данных, так же желательно проверять хендл индикатора и состояние функции  CopyBuffer. примерно так

int TradeSignal_02()
  {
   int sig=0;

   if(h_macd==INVALID_HANDLE)
     {
      h_macd=iMACD(Symbol(),Period(),12,26,9,PRICE_CLOSE);
      return(0);
     }
   else
     {
      if(CopyBuffer(h_macd,0,0,2,macd1_buffer)<2)
         return(0);
      if(CopyBuffer(h_macd,1,0,3,macd2_buffer)<3)
         return(0);
      if(!ArraySetAsSeries(macd1_buffer,true))
         return(0);
      if(!ArraySetAsSeries(macd2_buffer,true))
         return(0);
     }

//--- проводим проверку условия и устанавливаем значение для sig
   if(macd2_buffer[2]>macd1_buffer[1] && macd2_buffer[1]<macd1_buffer[1])
      sig=1;
   else if(macd2_buffer[2]<macd1_buffer[1] && macd2_buffer[1]>macd1_buffer[1])
      sig=-1;
   else sig=0;

//--- возвращаем торговый сигнал
   return(sig);
  }
extern.fx
467
extern.fx  

Окончательный вариант получился такой:

input string symbol = "EURUSD";
input ENUM_TIMEFRAMES timeframe = PERIOD_H4;
input datetime from_date = D'2010.01.01 00:00';
input datetime to_date = D'2010.03.01 00:00';

int ind_handle;
input int ind_buffer_num = 0;
input int ind_period = 14;
input ENUM_APPLIED_PRICE ind_applied_price = PRICE_CLOSE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price );
   if( ind_handle == INVALID_HANDLE )
      Print( "Ошибка установки индикатора на ", symbol, " ", timeframe, ".", " Ошибка №", GetLastError() );
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   IndicatorRelease( ind_handle );
}

Проблема решена... Спасибо всем! =)

К сожалению, писать как в С++ нельза, т.е.

if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) == INVALID_HANDLE ) ... // Не правильно


Vladimir Batrudinov
4930
Vladimir Batrudinov  

extern.fx:

К сожалению, писать как в С++ нельза, т.е.

if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) == INVALID_HANDLE ) ... // Не правильно


С чего это вдруг?

Так можно, но не нужно (хотя кому как)...

  if(ind_handle = iMomentum(Symbol(),Period(),14,PRICE_CLOSE)==INVALID_HANDLE)
  {
  Print("Не удалось создать индикатор, Ошибка № - : ",GetLastError());
  }
Aleksey Lebedev
6059
Aleksey Lebedev  
extern.fx:

К сожалению, писать как в С++ нельза, т.е.

if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) == INVALID_HANDLE ) ... // Не правильно


в си тоже низзя, приоритет операций сравнения выше, чем присваивания.

Interesting:

сравнивать ПРАВЕЛЬНЕЙ не с 0, а "инвалидным хэндлом" (хотя кому как).

"<" теоретически выполняется быстрее "=="  :)

Документация по MQL5: Основы языка / Операции и выражения / Приоритеты и порядок операций
Документация по MQL5: Основы языка / Операции и выражения / Приоритеты и порядок операций
  • www.mql5.com
Основы языка / Операции и выражения / Приоритеты и порядок операций - Документация по MQL5
Простак
315
Простак  
extern.fx:

Окончательный вариант получился такой:

input string symbol = "EURUSD";
input ENUM_TIMEFRAMES timeframe = PERIOD_H4;
input datetime from_date = D'2010.01.01 00:00';
input datetime to_date = D'2010.03.01 00:00';

int ind_handle;
input int ind_buffer_num = 0;
input int ind_period = 14;
input ENUM_APPLIED_PRICE ind_applied_price = PRICE_CLOSE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price );
   if( ind_handle == INVALID_HANDLE )
      Print( "Ошибка установки индикатора на ", symbol, " ", timeframe, ".", " Ошибка №", GetLastError() );
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   IndicatorRelease( ind_handle );
}

Проблема решена... Спасибо всем! =)

К сожалению, писать как в С++ нельза, т.е.

if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) == INVALID_HANDLE ) ... // Не правильно



А так, как ниже, - можно?

if( (ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price )) == INVALID_HANDLE ) ... // Правильно

Ну, и, соответственно, код OnInit():

int OnInit()
{
//---
   if( (ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price )) == INVALID_HANDLE )
      Print( "Ошибка установки индикатора на ", symbol, " ", timeframe, ".", " Ошибка №", GetLastError() );
//---
   return(0);
}

?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий