Страница 2 из 4
Re: Fractal – фрактал (экстремум)
Добавлено: 21 май 2018, 12:28
evge
Т.к. H и L заполняются не на каждом баре, а имеют вид сигнала заполняя значение на только на определенных барах, то прочитать их по индексу не получится, т.к. в предыдущем баре может значение быть не заданным.
Хотя конечно можно получить последние установленные значения серий H и L, используя недокументированную функцию GetLastValues("Ряд", количество)
Код: Выделить всё
var F = MY.Fractal(Input1, 5);
var FH = F.GetLastValues("H", 1);
var FL = F.GetLastValues("L", 1);
Значения будут в FH[0].Y и FL[0].Y
А теперь про тестирование.Вот пример тестирования стратегии на индикаторах рисующих задним числом фракталы (создано в конструкторе)
Код: Выделить всё
/**
Hash code B908FE68F613BDEC0878137E6D7E1880
**/
function Initialize()
{
StrategyName = "FractalTest";
AddParameter("P1", 0, "", 1);
AddInput("Input1", Inputs.Candle, 5, true, "SRM8=ФОРТС");
LongLimit = 44;
ShortLimit = -44;
AddChartIndicator("MY.Fractal", new Dictionary <string, double>{{"Period", 5}});
}
function OnUpdate()
{
/// ПРАВИЛО 1
if ( (MY.Fractal(Input1, 5).GetValue("H", 0) > 0) )
{
EnterShort();
}
/// ПРАВИЛО 2
if ( (MY.Fractal(Input1, 5).GetValue("L", 0) > 0) )
{
EnterLong();
}
}
А вот какой результат по итогам тестирования:
- FractalTest-01.png (44.98 КБ) 32014 просмотров
Как и писал выше тестирование будет жестоко обманывать
давая войти по сигналам из будущего (прошлого, смотря как посмотреть)
Re: Fractal – фрактал (экстремум)
Добавлено: 21 май 2018, 20:44
MonteCristo
Я все равно понять не могу. Откуда там прошлое или будущее. Вот для простоты возьмем фракталы с периодом 1, т.е. по одной свечке от экстремума. Теперь пошагово. Первая свечка LastH = -1, LastL = 1000000000. Вторая свечка, ничего не изменилось. Третья свечка так же. На четвертой свечке мы можем проанализировать три последние свечи и видим, что в серии H, появилось значение, например 100, а цена закрытия 4 свечи 102. Имеем пробитие фрактала вверх -> сигнал к покупке. Если цена 98, то сигнала нет и мы просто в LastH пишем значение 100. Почему так нельзя? Где тут будущее?
Re: Fractal – фрактал (экстремум)
Добавлено: 21 май 2018, 20:45
MonteCristo
Только наоборот LastH и LastL первоначальные значения.
Re: Fractal – фрактал (экстремум)
Добавлено: 21 май 2018, 21:53
evge
Так работает тестирование в АД4.
Если индикатор будет рисовать не на текущем [0] баре, а в историю, как это делает индикатор Fractal в истории H[period], L[period], т.е. на period барах назад от текущего.
Тестирование увидит фрактал на том баре где отрисовал его индикатор, который на самом деле не был бы в реальной жизни определен именно на этом баре, а был бы определен через period баров.
Результат тестирования, с использованием таких индикаторов, я привёл выше.
Re: Fractal – фрактал (экстремум)
Добавлено: 21 май 2018, 22:18
evge
В
параллельной ветке форума подсмотрел у себя же, как я же делал по другому полтора года назад, в 2016 г.
Ниже код примера, как протестировать стратегию использующую индикатор Fractal.
Здесь нужно обратить внимание на то какое смещение указано в GetValue(...,
Period),
т.е. вызывая индикатор фрактала с некоторым периодом мы этот же период используем как смещение для анализа, если использовать текущий бар со смещением 0, то это будет заглядыванием в будущее!
Код: Выделить всё
function Initialize()
{
StrategyName = "FractalTest";
AddParameter("Period", 5, "", 1);
AddInput("Input1", Inputs.Candle, 5, true, "SRM8=ФОРТС");
LongLimit = 44;
ShortLimit = -44;
AddChartIndicator("MY.Fractal", new Dictionary <string, string>{{"Period", "Period"}});
}
function OnUpdate()
{
/// ПРАВИЛО 1
if ( (MY.Fractal(Input1, Period).GetValue("H", (int)Period) > 0) )
{
EnterShort();
}
/// ПРАВИЛО 2
if ( (MY.Fractal(Input1, Period).GetValue("L", (int)Period) > 0) )
{
EnterLong();
}
}
Вот результат уже похож на правду
- FractalTest-02.png (38.46 КБ) 31977 просмотров
- FractalTest-03.png (37.04 КБ) 31977 просмотров
теперь мы видим, что позиции открываются после реального обнаружения фрактала, на том баре где фракталы были обнаружены реально.
Re: Fractal – фрактал (экстремум)
Добавлено: 22 май 2018, 00:10
MonteCristo
Да, теперь понял, спасибо. Жаль, что именно так работает тестер. Надо бы развивать инструмент.
Re: Fractal – фрактал (экстремум)
Добавлено: 22 май 2018, 14:22
evge
Немного модифицированный фрактал.
Можно задать количество баров для поиска экстремума слева и справа по отдельности.
Period1 - бары слева
Period2 - бары справа
Код: Выделить всё
function Initialize()
{
IndicatorName = "Fractal2";
AddInput("Input", Inputs.Candle);
AddParameter("Period1", 15);
AddParameter("Period2", 5);
PriceStudy = true;
AddSeries("H", DrawAs.Custom, Color.Coral);
AddSeries("L", DrawAs.Custom, Color.LightGreen);
}
function Evaluate()
{
// evge 22.05.2018 http://alfadirect4.ru
if (CurrentIndex > Period1 + Period2)
{
var xH = true;
var xL = true;
var HPoint = Input.High[-Period2];
var LPoint = Input.Low[-Period2];
for (var i = 0; i < Math.Max(Period1, Period2); i++)
{
if (i < Period1)
{
if (Input.High[Period2 + i + 1] > HPoint) xH = false;
if (Input.Low[Period2 + i + 1] < LPoint) xL = false;
}
if (i < Period2)
{
if (Input.High[i] > HPoint) xH = false;
if (Input.Low[i] < LPoint) xL = false;
}
}
if (xH) H[Period2] = HPoint;
if (xL) L[Period2] = LPoint;
H.DrawArrowDown();
L.DrawArrowUp();
}
}
Скачать индикатор
Re: Fractal – фрактал (экстремум)
Добавлено: 29 май 2018, 22:49
MonteCristo
Код: Выделить всё
/**
Algorithm = ТРЕНД;
**/
function Initialize()
{
StrategyName = "My_Fractals";
AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
AddParameter("Period", 2, "Порядок фрактала");
LongLimit = 1;
ShortLimit = -1;
AddChartIndicator("MY.Fractal", new Dictionary <string, string>{{"Period", "Period"}});
AddGlobalVariable("last_high_fractal", Types.Double, 10000000000.0);
AddGlobalVariable("last_low_fractal", Types.Double, -1.0);
}
function OnUpdate()
{
var fractal = MY.Fractal(Input1, Period);
var h = fractal["H"];
var l = fractal["L"];
if(!Double.IsNaN(h[Period])) last_high_fractal = h[Period];
if(!Double.IsNaN(l[Period])) last_low_fractal = l[Period];
/// ПРАВИЛО 1
if ( Input1.High[0] > last_high_fractal )
{
EnterLong();
}
/// ПРАВИЛО 2
if ( Input1.Low[0] < last_low_fractal )
{
CloseLong();
}
}
Евгений, вот собственно то, о чем я Вас спрашивал. Не вижу где тут заглядывание в будущее. Сделки открываются после пробития фрактала последнего.
Re: Fractal – фрактал (экстремум)
Добавлено: 30 май 2018, 07:13
evge
Все верно, пример уже корректный, т.е. как я выше и писал [0] или [Period] - имеет значение!
Как и в моем примере последнем, где нет заглядывания в будущее и использовано [Period].
Заглядыванием в будущее будет, если
Код: Выделить всё
if(!Double.IsNaN(h[Period])) last_high_fractal = h[Period];
if(!Double.IsNaN(l[Period])) last_low_fractal = l[Period];
было бы
Код: Выделить всё
if(!Double.IsNaN(h[Period])) last_high_fractal = h[0];
if(!Double.IsNaN(l[Period])) last_low_fractal = l[0];
в таком варианте конечно работать не будет, но если запустить на нём контртренд тогда будет обманывать.
Например так:
Код: Выделить всё
/**
Algorithm = ТРЕНД;
**/
function Initialize()
{
StrategyName = "My_Fractals";
AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
AddParameter("Period", 2, "Порядок фрактала");
LongLimit = 1;
ShortLimit = -1;
AddChartIndicator("MY.Fractal", new Dictionary <string, string>{{"Period", "Period"}});
AddGlobalVariable("last_high_fractal", Types.Double, 10000000000.0);
AddGlobalVariable("last_low_fractal", Types.Double, -1.0);
}
function OnUpdate()
{
var fractal = MY.Fractal(Input1, Period);
var h = fractal["H"];
var l = fractal["L"];
/// это максимум
if ( h[0] > 0 )
{
EnterShort();
}
/// это минимум
if ( l[0] > 0 )
{
EnterLong();
}
}
и получим следующее:
- My_Fractals-01.png (35.96 КБ) 31828 просмотров
- My_Fractals-02.png (35.85 КБ) 31826 просмотров
Должно быть, если заменить [0] на [Period], вот так
- My_Fractals-03.png (47.89 КБ) 31825 просмотров
- My_Fractals-04.png (40.87 КБ) 31825 просмотров
Re: Fractal – фрактал (экстремум)
Добавлено: 30 май 2018, 22:04
MonteCristo
Ну да, всё правильно. Решение должно приниматься только после того, как от экстремума пройдет Period баров и фрактал сформируется, а не на самом баре с экстремумом. У меня проблема была с тем как прочитать значение Period баров назад, теперь я знаю, спасибо.