Добрый день.
Сразу, приношу извинения, если это оффтоп. Но гугл и поиск по сайту не дали результатов.
Проблема такая, есть свой индикатор, данные хранятся в буфере индикаторном (всё по фен-шуй). Есть советник, который использует данный индикатор и его данные, путем копирования буфера.
Все работает отлично. НО! Если я выбираю в тестере оптимизатор или выключаю визуализацию, соответственно данных по индикатору нет, результатов соответственно нет.
Кто как справляется с этим? Получается, что "рядом" с индикатором надо делать класс, который будет обсчитывать данные так же как и индикатор.
Может есть какой-то другой способ, о котором я не знаю?
Быть этого не может ибо такого не может быть :). Получение данных с индикатора уж никоим образом не зависит хоть режим моделирования тиков "каждый тик на основе реальных тиков", хоть "OHLC", так же никак не влияет на работоспособность включена визуализация в тестере MetaTrader 5 или выключена она.
В общем, как всегда:
Начинать нужно с начала: сначала код, потом вопросы.
Быть этого не может ибо такого не может быть :). Получение данных с индикатора уж никоим образом не зависит хоть режим моделирования тиков "каждый тик на основе реальных тиков", хоть "OHLC", так же никак не влияет на работоспособность включена визуализация в тестере MetaTrader 5 или выключена она.
В общем, как всегда:
Начинать нужно с начала: сначала код, потом вопросы.
Был молодой горячий... ;-) Извиняюсь, сейчас код покажу ;-)
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- количество окон на графике (всегда есть хотя бы одно главное окно) int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); // без этого не работает получение handle ниже. Странно! min_max_handle = ChartIndicatorGet(0,0,"MinMax"); if(min_max_handle==INVALID_HANDLE) { printf("Error creating MinMax handle indicator"); return(INIT_FAILED); } adx_handle = iADX(_Symbol,_Period,14); ArraySetAsSeries(ADX_Buffer,true); ArraySetAsSeries(Min_Buffer,true); ArraySetAsSeries(Max_Buffer,true); EventSetTimer( 30 ); return(INIT_SUCCEEDED); }
Соответственно вылетает по Error на INIT_FAILED. Если ошибку проигнорировать, то ошибка будет вот тут:
void OnTick() { // берем данные по индикатору, минимум за и максимум за if(CopyBuffer(min_max_handle,0,0,2,Max_Buffer)<0) { PrintFormat("Не удалось скопировать данные из индикатора MinMax, код ошибки %d",GetLastError()); return; } if(CopyBuffer(min_max_handle,1,0,2,Min_Buffer)<0) { PrintFormat("Не удалось скопировать данные из индикатора MinMax, код ошибки %d",GetLastError()); return; } if(CopyBuffer(adx_handle,0,0,4,ADX_Buffer)<0) { PrintFormat("Не удалось скопировать данные из индикатора ADX, код ошибки %d",GetLastError()); return; }
C ADX таким проблем нету, т.к. это встроенный индикатор и мы берем данные функций iADX(_Symbol,_Period,14);
Вы ищите индикатор в главном окне:
min_max_handle = ChartIndicatorGet(0,0,"MinMax");
- Ваш индикатор точно имеет параметр "indicator_chart_window"?
Если ответ "да" - тогда следующий вопрос: Вы в курсе, что тестер стратегий при запуске применяет к графику шаблон "tester.tpl"? А теперь вопрос: у Вас в шаблоне "tester.tpl" есть индикатор "MInMax"?
Вы ищите индикатор в главном окне:
- Ваш индикатор точно имеет параметр "indicator_chart_window"?
Если ответ "да" - тогда следующий вопрос: Вы в курсе, что тестер стратегий при запуске применяет к графику шаблон "tester.tpl"? А теперь вопрос: у Вас в шаблоне "tester.tpl" есть индикатор "MInMax"?
Да. Индикатор имеет параметр "indicator_chart_window" и в шаблоне tester.tpl он тоже присутствует с нужными параметрами. И работает только если галочка "Визуализация" включена, если галку убрать, то тесте выдает ошибку, что нет такого handle
Проблема думаю в другом: при тестировании (без включения "Визуально") не создаются никакие графические объекты
Графические объекты при тестировании
Во время тестирования/оптимизации не осуществляется построение графических объектов. Таким образом, при обращении к свойствам созданного объекта во время тестирования/оптимизации эксперт получит нулевые значения.
Данное ограничение не распространяется на тестирование в визуальном режиме. |
Вероятно сюда попадают и индикаторы, которые вшиты в шаблон (в данном случае в шаблон debug.tpl).
Вставьте такой код в советник:
Вместо звездочек - название индикатора.
Это проблему не решило. Пойду почитаю про этот property
Сделайте так:
min_max_handle=ChartIndicatorGet(0,1,"MinMax"); if(min_max_handle==INVALID_HANDLE) { printf("Error creating MinMax handle indicator"); //--- далее подразумевается, что индикатор "MinMax" в папке Indicators (в корне) min_max_handle=iCustom(Symbol(),Period(),"MinMax.ex5"); if(min_max_handle==INVALID_HANDLE) { printf("Error creating MinMax handle indicator (iCustom)"); return(INIT_FAILED); } }
Проблема думаю в другом: при тестировании (без включения "Визуально") не создаются никакие графические объекты
Вероятно сюда попадают и индикаторы, которые вшиты в шаблон (в данном случае в шаблон debug.tpl).
Ну я об этом же... что если графически ничего не рисуется, то и данных взять не откуда.
Вот и спрашиваю, как народ делает? Рядом с индикатором делает класс, который на ходу считает данные индикатора? Получается двойная работа и это только для того, чтобы в оптимизаторе погонять скрипт.
Сделайте так:
!!! Да. То, что нужно.... быстрее правда тестер работать особо не стал, но можно уже делать оптимизацию.
Огромное спасибо!!!
Ещё почему-то у меня индикатор MinMax открывается в тестере ещё отдельном окне индикаторов. Но это уже мелочи жизни.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день.
Сразу, приношу извинения, если это оффтоп. Но гугл и поиск по сайту не дали результатов.
Проблема такая, есть свой индикатор, данные хранятся в буфере индикаторном (всё по фен-шуй). Есть советник, который использует данный индикатор и его данные, путем копирования буфера.
Все работает отлично. НО! Если я выбираю в тестере оптимизатор или выключаю визуализацию, соответственно данных по индикатору нет, результатов соответственно нет.
Кто как справляется с этим? Получается, что "рядом" с индикатором надо делать класс, который будет обсчитывать данные так же как и индикатор.
Может есть какой-то другой способ, о котором я не знаю?