Мой индикатор исчезает при переходе на новый график таймфрейма - страница 3

 

Привет, ШОК,

Я получил его. Большое спасибо.

если есть 100 бар, общие ставки начинаются от 0 до 99.

В начале, pre_cal =0 --> limit=100 бар - 0 =100.

for(int=1 to limit=100; I++)

в самом конце, I=100(значение индекса) и такого бара 100 не существует.

Поэтому, чтобы сделать максимальный I=99, я ставлю limit -1;

Интересно, есть ли лучший способ?

Более того, меня смущает то, что во многих других индикаторах я использую тот же подход и нет такой проблемы выхода за пределы диапазона.

Также спасибо за вкладку Expert.

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

Более того, меня смущает то, что во многих других индикаторах я использую тот же подход, и там нет такой проблемы выхода за пределы диапазона.



До выхода B600 за пределы диапазона не было критической ошибкой
 
scfx:.

Поэтому, чтобы сделать максимальный I=99, я ставлю limit -1;

Интересно, есть ли лучший способ?

Ваш код теперь будет рисовать историю графика от бара 1 вверх без ошибок, но он не будет рисовать для любых новых баров. Есть много способов написать код в зависимости от того, что вы хотите, чтобы он делал. Посмотрите на включенные индикаторы в metaeditor, чтобы увидеть, как это делают кодеры MQ. Когда вы сможете прочитать их код и понять причину каждой строки, у вас не будет проблем с созданием индикаторов.

 

Теперь я понял, что это ШОК.

Лично мне трудно представить, когда я читаю документ. До сих пор я не уверен, почему prev_calculated= Total_rates -1.

Поэтому я привожу здесь числовой пример. Надеюсь, он поможет кому-то новому, как я.

Обычно мы видим:

Limit= rates_total- prev_calculated; //(no-1)

ИЛИ

for(i=1;i<limit;i++) or for(i=1;i<=limit;i++)

Важно убедиться, что LIMIT >=1. В моей ситуации LIMIT=0 и поэтому индикатор не обновляется при поступлении нового тика.

Почему, давайте посмотрим. (Я думаю, что причина в prev_calculated, по крайней мере, в моем случае).

Предположим, что я устанавливаю индикатор, когда на графике 100 баров. Вот значения переменных:

Первая таблица значений
Переменная
Total_rates 100
Index of bar 0-99
prev_calculated 0
Limit 100
Loop i value 1-99

Все хорошо. Значение будет отображаться первый раз с бара 1 до начала графика.Сколько баров уже рассчитано? Это критическая точка моей ошибки и я не понимаю на 100%.

Когда начинается новый бар, на графике сейчас 101 бар. Индикатор не обновляется на уже закрытом баре, который сейчас является баром 1.

Вторая таблица значений
Переменная
Total_rates 101
Индекс бара 0-100
prev_calculated 99 OR 100 (см. ниже)
Limit2 ИЛИ 1
Loop i value 1to1 ИЛИ 1 to 0

Исходя из 1-ой таблицы, индикатор рассчитывает 99 бар (так как он зацикливается от 1 до 99).
Однако в документе сказано: "НО если это не первый вызов start(), то будет возвращено значение, равное Bars-1). Таким образом, будет возвращено 101-1=100.
Этот один бар вызывает проблемы. Если система возвращает 100 как prev_calculated.
Вы видите, что если prev_calculated=99, то цикл будет работать.
Однако, похоже, что prev_calculated = 100 и поэтому цикл не будет работать, так как limit =0 или -1 в зависимости от этого.
Может ли кто-нибудь помочь мне увидеть логику, стоящую за prev_calculated= Bars-1 в этом случае?

Итак, решение вполне очевидно: Make for(i=1; ___ здесь должно быть больше 1 for (<) или больше или равно 1 for (<=)___; i++). В моем последнем коде он равен 0.

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

Надеюсь, это поможет.

SCFX

 

prev_calculated == rates_total

scfx:

Теперь я понял, что это SDC.

Лично мне трудно представить, когда я читаю документ. Но все же я не уверен, почему prev_calculated = Total_rates -1.

SCFX

Создайте новый индикатор, поместите этот код в функцию start, прикрепите его к 1-минутному графику и наблюдайте за алертами по мере поступления тиков.

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

Вы увидите, что rates_total - это текущее количество баров.

prev_calculated - количество баров на предыдущем тике.

 
SDC:

prev_calculated == rates_total

Создайте новый индикатор, поместите этот код в функцию start, прикрепите его к 1-минутному графику и наблюдайте за оповещениями по мере поступления тиков.

Вы увидите, что rates_total - это текущее количество баров.

prev_calculated - количество баров на предыдущем тике.


Странно.

В ссылке, размещенной ранее, говорится, что если :НО если это не первый вызов start(), то будет возвращено значение, равное Bars-1.

Как получается, что возвращается Bars (Rate_totals).

 

Да, я знаю, что так говорят, но это не совсем точно.

На самом деле происходит следующее.

rates_total == общее количество баров, когда наступил текущий тик. prev_calculated == общее количество баров, когда наступил предыдущий тик.

Бары на графике Состояние индикатора ставки_всего prev_calculated rates_total-prev_calculated
1000 первый запуск при загрузке 1000 0 1000
1000 следующий тик 1000 1000 0
1000 следующий тик 1000 1000 0
1001 1-й тик нового бара 1001 1000 1
1001 следующий тик 1001 1001 0
1001 следующий тик 1001 1001 0

Таким образом, у вас есть 3 основных состояния prev-calculated vs rates_total. Индикатор загружен, тики середины бара, первый тик нового бара.

prev_calculated == 0 при первом запуске, потому что не было предыдущего тика с момента загрузки индикатора.

Также при изменении графика или добавлении истории prev_calculated обнуляется.

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

 
Бары на графике Показатель Состояние ставки-всего предварительно рассчитанные ставки_общие-предыдущие_расчетные
1000 первый запуск при загрузке 1000 0 1000
И бара 1000 не существует.

Я знаю, что говорится в новых документах. Если делать по-ихнему, то нужно проверить prev_calculated на ненулевое значение и скорректировать rates_total - prev_calculated вниз на единицу. Это возврат к путанице с декрементом индикатора_рассчитанного.
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
Смотрите Показать прогресс индикатора - форум MQL4
 

Нет смысла делать return( rates_total - 1 ), значение prev_calculated будет таким, как если бы это был return(rates_total), независимо от того, что вы сказали ему вернуть.

 
SDC: Нет смысла делать return( rates_total - 1 ), значение prev_calculated будет таким, как если бы это был return(rates_total), независимо от того, что вы сказали ему вернуть.
Вы сообщили о проблеме в службу поддержки?
Причина обращения: