По следам статей
«Рынок — это просто! Часть 3» 03 июня 2022, 01:12 «ВПК России — лучший»
smart-lab.ru/blog/808353.php
«грааль от BuyBuy» 05 июня 2022, 05:17 «Sergey Pavlov»
smart-lab.ru/blog/808971.php
Резюмируем сжато:
Цена актива в момент t — это x(t), приращение цены — d(t)=x(t)-x(t-1).
Индикатор id(t)=A*d(t-1)+B*d(t-2)
Покупка, когда id(t)>=0, продажа, когда id(t)<0.
Чтобы индикатор работал идеально на 2-х предыдущих барах, д.б.
d(t-1)=A*d(t-2)+B*d(t-3)
d(t-2)=A*d(t-3)+B*d(t-4)
Решение с точностью до множителя существует всегда:
A=d(t-1)*d(t-4)-d(t-2)*d(t-3)
B=d(t-2)*d(t-2)-d(t-1)*d(t-3)
Все это работает на таймфрейме 1 min и ниже.
И добавим однозначности:
Если считать, что d(t) = d(t-0) = x(t-0) — x(t-1),
то d(t-1) = x(t-1) — x(t-2) и т.д.
Скрипт C# на WealthLab
protected override void Execute() {
var d1 = (Close >> 1) - (Close >> 2);
var d2 = (Close >> 2) - (Close >> 3);
var d3 = (Close >> 3) - (Close >> 4);
var d4 = (Close >> 4) - (Close >> 5);
for (int i = 5; i < Bars.Count-2; i++) {
double A = d1[i]*d4[i] - d2[i]*d3[i];
double B = d2[i]*d2[i] - d1[i]*d3[i];
double id = A*d1[i] + B*d2[i];
int posDir = (! IsLastPositionActive) ? 0
: LastPosition.PositionType == PositionType.Long ? 1 : -1;
if (id >= 0 && posDir != 1) {
if (posDir == -1)
ExitAtClose (i, LastPosition);
BuyAtClose (i);
} else if (id < 0 && posDir != -1) {
if (posDir == 1)
ExitAtClose (i, LastPosition);
ShortAtClose (i);
}
} // for (int i
} // Execute()
даёт результаты на минутках на 68 днях от 10:00 до 18:44 для сделок без комиссии и проскальзывания
(
Читать дальше )