Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 471

 
Mike:
1. Все совпадают
2. Нет такого параметра.
Мне в другой ветке сказали, что эта проблема в МТ4 нерешаема.  :(

2. Я не знаю где вы взяли МАшку в отдельном окне, чтобы мог что-либо вам сказать о параметре. Но... Если взять из Индикаторы --> Осцилляторы --> Moving Averages of Oscillator, то в нём есть "Применить к:"

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

3. Какая проблема? Что три МАшки не соответствуют трём таким же (по вашему утверждению) МАшкам? Так это не нерешаемо, это - нонсенс. Если они сделаны правильно, то они обязаны совпадать. Какая разница - три отдельные МАшки со своими параметрами, или те же три МАшки с теми же параметрами, но впихнутые в один индикатор с тремя буферами... Вы видите разницу? Я - нет. А если вы её видите, то ищите несоответствие в расчётах МАшек.

Кстати... Аллигатор - три МАшки в одном индикаторе, каждая со своими параметрами. Настройте параметры одинаково с вашими тремя раздельными МАшками - и они совпадут. Правда у вас вся эта вакханалия в отдельном окне... Ну так ... для примера

 
Mike:
Я сделал индикатор ТриВОдном  - 3МА(4,9,14) и решил его сравнить для проверки правильности  с окном, где три индикатора -   МА(4), МА(9), МА(14). Волосы встали дыбом.  :)
Попробуйте отключить самомасштабирование индикаторных окон, может всё и уляжется.
"где три индикатора -   МА(4), МА(9), МА(14)"  индикаторное окно самомасштабируется по первому прикреплённому к этому окну индикатору. В Вашем случае, возможно, это МА(4)
 

Подскажите пожалуйста конструкцию получения через функцию значения встроенного индикатора с верхнего тайм фрейма, но внутри этого тайм фрейма.

Т.е. текущий график 15 минут, нужно получить значение индикатора рассчитанного по дням,но 45 минут назад, как это сделать?

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

 

double iDelta(int Variant,int n,int TF,int index)

  {

   double Fibo=0;

   if(Variant==1) Fibo=0.236;

   if(Variant==2) Fibo=0.382;

   if(Variant==3) Fibo=0.5;

   if(Variant==4) Fibo=0.618;

   if(Variant==5) Fibo=0.764;

   if(Variant==6) Fibo=1;

   if(Variant==7) Fibo=1.236;

   if(Variant==8) Fibo=1.382;

   if(Variant==9) Fibo=1.5;

   if(Variant==10) Fibo=1.618;

   if(Variant==11) Fibo=2.0;

   if(Variant==12) Fibo=2.236;

   if(Variant==-1) Fibo=-0.236;

   if(Variant==-2) Fibo=-0.382;

   if(Variant==-3) Fibo=-0.5;

   if(Variant==-4) Fibo=-0.618;

   if(Variant==-5) Fibo=-0.764;

   if(Variant==-6) Fibo=-1;

   if(Variant==-7) Fibo=-1.236;

   if(Variant==-8) Fibo=-1.382;

   if(Variant==-9) Fibo=-1.5;

   if(Variant==-10) Fibo=-1.618;

   if(Variant==-11) Fibo=-2.0;

   if(Variant==-12) Fibo=-2.236;

   return ( NormalizeDouble(iOpen(Symbol(),TF,index)+iATR(Symbol(), TF, n, index+1)*Fibo,Digits) );

  } 

 
Leo59:
Попробуйте отключить самомасштабирование индикаторных окон, может всё и уляжется.
"где три индикатора -   МА(4), МА(9), МА(14)"  индикаторное окно самомасштабируется по первому прикреплённому к этому окну индикатору. В Вашем случае, возможно, это МА(4)
А где отключается это самое самомасштабирование ?
 
Artyom Trishkin:

2. Я не знаю где вы взяли МАшку в отдельном окне, чтобы мог что-либо вам сказать о параметре. Но... Если взять из Индикаторы --> Осцилляторы --> Moving Averages of Oscillator, то в нём есть "Применить к:"

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

3. Какая проблема? Что три МАшки не соответствуют трём таким же (по вашему утверждению) МАшкам? Так это не нерешаемо, это - нонсенс. Если они сделаны правильно, то они обязаны совпадать. Какая разница - три отдельные МАшки со своими параметрами, или те же три МАшки с теми же параметрами, но впихнутые в один индикатор с тремя буферами... Вы видите разницу? Я - нет. А если вы её видите, то ищите несоответствие в расчётах МАшек.

Кстати... Аллигатор - три МАшки в одном индикаторе, каждая со своими параметрами. Настройте параметры одинаково с вашими тремя раздельными МАшками - и они совпадут. Правда у вас вся эта вакханалия в отдельном окне... Ну так ... для примера

Артём, "Применить к" - здесь есть только перечисление цен. Расчеты МА правильные, все три линии  проверены путем добавления в окно с индикатором 3МА одиночного индикатора с периодом 4, потом 9, потом 14. В каждом случае одиночный индикатор совпадает с соответствующей линией индикатора 3МА
 
Mike:
Артём, "Применить к" - здесь есть только перечисление цен. Расчеты МА правильные, все три линии  проверены путем добавления в окно с индикатором 3МА одиночного индикатора с периодом 4, потом 9, потом 14. В каждом случае одиночный индикатор совпадает с соответствующей линией индикатора 3МА
А в чём тогда проблема? Я так понял, вам не нравится визуальное несовпадение линий в разных окнах. Нажмите Ctrl+D, поводите мышкой по линиям индикаторов, и поглядите в окне данных значения - совпадают ли...
 
-Aleks-:

Подскажите пожалуйста конструкцию получения через функцию значения встроенного индикатора с верхнего тайм фрейма, но внутри этого тайм фрейма.

Т.е. текущий график 15 минут, нужно получить значение индикатора рассчитанного по дням,но 45 минут назад, как это сделать?

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

 

double iDelta(int Variant,int n,int TF,int index)

  {

   double Fibo=0;

   if(Variant==1) Fibo=0.236;

   if(Variant==2) Fibo=0.382;

   if(Variant==3) Fibo=0.5;

   if(Variant==4) Fibo=0.618;

   if(Variant==5) Fibo=0.764;

   if(Variant==6) Fibo=1;

   if(Variant==7) Fibo=1.236;

   if(Variant==8) Fibo=1.382;

   if(Variant==9) Fibo=1.5;

   if(Variant==10) Fibo=1.618;

   if(Variant==11) Fibo=2.0;

   if(Variant==12) Fibo=2.236;

   if(Variant==-1) Fibo=-0.236;

   if(Variant==-2) Fibo=-0.382;

   if(Variant==-3) Fibo=-0.5;

   if(Variant==-4) Fibo=-0.618;

   if(Variant==-5) Fibo=-0.764;

   if(Variant==-6) Fibo=-1;

   if(Variant==-7) Fibo=-1.236;

   if(Variant==-8) Fibo=-1.382;

   if(Variant==-9) Fibo=-1.5;

   if(Variant==-10) Fibo=-1.618;

   if(Variant==-11) Fibo=-2.0;

   if(Variant==-12) Fibo=-2.236;

   return ( NormalizeDouble(iOpen(Symbol(),TF,index)+iATR(Symbol(), TF, n, index+1)*Fibo,Digits) );

  } 

На вопрос ответить не могу, а функцию можно упростить и существенно ускорить.
При инициализации индикатора создать статический массив  

double arrFibo[13] = {0.0, 0.236, 0.382, ..., 2.236};

и все if в iDelta() можно будет заменить на:

if (Variant>0)
    Fibo =  arrFibo[ Variant];
else
    Fibo = -arrFibo[-Variant];

 
Mike:

На вопрос ответить не могу, а функцию можно упростить и существенно ускорить.
При инициализации индикатора создать статический массив  

double arrFibo[13] = {0.0, 0.236, 0.382, ..., 2.236};

и все if в iDelta() можно будет заменить на:

if (Variant>0)
    Fibo =  arrFibo[ Variant];
else
    Fibo = -arrFibo[-Variant];

Спасибо, попробую, может будет лучше. 

 
Mike:

На вопрос ответить не могу, а функцию можно упростить и существенно ускорить.
При инициализации индикатора создать статический массив  

double arrFibo[13] = {0.0, 0.236, 0.382, ..., 2.236};

и все if в iDelta() можно будет заменить на:

if (Variant>0)
    Fibo =  arrFibo[ Variant];
else
    Fibo = -arrFibo[-Variant];

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

Я вот не пойму по поводу строки

else           Fibo = -arrFibo[-Variant];

так вообще что получается, что мы запрашиваем минусовой индекс массива или как?
 
-Aleks-:

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

Я вот не пойму по поводу строки

else           Fibo = -arrFibo[-Variant];

так вообще что получается, что мы запрашиваем минусовой индекс массива или как?
В том случае, когда Variant отрицательный, выражение -Variant дает положительный индекс для выборки из массива.
В этом же случае нужны отрицательные значения Fibo, поэтому -arrFibo.
Причина обращения: