Лажа с CopyOpen - страница 3

 
x_trader:

в изначально написанном эксперте использовались вызовы других символов?


..или вызовы индикаторов, которые таки обращаются к данным другого инструмента?

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
//+------------------------------------------------------------------+
//|                                                           11.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int h;

int OnInit()
  {
//---
   h=iMA(_Symbol,Period(),14,0,MODE_SMA,PRICE_CLOSE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
   datetime dt[];
   datetime st=0;
      if(CopyTime(_Symbol,Period(),TimeCurrent(),st,dt)==-1){
         Alert("Ошибка-1");
      }
      else{
         Alert("Ok-1");
      }
      
   double buf2[];
   
      if(CopyBuffer(h,0,TimeCurrent(),st,buf2)==-1){
         Alert("Ошибка-2");
      }
      else{
         Alert("Ok-2");
      }
      
  }
//+------------------------------------------------------------------+

Нафига это надо, затем, что это документированный функционал.

CopyBuffer() при st=0 работает без проблем.

 
Integer:

ok. ничего не имею против, чтоб весь функционал - функционировал)


Покрутил эксп, ошибок в логах таки нет. Возникают изредка иль надо чтот ещё хитрое сделать?



 
Swan:

ok. ничего не имею против, чтоб весь функционал - функционировал)

Покрутил эксп, ошибок в логах таки нет. Возникают изредка иль надо чтот ещё хитрое сделать?

Ничего не надо, просто прикрепить на график, сразу и непрервыно происходит "Ошибка-1". Билд 450.

 

 
Integer:

Ничего не надо, просто прикрепить на график, сразу и непрервыно происходит "Ошибка-1". Билд 450.

 

Я как понял второй способ вызова - От даты копируется определенное число баров?

int  CopyTime(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   int              count,           // сколько копируем
   datetime         time_array[]     // массив для копирования времени открытия
   );

Тогда непонятно почему копируем 0 баров?

На мой взгляд более правильно OnTick() должен выглядеть так (хотяне уверен что такой подход также абсолютно верен - вылезают ошибки периодически)

void OnTick()
{
//----------------------------------------------------------------------------//
//Work variables
int ResTime,ResMA;

datetime dt[];
double buf2[];

datetime st=1;
//----------------------------------------------------------------------------//
ResTime = CopyTime(_Symbol,Period(),TimeCurrent(),st,dt);
ResMA   = CopyBuffer(h,0,TimeCurrent(),st,buf2);

  if(ResTime == -1){Print("Ошибка-1");}else Print("Ok-1");
  if(ResMA   == -1){Print("Ошибка-2");}else Print("Ok-2");  
//----------------------------------------------------------------------------//    
}


 

Кстати, о птичках.

Если делать вот такой вызов исполняется без проблем

ResTime = CopyTime(_Symbol,Period(),TimeCurrent()-PeriodSeconds(Period()),st,dt);
ResMA   = CopyBuffer(h,0,TimeCurrent()-PeriodSeconds(Period()),st,buf2);

PS

Хотя, так тоже не верно, скорей всего, поскольку тогда может возникнуть проблема в момент появлении нового бара (хотя точно не проверял).

 
Integer:

Ничего не надо, просто прикрепить на график, сразу и непрервыно происходит "Ошибка-1". Билд 450.

Билд 450, ХР SP2 32bit

1 не получаецо.

2011.05.23 10:57:26    11 (EURUSD,M15)    Ошибка-2
достаточно часто..

таки прямо хз)

 
Если действительно есть ошибка в работе функций, то нужно написать в Сервисдеск с приложением всех деталей. Это поможет разобраться и быстро решить вопрос. Пока так и не очевидно, что это ошибка терминала, а не ошибка программирования.
Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 
Interesting:

Я как понял второй способ вызова - От даты копируется определенное число баров?

Тогда непонятно почему копируем 0 баров?

На мой взгляд более правильно OnTick() должен выглядеть так (хотяне уверен что такой подход также абсолютно верен - вылезают ошибки периодически)


Третий вариант от даты до даты, st объявлена как datetime.

 

 

 
Swan:

Билд 450, ХР SP2 32bit

1 не получаецо.

2011.05.23 10:57:26    11 (EURUSD,M15)    Ошибка-2
достаточно часто..

таки прямо хз)


На оригинальном эксперте у меня вылазят обе и периодически (очень часто).

Если st=1 то появляются, но не так часто.

В моем варианте ошибок нет, но и что в итоге возвращается сказать трудно (не проверял).

Билд 450, ХР SP3 32bit. - Пара EURUSD D1