Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
extern.fx
460
extern.fx 2010.08.07 11:34 
bool HeikenAshi::Create(string _symbol,ENUM_TIMEFRAMES _timeframe)
{
   symbol = _symbol;
   timeframe = _timeframe;
   handle = iCustom( symbol, timeframe, "Examples\\Heiken_Ashi" );
   if( handle < 0 )
   {
      Print( "Ошибка при инициализации Heiken Ashi #: ", GetLastError() );
      return( false );
   }
   else
      Print( "Heiken Ashi Handle: ", handle );
   if( CopyBuffer( handle, 0, 0, 32, open ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   if( CopyBuffer( handle, 1, 0, 32, high ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   if( CopyBuffer( handle, 2, 0, 32, low ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   if( CopyBuffer( handle, 3, 0, 32, close ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   ArraySetAsSeries( open, true );
   ArraySetAsSeries( high, true );
   ArraySetAsSeries( low, true );
   ArraySetAsSeries( close, true );
   return( true );
}

Что здесь не так? Я уже все, что можно перепробовал!  Хэндл присваивает, а при копировании пишет ошибку 4806!

Sergey Gritsay
6558
Sergey Gritsay 2010.08.07 18:14  
extern.fx:

Что здесь не так? Я уже все, что можно перепробовал!  Хэндл присваивает, а при копировании пишет ошибку 4806!


 не знаю почему у вас так, я с классами пока не работаю, в виде пользовательской функции данная конструкция работает замечательно, проверено
int TradeSignal_20()
  {
   int sig=0;

   if(h_ich==INVALID_HANDLE)
     {
      h_ich=iIchimoku(Symbol(),Period(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);
      return(0);
     }
   else
     {
      if(CopyBuffer(h_ich,0,0,2,ich1_buffer)<2)
         return(0);
      if(CopyBuffer(h_ich,1,0,2,ich2_buffer)<2)
         return(0);
      if(!ArraySetAsSeries(ich1_buffer,true))
         return(0);
      if(!ArraySetAsSeries(ich2_buffer,true))
         return(0);
     }
//--- проводим проверку условия и устанавливаем значение для sig
   if(ich1_buffer[1]>ich2_buffer[1])
      sig=1;
   else if(ich1_buffer[1]<ich2_buffer[1])
      sig=-1;
   else sig=0;

//--- возвращаем торговый сигнал
   return(sig);
  }
есть еще замечание не понятно зачем вы прописали эти присваивания
   symbol = _symbol;
   timeframe = _timeframe;
можно это сделать так
bool HeikenAshi::Create(string _symbol,ENUM_TIMEFRAMES _timeframe)
{
   handle = iCustom( _symbol, _timeframe, "Examples\\Heiken_Ashi" );
   if( handle < 0 )
   {
      Print( "Ошибка при инициализации Heiken Ashi #: ", GetLastError() );
      return( false );
   }
   else
      Print( "Heiken Ashi Handle: ", handle );
   if( CopyBuffer( handle, 0, 0, 32, open ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   if( CopyBuffer( handle, 1, 0, 32, high ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   if( CopyBuffer( handle, 2, 0, 32, low ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   if( CopyBuffer( handle, 3, 0, 32, close ) )
   {
      Print( "Ошибка при копировании open[] #:", GetLastError() );
      return( false );
   }
   ArraySetAsSeries( open, true );
   ArraySetAsSeries( high, true );
   ArraySetAsSeries( low, true );
   ArraySetAsSeries( close, true );
   return( true );
}

Sergey Gritsay
6558
Sergey Gritsay 2010.08.07 18:34  
только что проверил ваш код, во первых скорее всего у вас не скомпилирован индикатор Heiken_Ashi, во вторых у вас не правильно задано условие проверки. правильно будет так
bool HeikenAshi::Create(string _symbol,ENUM_TIMEFRAMES _timeframe)
  {
   int handle=iCustom(_symbol,_timeframe,"Examples\\Heiken_Ashi");
   if(handle<0)
     {
      Print("Ошибка при инициализации Heiken Ashi #: ",GetLastError());
      return(false);
     }
   else Print("Heiken Ashi Handle: ",handle);

   if(CopyBuffer(handle,0,0,32,open)<0)
     {
      Print("Ошибка при копировании open[] #:",GetLastError());
      return(false);
     }
   else Print("Данные для open скопированы: ");

   if(CopyBuffer(handle,1,0,32,high)<0)
     {
      Print("Ошибка при копировании high[] #:",GetLastError());
      return(false);
     }
   else Print("Данные для high скопированы: ");

   if(CopyBuffer(handle,2,0,32,low)<0)
     {
      Print("Ошибка при копировании low[] #:",GetLastError());
      return(false);
     }
   else Print("Данные для low скопированы: ");

   if(CopyBuffer(handle,3,0,32,close)<0)
     {
      Print("Ошибка при копировании close[] #:",GetLastError());
      return(false);
     }
   else Print("Данные для close скопированы: ");

   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
   return(true);
  }


Vladimir Batrudinov
4928
Vladimir Batrudinov 2010.08.07 18:57  
extern.fx:

Что здесь не так? Я уже все, что можно перепробовал!  Хэндл присваивает, а при копировании пишет ошибку 4806!


Как я понял тут присутсвует попытка реализовать "хитрый конструктор". (с) похоже... :)

Рекомендую сделать следующие вещи:

1. Перенести блок определяющий серийность массивов в основной конструктор

//Constructor HeikenAshi.HeikenAshi
void HeikenAshi::HeikenAshi()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
//----------------------------------------------------------------------------//
}

2. Оставить в этом "конструкторе" только получение хэндла

//Constructor HeikenAshi.Create
bool HeikenAshi::Create(string _symbol,ENUM_TIMEFRAMES _timeframe)
{
//----------------------------------------------------------------------------//
//Work variables
double Result;
//----------------------------------------------------------------------------//
Result = true;

handle = iCustom( _symbol, _timeframe, "Examples\\Heiken_Ashi" );

  if(handle == INVALID_HANDLE)
  {
  Print( "Ошибка при инициализации Heiken Ashi #: ", GetLastError() );
  Result = false;
  }
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}

3. Получение данных вынести в отдельную функцию (с проверкой на инвалидность хэндла внутри этой функции)

В зависимости от реализации класса (два варианта)

1. С передачей хэндла в параметрах

//Constructor HeikenAshi.CopyData
bool HeikenAshi::CopyData(int handle,int buffer_num,int start_pos,int count)
{
//----------------------------------------------------------------------------//
//Work variables
double Result;
//----------------------------------------------------------------------------//

//Check correctness of the handle
  if(handle == INVALID_HANDLE)
  {
  Print( "Ошибка при инициализации Heiken Ashi #: ", GetLastError() );
  Result = false;
  }
//Copying operational data
  
//----------------------------------------------------------------------------//
return( true );
//----------------------------------------------------------------------------//
}

2. Хэндл индикатора берется у класса на прямую

//Constructor HeikenAshi.CopyData
bool HeikenAshi::CopyData(int buffer_num,int start_pos,int count)
{
//----------------------------------------------------------------------------//
//Work variables
double Result;
//----------------------------------------------------------------------------//

//Check correctness of the handle
  if(handle == INVALID_HANDLE)
  {
  Print( "Ошибка при инициализации Heiken Ashi #: ", GetLastError() );
  Result = false;
  }
//Copying operational data
  
//----------------------------------------------------------------------------//
return( true );
//----------------------------------------------------------------------------//
}


extern.fx
460
extern.fx 2010.08.08 13:02  

Спасибо за вашу помощь, но ничего не помогает... Вот выкидываю заголовочный файл... Накиньте код и протестите тестером стратегий, и если это заработает - я выкину свой ноут!!!

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

Выкидываю все...

Файлы:
Vladimir Batrudinov
4928
Vladimir Batrudinov 2010.08.08 13:41  
extern.fx:

Спасибо за вашу помощь, но ничего не помогает... Вот выкидываю заголовочный файл... Накиньте код и протестите тестером стратегий, и если это заработает - я выкину свой ноут!!!

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

Выкидываю все...

В индикаторе нет серийности массивов, в классе есть. Я правильно понял?
extern.fx
460
extern.fx 2010.08.08 13:58  
Interesting:
В индикаторе нет серийности массивов, в классе есть. Я правильно понял?
Видимо да... А что, так нельзя? Я не замечал нигде такого...
Vladimir Batrudinov
4928
Vladimir Batrudinov 2010.08.08 14:07  
extern.fx:
Видимо да... А что, так нельзя? Я не замечал нигде такого...

Немного о серийности массивов

Получаем дату 0 бара в истории.

Без указания что массив серия    - 1993.05.13 00:00:00

С указанием серийности массива - 2010.08.06 20:00:00

Чувствуете разницу?


Vladimir Batrudinov
4928
Vladimir Batrudinov 2010.08.08 16:54  

extern.fx, при инициализации индикатора в классе ошибки не возникало и если да то какая.

У меня выскакивает 4802 (не разобрался с чем связана)...


Валерий
1433
Валерий 2010.08.08 17:05  
Interesting:

extern.fx, при инициализации индикатора в классе ошибки не возникало и если да то какая.

У меня выскакивает 4802 (не разобрался с чем связана)...



ERR_INDICATOR_CANNOT_CREATE

4802

Индикатор не может быть создан

Vladimir Batrudinov
4928
Vladimir Batrudinov 2010.08.08 17:10  
Valmars:

ERR_INDICATOR_CANNOT_CREATE

4802

Индикатор не может быть создан

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