Ошибки, баги, вопросы - страница 564

 
Cloud nerwork using error.
В чем причина данной проблемы? Не удается использовать облачные ресурсы.
 
Urain:

Поясните.


Был предварительный анонс запланированных изменений. Окончательный список изменений в очередном билде будет опубликован после выпуска самого билда.
 
Rosh:
Был предварительный анонс запланированных изменений. Окончательный список изменений в очередном билде будет опубликован после выпуска самого билда.
Спасибо.
 

 Долго и упорно вгрызался в код индикатора, покуда совсем не отчаялся выловить возникшие ошибки. В "Чайники" писать не стал, поскольку есть подозрения не на допущенные мной ошибки, а на ошибки в работе терминала.

  Задача индикатора - расставить фракталы на текущем таймфрейме от другого таймфрейма и добавлять новые по мере появления новых фрактальных баров. Пожалуйста, не предлагайте иные способы расстановки фрактальных стрелок, речь не об этом; вопросы здесь принципиальные, касающиеся именно данного кода и, возможно, связанные с некорректной работой терминала. За основу был взят пример из справки iFractals, который для упрощения восприятия логически был сокращён вдвое (только до верхних фракталов), также заимствовано немного кода из штатного Fractals.mq5. Пришлось быть предельно дотошным во избежание шапкозакидательства: увязал почти все возможные и почистил отработавшие массивы, высвободил хэндл вызванного индикатора, что не дало никакой заметной разницы в результатах работы. Были замечены нижеследующие проблемы и особенности в работе:

  1. При первичном!! запуске терминала, открытии нового окна чарта, набрасывании свежескомпилированного индикатора все фракталы скапливались на нулевом баре в конце истории (кажется, что выставился только один), а не расставлялись в соответствии с задумкой и логикой кода. Правильную расстановку удаётся инициировать только при перепрыгивании на другие таймфреймы (иногда даже не с первого раза удаётся). Также при удалении индикатора с чарта, закрытии окна чарта, перекомпиляции, открытии нового окна и набрасывании индикатора почти всегда сразу же удаётся получить требуемую расстановку фракталов. Чтобы увидеть ошибочный эффект, необходимо полностью выгрузить терминал и повторить все шаги п. 1. Возможно, проблема кроется в сроке жизни хэндла вызыванного индикатора и его специфическом поведении при первичном запуске пользовательского индикатора? В случае некорректной расстановки фракталов (когда они все "сжаты" на нулевом баре) вывод в цикле всех элементов exact_extremum даёт нулевой результат, однако вывод соседних значений временнОго буфера TimeUpBuffer, на основе которых он вычисляется и заполняется, даёт последовательно отличающиеся даты времени всегда. Отсюда сразу вопрос: что мешает ему заполниться при первичном набрасывании индикатора, если в последующие разы он исправно заполняется верными значениями?
  2. Тот же код, унаследовавший ту же проблему, но акцент сейчас совсем на другой особенности. В данном индикаторе можно воздержаться от увязывания некоторых промежуточно-расчётных массивов в качестве INDICATOR_CALCULATIONS с индикаторными буферами. Таков первоначальный вариант кода индикатора. И вроде бы всё, не считая п. 1., устраивает.
  3. Но дабы быть предельно грамотными, попробуем соблюсти лучшие рекомендации и свяжем массивы для промежуточных расчётов с буферами индикатора:
    #property indicator_chart_window
    #property indicator_buffers 3
    #property indicator_plots   1
    
    [...]
    
    int OnInit()
      {
       [...]
       SetIndexBuffer(1,PreliminaryUpBuffer,INDICATOR_CALCULATIONS);
       SetIndexBuffer(2,exact_extremum,INDICATOR_CALCULATIONS);
       [...]
      }
    скомпилируем и запустим. В итоге получим в логах Эксперта терминала сообщение об ошибке: 2011.11.11 07:42:03 (AUDUSD,H1) Array out of range, строка: 
                CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                           TimeUpBuffer[shift],
                                           exact_extremum);
    
    Расстановка фракталов на некоторых таймфреймах либо отсутствует, либо носит спорадический характер.
  4. Инициируем спиритический сеанс, совершаем магические пассы руками, подчиняясь автоматическому письму, и заменяем:
    #property indicator_chart_window
    #property indicator_buffers 3
    #property indicator_plots   1
    на:
    #define NUMBER 1
    
    #property indicator_chart_window
    #property indicator_buffers NUMBER+2
    #property indicator_plots   NUMBER
    Корректно ли так делать или нет, но оно непостижимым образом работает!

 Убедительная просьба к обитателям ноосферы и особенно разработчикам: будьте добры, разъясните каждый пункт и подскажите, как всё-таки отладить код индикатора (если только совсем не уходить к принципиально иной реализации).

 Спасибо и файлы прилагаются.

 P.S.: в именах файлов были круглые скобки, но после закачки они испортились.

 

А как определить текущую прибыль по magic сделки?

этот код возвращает прибыль по закрытым сделкам, а мне надо по открытым

#include <Trade\Trade.mqh>
CTrade trade;
void OnTick()
  {
   double profit=0;
   if(PositionSelect(Symbol()))profit=PositionGetDouble(POSITION_PROFIT);
   if(profit==0) trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,0.1,SymbolInfoDouble(Symbol(),SYMBOL_ASK),0,0,"");
   if(profit>1) trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,0.1,SymbolInfoDouble(Symbol(),SYMBOL_ASK),0,0,"");
   
   double ld_return=0;  
   HistorySelect(0,TimeTradeServer());
   for(int i=HistoryDealsTotal()-1;i>=0;i--) // По всем сделкам от конца к началу
     {
      ulong ticket=HistoryDealGetTicket(i); // Определение тикета сделки и ее выделение
      if(ticket!=0) 
      {
      if(HistoryDealGetInteger(ticket,DEAL_TYPE)<2)
      ld_return+=HistoryDealGetDouble(ticket,DEAL_PROFIT);
      }
     }     
   Comment(ld_return);   
  }
 

Как узнать почему инициализация завершается неудачно?

Перед началом инициализации сбрасываю ошибки функцией

ResetLastError();

В конце инициализации вывожу ошибку

Print("Ошибка " + IntegerToString(GetLastError()));

В итоге получаю на вкладке эксперты

2011.11.11 08:47:51    SimpleExpert (EURUSD,H1)    Ошибка 0

на вкладке журнал

2011.11.11 08:47:51    Experts    initializing of SimpleExpert (EURUSD,H1) failed

 
Konstantin83:

Как узнать почему инициализация завершается неудачно?

Перед началом инициализации сбрасываю ошибки функцией

ResetLastError();

В конце вывожу ошибку

Print("Ошибка " + IntegerToString(GetLastError()));

В итоге получаю на вкладке эксперты

2011.11.11 08:47:51    SimpleExpert (EURUSD,H1)    Ошибка 0

на вкладке журнал

2011.11.11 08:47:51    Experts    initializing of SimpleExpert (EURUSD,H1) failed

OnInit возвращает 0 или не 0?
 
stringo:
OnInit возвращает 0 или не 0?

OnInit возвращает true, как то пропустил.

Спасибо, все ок.

 
ddd06:

А как определить текущую прибыль по magic сделки?

этот код возвращает прибыль по закрытым сделкам, а мне надо по открытым

Посмотрите статью Дмитрия (Integer). Там всё самым оптимальным образом реализовано. Статья: Оптимальный метод подсчета объема совокупной позиции по заданному магическому номеру.
 
Добрый день, начал писать мультывалютник, вызываю iMA , почему то в реальной торговле все работает отлично, как только запускаю в тестере возникает ошибка expert removed because indicator 'Moving Average' cannot load [4804], что за индикатора на индикатор, не очень понятно, в интернете не смог найти вразумительного ответа. Подскажите пожалуйста, буду весьма признателен.
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
Технические индикаторы / iMA - Документация по MQL5
Причина обращения: