В чем здесь проблема?
по условию выполняется пустой оператор.
Результат if - вроде всегда false должно быть. С нолём сравнивается не ind_handle, а булевый результат присваивания..
А хэндл таки получен, ошибки здесь нет :)
зы: странно, что хендл получен, всетаки первым должно выполнится сравнение, затем присваивание
Не верно. Сначала присваивание, затем сравнение. Это ведь не как "попытка" должно функционировать, а в том виде в каком условие описано...
PS
Только как я понимаю проверять нужно на инвалидность хэндла....
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) Ошибки при инициализации: 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); }
как таковой ошибки нет, просто вы немного не правильно оформили код, вот правильный вариант
В условии действительно есть ошибка, только как я сказал, сравнивать ПРАВЕЛЬНЕЙ не с 0, а "инвалидным хэндлом" (хотя кому как).
if(ind_handle == INVALID_HANDLE) { Print( "Ошибка установки индикатора на ",symbol, " ",timeframe, ".", " Ошибка №", GetLastError() ); }
При этом зачем сообщать об успехе остается загадкой...
В условии действительно есть ошибка, только как я сказал, сравнивать ПРАВЕЛЬНЕЙ не с 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); }
Окончательный вариант получился такой:
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 ) ... // Не правильно
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()); }
К сожалению, писать как в С++ нельза, т.е.
if( ind_handle = iMomentum( symbol, timeframe, ind_period, ind_applied_price ) == INVALID_HANDLE ) ... // Не правильно
в си тоже низзя, приоритет операций сравнения выше, чем присваивания.
сравнивать ПРАВЕЛЬНЕЙ не с 0, а "инвалидным хэндлом" (хотя кому как).
"<" теоретически выполняется быстрее "==" :)
- www.mql5.com
Окончательный вариант получился такой:
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); }
?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
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) Ошибки при инициализации: 0
2010.08.03 02:03:04 Externis (EURUSD,H1) Ошибка установки индикатора на EURUSD 16388. Ошибка №0
И в дальнейшем при вызове CopyBuffer, так же возникает ошибка...
В чем здесь проблема?