Режимы работы тестера и типы ордеров - страница 2

 
SamMan:

Всем доброго тренда. :)

а по какому ТФ??? :)

 

А у меня есть единственный чарт(визуализаторский), обращаемся только к нему, только в одном ТФ и все же видим будущие данные!

Цитирую сам себя и сам себя же поправляю. :) Моя проблема абсолютно идентична той, что по ссылке в топик Новая версия клиентского терминала MetaTrader 4 build 210. Это именно она!

Еще раз на пальцах(прежде всего сам себе) объясняю.

1. Написан индюк. Камнем преткновения являются строка:

(iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i))/Point;

2. В чем камень: если в визуал-тестере мы кидаем такой индюк на тест-визуал-график масштаба ровно D1 - то ни в чем. Все шоколадно.

3. НО! Если его же кидаем на тест-визуал-график масштаба менее D1 - задница. :( iHigh()/iLow() лезут за котировками не в тест-визуал-график, а в чарт нормальный. И при этом(что совсем уж убийственно) для них (NULL,PERIOD_D1,0) вовсе не 2006.03.15(дневной бар формирующийся на тест-графике). Это еще как-то можно было бы переосмыслить. Для них 0й бар - это бар "нормального" чарта, т.е. 31 мая 08-го(на сегодня). Вот это уже совсем отвал башки. Ну нафига ж???

Т.е. сухой остаток выстраданный мной :) все же верен, с небольшой поправкой:

В общем случае

если вы пишите идикатор/эксперт который предполагаете гнать в тестере - не пользуйтесь ничем перечисленным в разделе Доступ к таймсериям в доках к языку.

А пользуйтесь, соотв., таймсериями(High[] и пр.). Вот они всегда кажут верно. Но не всегда удобны. :(
 

to SamMan

не думайте, что я к вам прицепился, но так уж получается, извините, плз.....вы невнимательно читает :).... если не нужно, скажите - вопросов нет, вы больше обо мне не услышите :)

когда вы кидаете

(iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i))/Point;

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

 

в терминале реализовано моделирование только ТФ, на котором работает эксперт

Вот это ключевая фраза которая объясняет ВСЕ, за исключением - А НАФИГА Ж ТАК ДЕЛОТЬ БЫЛО??? Разве что б такие бедолаги как мы с Вами

я на этих граблях неделю потерял,

??? Кстати - как я Вас понимаю. :) Это ж не не просто "придумка", это ж.... МЕГА-зачот! :)) Выносящий мозг даже трейдеру-проф.-программисту. О мозге трейдера-не-программиста я стараюсь даже не думать. Страшно. :)

А всего лишь надо было при старте тестера моделировать все(ну все "стандартные" понятно; не все теоретически возможные) ТФ. И все! Да, старт тестера увеличился бы раз в 5-6. Но знаете сколько б он успел стартануть вот так, с 5-кратной задержкой, за ту НЕДЕЛЮ что юзеры вынуждены себе бошки выворачивать и просто на месте топтаться?

если не нужно, скажите - вопросов нет

Что Вы!! Очень нужно! Я Вашу скурпулезность еще как оценил! Кстати - почему на форуме рейтингов нет? Где кнопка "добавить в карму"? :) Только мне этот вопрос теперь ясен кристально. Одним словом - бардак. :) А вот "идущих следом" жалко. Им еще предстоит через мозго-вынос пройти.

а по времени, через iBarShift

Именно! См. ниже. Только надо учитывать, что и в этом подходе не без граблей:

  • в 12.45 30.05.08(допустим это текущий момент реального времени) индикатор на "нормальном" H1 графике исполняет команду iHigh(NULL,PERIOD_D1,0). Ответ и-Хая: 1.045. Это значение может измениться в будущем, т.к. что будет на 23.59 30.05.08 не знает никто, в т.ч. и-Хай.
  • в 12.45 28.03.06(время на графике тестирования; в реальности по прежнему май'08) индикатор на "тест" H1 графике исполняет ту же команду iHigh(NULL,PERIOD_D1,X). В данном случае X - логический 0. Как его достичь - ниже. На логическом уровне мы просим и-Хай смотаться в 28.03.06 и вернуть хай на момент 12.45 этого дня, т.к. визуально, на тест-графике свечи 13.00 еще нет. Ответ и-Хая: 0.922. Это значение не может измениться в тест-будущем, даже не смотря на то, что 23.59 28.03.06 еще "типа не пройдено". В описываемом сценарии и-Хай берет верную, но дневную свечу(уже сформированную по его мнению, хотя только 12.45), и возвращает ее Хай.

Вот эти 2 буллета следует всем(а начинающим особенно!) распечатать, повесить на стену и вчитываться до достижения нирваны самопознания. А уж потом, просветленным, программить. С учетом, так сказать.

Ну и напоследок. Дабы облегчить(а может усложнить, это не ясно пока) постижение истины - обещенный "логический 0":

//+----------------------------------------------------------------------------+
//|  При тестировании индикаторов/экспертов иногда возникает проблема          |
//|  "младшего таймфрейма". Описание проблемы - начиная с                      |
//|               https://forum.mql4.com/ru/8354/page5                          |
//|  и далее по ветке. Функция пытается "вправить мозги" группе системных      |
//|  ф-ий "Доступ к таймсериям". На вход ожидается период графика БОЛЬШИЙ      |
//|  нежели период чарта в настоящий момент открытого в тестере(визуальном).   |
//|  Выход ф-ии должен быть использован как компенсирующее значение ф-ий       |
//|  указанной группы, т.е.                                                    |
//| не iHigh(NULL,PERIOD_D1,0) а iHigh(NULL,PERIOD_D1,CompensateTF(PERIOD_D1)) |
//| не iLow(NULL,PERIOD_D1,2) а iLow(NULL,PERIOD_D1,2+CompensateTF(PERIOD_D1)) |
//+----------------------------------------------------------------------------+
int CompensateTF(int timeframe)
{
   if(timeframe==Period()) return(0); //на "правильном" ТФ и так все работает правильно
   else return(iBarShift(NULL, timeframe, Time[0], true)); //иначе компенсируем "перескок" с тест-графика на нормальный чарт
}
 
SamMan:

Вот это ключевая фраза которая объясняет ВСЕ, за исключением - А НАФИГА Ж ТАК ДЕЛОТЬ БЫЛО??? Разве что б такие бедолаги как мы с Вами

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

А по коду - посмотрите вот это 'Show Must Go On... или очередное возвращение к ZigZag'у' - там в коде комент "Force 2" есть, в т.ч. и от подглядывания защищает.

 
rider:

А по коду - посмотрите вот это 'Show Must Go On... или очередное возвращение к ZigZag'у' - там в коде комент "Force 2" есть, в т.ч. и от подглядывания защищает.

Код однозначно хорош! И идея с защитой отлична, спасибо за ссыл - беру на вооружение.

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

 

Реплика к началу темы. К сожалению, в МТ нет штатных средств отследить содержание индикаторных массивов любого
(ни о чём специально не заботящегося) индикатора. Если б это можно было, то в AG можно было бы таскать ордера
и за индикаторными линиями. Надеюсь, в МТ 5 эта проблема будет решена.

Но отследить факт наличия индикатора с наперёд заданным именем в МТ 4 можно:

   Win_ind= WindowFind(ShortName); // Ищем номер окна индикатора по его имени
   if (Win_ind<0)                  // Если такого окна нет,..
      return;                      // ..уходим

Но достаточно его переименовать - и хана.

Ещё можно использовать глобальные переменные.

Так или иначе, чтоб индикатор обнаружить, нужно ж о нём что-то знать.

--

PS. SamMan, я получил удовольствие от Вашего словаря и стиля изложения.
Как в этом случае принято? Респект.. или что там.. В общем, приятно было почитать:)

 
SK. писал (а):

Но отследить факт наличия индикатора с наперёд заданным именем в МТ 4 можно:

   Win_ind= WindowFind(ShortName); // Ищем номер окна индикатора по его имени

Но это, как я понимаю, прокатывает только в случае если индик. вынесен на собственный суб-граф? В моем случае оба они на main-chart, но за хинт по любому спасибо, буду иметь в виду.

PS. SamMan, я получил удовольствие от Вашего словаря и стиля изложения.
Как в этом случае принято? Респект.. или что там.. В общем, приятно было почитать:)

Со своей стороны - читая другие темы, и старые и новые, не раз обращал внимание на Ваши мессаджи. Что могу сказать? Респект взаимный! :))

 
SamMan:

Но, кстати, сам индюк совершенно бесполезен. ИМХО, конечно. Либо я его готовить не умею. :)

:) я и сам не уверен еще, что что-нить полезное для желудка получится, для проверки очередной "плодотворной" :) идеи потребовался, вот и проверяется пока.....

SK. писал (а):

 К сожалению, в МТ нет штатных средств отследить содержание индикаторных массивов любого
(ни о чём специально не заботящегося) индикатора. Если б это можно было, то в AG можно было бы таскать ордера
и за индикаторными линиями. Надеюсь, в МТ 5 эта проблема будет решена.


что есть AG?

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

 
rider:

что есть AG?

 

профиль посмотрел, вопрос снят :)