Торговая система, использующая принципы Эллиотта
Хотелось бы рассмотреть алгоритм еще одной механической торговой системы, использующей принципы торговли по теории волн Эллиотта. Предвижу яростную критику со стороны истинных последователей этой теории и заочно соглашаюсь с ней полностью - эта система далека от корректной трактовки учения Эллиотта. И тем не менее, она показывает неплохие результаты при бэк-тестинге, а также в очередной раз свидетельствует о достаточно широких возможностях языка EasyLanguage при проектировании торговых систем.
Итак для работы системы в ProSuite создаются 3 функции:
- ElliottWaveOsc,
- ElliottTrend,
- Wave345Elliott.
На их основе пишется торговая система:
Inputs: Len(80), Trig(.7);
Vars: WavCount(0), Osc(0);
Osc = ElliottWaveOsc;
WavCount = Wave345Elliott(Len, Trig);
IF WavCount = 3 AND WavCount[1] <= 0 Then
Buy Next Bar at Open;
IF WavCount = 5 AND WavCount[1] = 4 Then
Buy Next Bar at Open;
IF WavCount = 3 AND WavCount[1] = 5 Then
Buy Next Bar at Open;
IF Osc < 0 Then
ExitLong Next Bar at Open;
Как видно, система покупает, когда считает, что рынок делает 3 или 5 импульсную волну и продает, когда значение осциллятора Элиотта опускается ниже 0, т.е. .
В системе используется осциллятор Эллиотта (ElliottWaveOsc), который оценивает направление тренда на рынке, по своей сути это простая разность между двумя скользящими средними:
Vars: Osc535(0), Price(0);
Price = (H+L)/2;
IF Average(Price, 35) <> 0 Then
Osc535 = Average(Price, 5) - Average(Price, 35);
ElliottWaveOsc = Osc535;
Эта функция растет, когда цена растет (растет разность между короткой и длинной скользящими средними) и падает при ее снижении.
При вычислении осциллятора Эллиотта строится другая функция (ElliottTrend), которая, изменяясь от 1 к –1, отмечает трендовые фазы рынка:
Inputs: Len(Numeric), Trigger(Numeric);
Vars: Trend(0), Osc(0);
Osc = ElliottWaveOsc;
IF Osc = Highest(Osc, Len) AND Trend = 0 Then
Trend = 1;
IF Osc = Lowest(Osc, Len) AND Trend = 0 Then
Trend = -1;
IF Lowest(Osc, Len) < 0 AND Trend = -1 AND Osc > -1 * Trigger * Lowest(Osc, Len) Then
Trend = 1;
IF Highest(Osc, Len) > 0 AND Trend = 1 AND Osc < -1 * Trigger * Highest(Osc, Len) Then
Trend = -1;
ElliottTrend = Trend;
Еще одна функция (Wave345Elliott), в продолжение предыдущей, выступает в качестве счетчика волн.
Inputs: Len(Numeric), Trig(Numeric);
Vars: ET(0), Price(0), Osc(0), Wave(0), HiOsc(-999), HiOsc2(-999), HiPrice(-999), HiPrice2(-999);
Osc = ElliottWaveOsc;
Price = (High + Low) / 2;
ET = ElliottTrend(Len, Trig);
IF ET = 1 AND ET[1] = -1 AND Osc > 0 Then Begin
HiOsc = Osc;
HiPrice = Price;
Wave = 3;
End;
IF Wave = 3 AND HiOsc < Osc Then
HiOsc = Osc;
IF Wave = 3 AND Osc <= 0 AND ET = 1 Then
Wave = 4;
IF Wave = 4 AND Price = Highest(Price, 5) AND Osc >= 0 Then Begin
Wave = 5;
HiOsc2 = Osc;
HiPrice2 = Price;
End;
IF Wave = 5 AND HiOsc2 < Osc Then
HiOsc2 = Osc;
If Wave = 5 AND HiPrice2 < Price Then
HiPrice2 = Price;
IF HiOsc2 > HiOsc AND Wave = 5 AND ET = 1 Then Begin
Wave = 3;
HiOsc = HiOsc2;
HiPrice = HiPrice2;
HiOsc2 = -999;
HiPrice2 = -999;
End;
IF ET = -1 AND Wave = 5 Then Begin
Wave = -3;
HiOsc = -999;
HiPrice = -999;
HiOsc2 = -999;
HiPrice2 = -999;
End;
Wave345Elliott = Wave;
Оптимизированная на дневном графике РАО ЕЭС России за период с мая 97 г. по октябрь 2000 г., система показала следующий результат:
Annual Rate of Return (Доходность годовых): +126,51%
Return on Initial Capital (Доход на первоначально вложенный капитал): +359.75%,
Total Number of Trades (Количество сделок): 5,
Number of winning trades (Количество выигрышных сделок): 5 (!!!).
При анализе системы размер комиссионных брокера и биржи не учитывались, все сделки осуществлялись фиксированной суммой - $10.000.
Рис.1
Как видно на рисунке, система отлавливала все значительные колебания, происходившие на рынке за это время. Оптимальными для системы оказались значения Len = 10 и Trig=1,6.
Важно понимать, что подобная манера торговли начнет давать сбои на волатильном бестрендовом рынке, однако применительно к нашему, богатому на крутые тренды, рынку она оказалось достаточно удачной.