Вопросы от "чайника" - страница 63

 
masharov:

В советнике используется обращение к индикатору на другом таймфрейме. На тестах в советнике появляются неверные данные от индикатора.

Сам советник работает на M5, а индикатор на H4. Индикаторы, которые вызываются на том же таймфрейме (M5), возвращают правильные значения.

Возвращаемые значения похожи на значения индикатора, но отличаются от реальных, которые видны при наложении индикатора в окне ценового графика.

В чем проблема? 

Примерный код вызова индикатора:

 

 Возможные причины:

 - не соблюдено правило первых 14 баров: https://www.mql5.com/ru/articles/15 в индикаторе;

 - не соблюдена корреляция между текущим ТФ и предзаданным (например, порядковый номер бара с нужным значением экстремума на другом ТФ наверняка будет иной, нежели на предзаданном, а следовательно, и значения high, low и т. д. будут совсем иные) - всё это зависит от конкретной реализации индикатора; необходимо чётко представлять, что именно и с чем нужно скоррелировать и сделать пересчёт по формуле через соотношение разных периодов;

 - возможно, остаются старые индикаторные значения в буфере с предыдущего тика и может потребоваться переинициализация буфера пустыми значениями: ArrayInitialize(array,EMPTY_VALUE).

Индикатор от индикатора в MQL5
Индикатор от индикатора в MQL5
  • 2010.02.08
  • MetaQuotes Software Corp.
  • www.mql5.com
При написании индикатора, который использует краткую форму вызова функции OnCalculate(), можно упустить то обстоятельство, что индикатор может рассчитываться не только на ценовых данных, но и на данных другого индикатора (встроенного или пользовательского - не имеет значения). Вы хотите улучшить индикатор, чтобы он правильно считался не только на ценовых данных, но и значениях другого индикатора? В этой статье мы по шагам пройдем все необходимые этапы такой модификации и выведем дополнительные полезные правила для правильного написания индикатора.
 
x100intraday:

 Возможные причины:

 - не соблюдено правило первых 14 баров: https://www.mql5.com/ru/articles/15 в индикаторе;

 - не соблюдена корреляция между текущим ТФ и предзаданным (например, порядковый номер бара с нужным значением экстремума на другом ТФ наверняка будет иной, нежели на предзаданном, а следовательно, и значения high, low и т. д. будут совсем иные) - всё это зависит от конкретной реализации индикатора;

 - возможно, остаются старые значения в индикаторе с предыдущего тика и может потребоваться переинициализация буфера пустыми значениями: ArrayInitialize(array,EMPTY_VALUE).

1. на ценовом графике индикатор отрисовывается на всех барах.

2. анализировал это. Здесь все - ок.

3. не помогло 

 

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

D'12:00:00'

Присваиваю переменной типа datetime значение:

 datetime start = D'12:00:00'

При компиляции выходит предупреждение:

 

Почему? 

 
Urain:
Потому что не указана дата, указано только время 12 часов 00 минут 00 секунд. Дата пишется через точку а не двоеточие.

В справке сказано, что: 

Может опускаться либо дата (год, месяц, число), либо время (часы, минуты, секунды), либо все вместе. Диапазон значений от 1 января 1970 года до 31 декабря 3000 года.

Примеры:

D'2004.01.01 00:00' // Новый Год
D'1980.07.19 12:30:27'
D'19.07.1980 12:30:27'
D'19.07.1980 12' //равнозначно D'1980.07.19 12:00:00'
D'01.01.2004' //равнозначно D'01.01.2004 00:00:00'
D'12:30:27' //равнозначно D'[дата компиляции] 12:30:27'
D'' //равнозначно D'[дата компиляции] 00:00:00'

 ...

Или я неправильно понимаю?  

 
masharov:

Сам советник работает на M5, а индикатор на H4. Индикаторы, которые вызываются на том же таймфрейме (M5), возвращают правильные значения. 

 Продолжаю настаивать на втором пункте.

 Вы же сами пишете, что на одинаковых ТФ возвращаются верные значения. На разных - понятное дело, будут возвращаться значения мимо ожидаемых для текущего ТФ.

 

masharov:

Возвращаемые значения похожи на значения индикатора, но отличаются от реальных, которые видны при наложении индикатора в окне ценового графика.

  Похожие значения наверняка идут не с потолка, а с одного из ТФ, не равных M5. Если текущим ТФ является H4, то и значения, по-видимому, идут с него, в то время как ожидаются значения с M5. Если перезаточить код с M5 на H4, скорее всего при нахождении на H4 можно будет поймать правильные значения, верные именно для H4 (для остальных ТФ они будут выглядеть некорректными).

 Если индикатор умеет возвращать верные значения в соответствии с тем или иным конкретным ТФ, но не умеет, скажем, на M5 отображать то, что делается на H4, то чего же ожидать от возвращаемых значений при совместной работе в паре с советником, висящим не на том же ТФ?

 
tol64:

В справке сказано, что: 

Может опускаться либо дата (год, месяц, число), либо время (часы, минуты, секунды), либо все вместе. Диапазон значений от 1 января 1970 года до 31 декабря 3000 года.

Примеры:

D'2004.01.01 00:00' // Новый Год
D'1980.07.19 12:30:27'
D'19.07.1980 12:30:27'
D'19.07.1980 12' //равнозначно D'1980.07.19 12:00:00'
D'01.01.2004' //равнозначно D'01.01.2004 00:00:00'
D'12:30:27' //равнозначно D'[дата компиляции] 12:30:27'
D'' //равнозначно D'[дата компиляции] 00:00:00'

 ...

Или я не правильно понимаю?  

Да да, вы всё правильно поняли, это я в торопять не обратил внимания.

Видимо изначально так и было, потом отменили а справку не поправили.

В любом случае вопрос в силе, что это неточность справки или баг?

 

Urain:

... 

В любом случае вопрос в силе, что это неточность справки или баг?

Пример скрипта:

void Set_Start_And_End_TradeSession()
{
 datetime start = D'00:45:00';
 datetime array[];
 int s = 0, e = 0, i = 0;
 long chart_ID = ChartID();
 long count_bars = Bars(Symbol(),0);
 
 CopyTime(Symbol(),0,0,(int)count_bars,array);
 
 ArraySetAsSeries(array,true);
 
 for(s = 0; s < count_bars; s++)
   {
    ObjectCreate(chart_ID,"start_date",OBJ_VLINE,0,array[s],0); ChartRedraw();
    Sleep(50);
    if(array[s]==start) { Comment("Ok!!!"); break; }
    if(i==1441) { Comment("Error!!!"); break; }
    i++;
   }
}
Так работает. Просто не люблю, когда предупреждения после компиляции.)) Может, кто-нибудь из разработчиков прокомментирует.
 
Urain:

В любом случае вопрос в силе, что это неточность справки или баг?

Предупреждения компилятора ещё не означают наличие ошибки. Отправьте на печать: всё отражается в соответствии со Справочником.
 
masharov:

В советнике используется обращение к индикатору на другом таймфрейме. На тестах в советнике появляются неверные данные от индикатора.

Сам советник работает на M5, а индикатор на H4. Индикаторы, которые вызываются на том же таймфрейме (M5), возвращают правильные значения.

Возвращаемые значения похожи на значения индикатора, но отличаются от реальных, которые видны при наложении индикатора в окне ценового графика.

В чем проблема? 

Примерный код вызова индикатора:

 

Флаг AS_SERIES не может быть установлен у многомерных массивов и у статических массивов.

Попробуйте

void OnNewBar() // моя функция
{
 double wave[];
 ArraySetAsSeries(wave, true);
 CopyBuffer(W_handle,0,(int)0,2,wave);
 if (wave[1] > 0) Buy(); 
}

или как-то так

void OnNewBar() // моя функция
{
 double wave[1];
 if(CopyBuffer(W_handle,0,(int)1,1,wave)<1) return;
 if (wave[0] > 0) Buy(); 
}
 
  string Symb="EURUSD";
  for(i=0;i<OrdersTotal()+PositionsTotal();i++)
     {
      if(Symb==PositionGetSymbol(i)) Orders_Total++;
     }
     Alert(Orders_Total);
Подскажите пожайлуста, почему алерт выдает Orders_Total=1, когда на самом деле есть одна позиция и один ордер, т.е. по идее должен выдавать 2, а не 1