Решил вот облегчится...

 

И понял что наступаю на грабли...


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

Индикатор пишет в глобальные переменные (ГП) а советник соответственно читает оттедава.


Однако в случае глюка возможны неожиданности типа старых значений ГП, которые как известно не сохраняются

при нештатном завершении работы и не обновятся пока не пройдёт новый тик...


Так-же неясен приоритет работы на тике индикатора и советников.

Поясняю: новый тик, индикатор начинает обсчёт, т.е. некоторое время будет занят и в ГП будут ещё старые значения,

и в тот-же миг нового тика советник тоже будет читать соотв. старые значения, ибо индикатор есчё не записал в ГП новые.


В общем х.з.

иль наплевать на всё это...?

 

Как занести в ГП индикаторный буфер?

А если в индикаторе несколько индикаторных буферов?

А если индикатор выдает много значений для принятия решения и количество этих значений переменное во времени?

 

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

( мож я и белый вОрон, но ситуация с индикаторами в МТ5 меня почему-то не испугала именно поэтому... )

тоже, кстати, хотел бы выслушать критику по поводу такого подхода... ну и плюсы тоже...

 
kombat писал(а) >>

В общем х.з.

иль наплевать на всё это...?

Я в далеком прошлом :) (года два-три тому назад), разработал несколько функций для записи значений индикаторов в файл и чтения их из экспертов. Очень ускоряло работу в тестере при сложных, ресурсоемких индикаторах. Даже помнится работало на демо. Но сейчас я все индикаторы встраиваю в экспертов.

 

по возможности использую все расчеты в советнике, так не возникает противоречий..

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

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

ну и сохранять дополнительно переменную с последним временем обновления данных..

 

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

советник хранит у себя значение последнего обработанного времени. Если в ГП появилось новое значение - считывает обновленные данные индюка и отрабатывает их.

возможные грабли: индюк уже начал писать новые а эксперт еще не вычитал старые. решение: имена всех ГП должно содержать метку времени. индюк создает ГП, эксперт по мере вычитки - удаляет.

вторые возможные грабли: индюк полодит ГП. а экспер не работает (что произойдет с памятью терминала - ХЗ). возможное решение: индюк должен создавать ГП только если предыдущие уже удалены экспертом.

вроде как бы все.....

 

Все индикаторы свожу к итоговым функциям, которые уже потом использую внутри эксперта … и все индикаторы использую только в локальном МТ, чтобы удобнее мне самому наблюдать за темой, а эксперта вешаю на МТ, который крутится на серваке, и в котором кроме этого эксперта нет вообще ничего …

 
DDFedor писал(а) >>

не знаю про то или не про то, я разбираю индикатор по частям и впихиваю в советник...

Нормальное решение

 

Простите за лапидарность...

)))

Идикатор простой, содержит внутри набор других индикаторов и каждый из них пишет в свою ГП: -1, 0 или 1

(что-то типа: _name_sym 1 )


Далее есть варианты, сразу считывать и обрабатывать в советнике, либо использовать ещё один индикатор

в качестве "сумматора" рекомендаций и выработки уже собственно конечного решения и записью его в ГП,

которое потом считает советник...

_rec -1, 0 или 1 (соотв.: ничего не делаем, сигнал бай, сигнал селл)

 

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

 

пример:

GlobalVariableSet(_mom, -1);
if((iMomentum(NULL,0,14,PRICE_CLOSE,1) < 100) && 
(iMomentum(NULL,0,14,PRICE_CLOSE,0) > 100)) GlobalVariableSet(_mom, 0);
if((iMomentum(NULL,0,14,PRICE_CLOSE,1) > 100) && 
(iMomentum(NULL,0,14,PRICE_CLOSE,0) < 100)) GlobalVariableSet(_mom, 1);

Вот и ещё одни грабли в перспективе...

Привык называть операции как описано выше.

Тому были причины:

-1 обычно ничего не делаем, не сделано, ошибка

0 и 1 номера операций бай и селл


Так вот в "случае чего" неприсвоеное значение переменной может схватить 0 по умолчанию.

А это чревато...


Конечно можно периначить привычку в: -1 баим, 0 стоим, 1 селлим

А стоит ли?

Причина обращения: