Лига Торговых Систем. Продолжаем работу. - страница 391

 

О. Скрипты переоптимизации отработали. 

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

 

Забавно - я думал, на кроссах отбои в канале будут достаточно устойчивы.

Фиг там. Тест за март-апрель показывает, что большинство кроссов на отбой показывают слабые результаты. Тот же Евродоллар на отбой куда устойчивее. Самый лучший отбойный тест показывает NZDUSD, из пятнадцати проходов при различных параметрах - только один проход дал небольшой минус. Все остальные 14 проходов - показали плюс при разных наборах параметров.

 
Georgiy Merts #:

И в отбой, и в пробой - в настройках есть два флага, управляющие этим. 

Скальпер собирает тики за последнюю минуту. Потом, из информации по историческим минутным ATR оценивает, не произошло ли превышения волатильности. 

Как только она превышена - это сигнал ко входу. 

Далее - выясняем куда вход. Можно войти по направлению этой минутки, можно войти против (входные флаги управляют этим). Направление выяснено.

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



Вооот. Спс. Георгий. Это уже интересно....... сам пишу скальпа на мт5 - хочу стакан к нему прикрутить для чтения обьемов.....
 

Структура моих экспертов предусматривает использование индикаторов "внутри", на график они не выводятся. 

Однако, для оценки работы видеть индикатор полезно. 

Посему выкладываю мой индикатор МНК-канала, использующийся в скальпере. Сам скальпер будет выложен в ближайшие дни. 

Работает он так. Сперва строится "ось канала" по методу МНК. Затем к ней добавляются границы, по принципу обычного прайс-ченела, значение границы равно максимальному отклонению от "оси" за несколько баров. 

Параметры:

  • Period - период расчёта МНК. По сути - длина "оси".
  • CanalPeriod - период границ канала. Граница ставится на максимальное отклонение от "оси" за это количество баров. Должен быть меньше, чем период расчёта МНК.
  • Power - степень МНК, фактически, "форма оси" (плоский, трендовый, параболический, кубический) 
  • PolarIdx - индекс "полярной" точки. "Ось" канала строится так, чтобы обязательно пройти по точке закрытия указанного бара. Если не требуется - то ставим WRONG_VALUE (минус 1), в этом случае полярной точки нет. 
  • SpreadToHigh - если установлен, к верхней границе добавляется спред. 
Файлы:
 
Georgiy Merts #:

Структура моих экспертов предусматривает использование индикаторов "внутри", на график они не выводятся. 

Однако, для оценки работы видеть индикатор полезно. 

Посему выкладываю мой индикатор МНК-канала, использующийся в скальпере. Сам скальпер будет выложен в ближайшие дни. 

Работает он так. Сперва строится "ось канала" по методу МНК. Затем к ней добавляются границы, по принципу обычного прайс-ченела, значение границы равно максимальному отклонению от "оси" за несколько баров. 

Параметры:

  • Period - период расчёта МНК. По сути - длина "оси".
  • CanalPeriod - период границ канала. Граница ставится на максимальное отклонение от "оси" за это количество баров. Должен быть меньше, чем период расчёта МНК.
  • Power - степень МНК, фактически, "форма оси" (плоский, трендовый, параболический, кубический) 
  • PolarIdx - индекс "полярной" точки. "Ось" канала строится так, чтобы обязательно пройти по точке закрытия указанного бара. Если не требуется - то ставим WRONG_VALUE (минус 1), в этом случае полярной точки нет. 
  • SpreadToHigh - если установлен, к верхней границе добавляется спред. 

Поделись кодом расчета оси через МНК))) Если не жалко)

 
Valeriy Yastremskiy #:

Поделись кодом расчета оси через МНК))) Если не жалко)

Мой код тебе, боюсь, не поможет. 

Впрочем, МНК-ядро почти не зависит от классов моей библиотеки. Так что, прикрепляю файлы. Требуется хотя бы базовое пониманиее ООП. Разберёшься?

Для использования надо пронаследоваться от класса CLSMCore, и обязательно перегрузить чисто виртуальные функции:

   virtual uint   _N() = 0;      // Число точек
   virtual double _X(uint uiIdx) = 0;  // Значение X точки с индексом uiIdx
   virtual double _Y(uint uiIdx) =0;  // Значение Y точки с индексом uiIdx

Именно эти функции запрашиваются классом при расчёте степеней аппроксимирующего полигона. Первая функция должна возвращать число точек, по которым аппроксимируем (не меньше, чем 4 с ненулевым весом для кубической аппроксимации, при этом X у всех точек должен быть разным, Y - могут быть одинаковыми), вторая и третья функции должны возвращать координаты соответствующих точек (как X - в индикаторе возвращается просто индекс бара, как Y - возвращаем цену закрытия, но это необязательно, точки могут быть любые)

Также можно по желанию перегрузить функции:

   virtual double _W(uint uiIdx) { return(LSM_DEFAULT_POINT_WEIGHT); };  // Значение веса точки с индексом uiIdx
   virtual int    _PolarIdx()    { return(WRONG_VALUE); }            // Индекс точки, через которую должна проходить аппроксимирующая, при отрицательном значении - такой точки нет.     

Первая функция - задаёт вес точки с указанным индексом (точки с большим весам сильнее "тянут" к себе аппроксимацию, точки с отрицательным весом "отталкивают" от себя аппроксимацию, с нулевым весом совсем не участвуют в аппроксимации). 

Вторая функция - задаёт индекс "полярной" точки. То есть, аппроксимация строится так, чтобы обязательно пройти через неё (образно говоря, у этой точки бесконечный положительный вес). Если полярная точка не нужна - эта функция должна возвратить WRONG_VALUE.

После перегрузки создаёшь объект своего класса, и твой класс должен вызывать защищённую функцию (функция защищена, чтобы её мог вызвать исключительно твой класс, а все внешние пользователи могли к ней обращаться только через твой класс:

 SLSMPowers _CountLSM(ELSMType ltType);

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

Когда получил степени полигона - можешь аппроксимировать. Для аппроксимации есть статическая функция:

double CLSMCore::CountLSMPolynom(double dX,const SLSMPowers & lpPowers);

Которая по структуре со степенями полигона вычисляет значение полинома для указанного X.

Класс использует зависимость <MyLib\DebugOrRelease\DebugSupport.mqh>, но эта штука нужна только для отладки - все места, где идёт ссылка на этот файл (как правило, в ASSERT'ах), можно убрать.

Ну как? Асилишь?

Файлы:
LSMCore.mqh  20 kb
LSMCore.mq5  54 kb
 
Georgiy Merts #:

Структура моих экспертов предусматривает использование индикаторов "внутри", на график они не выводятся. 

Однако, для оценки работы видеть индикатор полезно. 

Посему выкладываю мой индикатор МНК-канала, использующийся в скальпере. Сам скальпер будет выложен в ближайшие дни. 

Работает он так. Сперва строится "ось канала" по методу МНК. Затем к ней добавляются границы, по принципу обычного прайс-ченела, значение границы равно максимальному отклонению от "оси" за несколько баров. 

Параметры:

  • Period - период расчёта МНК. По сути - длина "оси".
  • CanalPeriod - период границ канала. Граница ставится на максимальное отклонение от "оси" за это количество баров. Должен быть меньше, чем период расчёта МНК.
  • Power - степень МНК, фактически, "форма оси" (плоский, трендовый, параболический, кубический) 
  • PolarIdx - индекс "полярной" точки. "Ось" канала строится так, чтобы обязательно пройти по точке закрытия указанного бара. Если не требуется - то ставим WRONG_VALUE (минус 1), в этом случае полярной точки нет. 
  • SpreadToHigh - если установлен, к верхней границе добавляется спред. 

Жорж а что он перерисовывает канал в истории?)

цена вот сейчас меняется, и канал в Пятнице дергается

 
lynxntech #:

Жорж а что он перерисовывает канал в истории?)

цена вот сейчас меняется, и канал в Пятнице дергается

Конечно, перерисовывается! 

Как только последний бар изменил Close, эта точка начала "тянуть" аппроксимацию не так, как раньше. Ясное дело, что аппроксимация (то есть, наилучшее приближение степенной функцией) будет проложена иначе. Чем меньше длина оси - тем "резче" будет перерисовка. Ты поставь "полярным" индексом 0 - тем самым ты требуешь, чтобы аппроксимация всегда строго проходила через Close нулевого бара - ясное дело, что с каждым тиком аппроксимация будет меняться, и перерисовываться! Однако, границы канала перерисовываются слабее, чем ось. А именно по границам мы оцениваем, нужно ли входить, или нет.

 
lynxntech #:

не Close, а в реальном времени дергает

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

Это перерисовываемый индикатор.

 
Georgiy Merts #:

Мой код тебе, боюсь, не поможет. 

Впрочем, МНК-ядро почти не зависит от классов моей библиотеки. Так что, прикрепляю файлы. Требуется хотя бы базовое пониманиее ООП. Разберёшься?

Для использования надо пронаследоваться от класса CLSMCore, и обязательно перегрузить чисто виртуальные функции:

Именно эти функции запрашиваются классом при расчёте степеней аппроксимирующего полигона. Первая функция должна возвращать число точек, по которым аппроксимируем (не меньше, чем 4 с ненулевым весом для кубической аппроксимации, при этом X у всех точек должен быть разным, Y - могут быть одинаковыми), вторая и третья функции должны возвращать координаты соответствующих точек (как X - в индикаторе возвращается просто индекс бара, как Y - возвращаем цену закрытия, но это необязательно, точки могут быть любые)

Также можно по желанию перегрузить функции:

Первая функция - задаёт вес точки с указанным индексом (точки с большим весам сильнее "тянут" к себе аппроксимацию, точки с отрицательным весом "отталкивают" от себя аппроксимацию, с нулевым весом совсем не участвуют в аппроксимации). 

Вторая функция - задаёт индекс "полярной" точки. То есть, аппроксимация строится так, чтобы обязательно пройти через неё (образно говоря, у этой точки бесконечный положительный вес). Если полярная точка не нужна - эта функция должна возвратить WRONG_VALUE.

После перегрузки создаёшь объект своего класса, и твой класс должен вызывать защищённую функцию (функция защищена, чтобы её мог вызвать исключительно твой класс, а все внешние пользователи могли к ней обращаться только через твой класс:

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

Когда получил степени полигона - можешь аппроксимировать. Для аппроксимации есть статическая функция:

Которая по структуре со степенями полигона вычисляет значение полинома для указанного X.

Класс использует зависимость <MyLib\DebugOrRelease\DebugSupport.mqh>, но эта штука нужна только для отладки - все места, где идёт ссылка на этот файл (как правило, в ASSERT'ах), можно убрать.

Ну как? Асилишь?

Да разберусь, может перегруз полюблю))) Не люблю слишком большую универсальность)))