Скачать MetaTrader 5

Паттерны, доступные при торговле корзинами валют

21 ноября 2016, 12:28
Andrei Novichkov
4
6 229

Введение

В прошлой статье о принципах торговли корзинами валют были рассмотрены базовые принципы этой торговли, подходы к ней, терминология. Разумеется, этого недостаточно для эффективной торговли по такой непростой методике. Необходимо понимание условий входа и выхода, сигналов. Другими словами, необходимы описания известных на текущий момент паттернов, использование которых существенно повышает вероятность получения профита. Это и будет целью данной статьи — предоставить трейдерам максимально полное описание паттернов, возникающих при работе с корзинами валютных пар. При этом мы будем пользоваться терминологией, описанием корзин и технических средств, которые были приведены в первой статье. Для анализа состояния валют корзин будем пользоваться объединенными индикаторами Williams’Percent Range (в дальнейшем WPR).

Следует сказать несколько слов об этом индикаторе. Диапазон изменений родительского индикатора WPR составляет от 0% до -100% процентов. Такой диапазон для нашей работы не подходит, как станет ясно из последующего текста. Для корректного отображения всех паттернов необходим диапазон от 100% до -100% процентов с переходом через ноль. Такое изменение можно легко учесть в коде индикатора. Кроме того, будем считать, что имеющиеся уровни перекупленности / перепроданности для родительского индикатора сохраняют актуальность для объединенного и будем активно этими уровнями пользоваться.


Возможности динамического входа. Паттерны №№ 1,2

Под динамическим входом будем понимать вход в рынок по достижению индикатором определенного значения, воспринимаемого в качестве входного сигнала, не дожидаясь закрытия текущей свечи. В первую очередь, рассмотрим паттерн существенного усиления/ослабления валюты корзины. С точки зрения рынка это означает возникновение одного или нескольких событий, в результате которых инвесторы начинают покупать или продавать конкретную валюту, в результате чего она растет или падает по отношению ко всем прочим. Конкретный пример — публичные выступления главы ЕЦБ Марио Драге, которые могут легко усилить или ослабить позиции евро по отношению к другим валютам. Такую ситуацию объединенный WPR отразит приближением к верхней или нижней границам диапазона. Трейдер может, не дожидаясь закрытия свечи, войти в рынок при достижении определенных значений индикатора — это и будет динамический вход.

  • Паттерн №1

Первый паттерн хорошо известен из многочисленных описаний стандартных технических индикаторов и работы с ними. 

Индикатор доходит почти до границы, разворачивается и пробивает линию перекупленности сверху  вниз, либо зону перепроданности снизу вверх. Это сигнал для входа по тренду на всех валютных парах корзины.

Согласно многим авторитетным источникам, такой вход ни в коем случае нельзя выполнять динамически. Поэтому рекомендовать торговлю на Паттерне №1 не следует совершенно однозначно.

  • Паттерн №2

Второй паттерн представляет собой модификацию вышеописанного, первого.

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

Делать подобные выводы о близком развороте цены только на основании показаний одного индикатора ошибочно. Тем более, нужно помнить, что объединенный WPR — это осциллятор, который в тренде не работает. В текущей ситуации индикатор сколь угодно долго может находиться вблизи границ диапазона, немного отходить от них, снова приближаться и так далее. Но тем временем текущий тренд будет продолжаться, а убыток трейдера — увеличиваться. Разумеется, в конце концов откат от границ произойдет, но в какой момент — неизвестно. И какой к моменту разворота будет просадка? Финансовый результат такого входа может быть очень печальным.

Тем не менее, некоторые трейдеры торгуют этот паттерн, когда индикатор показывает значения существенно выше 90% или меньше -90%. Дело в том, что в паттерне №2 есть и весомое достоинство: трейдер может захватить изменение тренда в самом начале. Очевидно, что нужны какие-то дополнительные сигналы для входа, и такие сигналы можно поискать, используя Price Action.

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

В качестве иллюстрации можно выложить мониторинг изменений показаний индикатора для франка в момент, который стал черным днем для многих трейдеров — середина января 2015 г. Сам мониторинг представлен в виде файлов формата CSV, т. е. подходящими для работы с Excel. Имена файлов соответствуют дате и времени начала мониторинга. В файлах четыре колонки данных:

Время мониторинга Показания индикатора на часовом таймфрейме Показания индикатора на четырехчасовом таймфрейме Показания индикатора на дневном таймфрейме
............
12:51:3299.1699.1799.17
12:51:3498.8598.8798.88
............

Можно посмотреть, как меняются данные с младших тайфреймов по сравнению со старшими, как показания индикатора почти достигают границ диапазона, отходят, снова приближаются. Тот, кто решился бы войти в рынок в этот момент, совершенно точно очень быстро получил бы stop loss.

Можно было бы разыскать на чартах и другие примеры, когда динамический вход приносит солидную прибыль. Однако уже только одна имеющаяся возможность потерпеть фиаско позволяет сделать вывод, что и Паттерн №2 чрезвычайно рискован в торговле. Поэтому и его я бы не стал рекомендовать к торговле.


Вход на закрытии свечи. Паттерн № 3

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

Это вполне законный, хорошо описанный для отдельных валютных пар способ входа в рынок. Однако если вспомнить, что объединенные индикаторы наследуют свойства родительских, как указывалось в прошлой статье, то тогда принцип входа на пробитии уровней перекупленности / перепроданности можно признать допустимым и здесь. Вдобавок, с учетом того, что пробой уровня следует за разворотом индикатора в районе границ диапазона (а это подразумевает наличие некоторого, пусть и короткого движения), можно сказать, что вход происходит по тренду. Главное условие Паттерна №3 — его идентификация после закрытия свечи текущего таймфрейма.

Непосредственно вход выполняется стандартным способом. Можно входить по рынку, а можно — лимитными ордерами. Во втором случае есть риск того, что вход не будет выполнен на всех валютных парах. В свою очередь, это может оказаться причиной того, что вообще вся покупка / продажа корзины окажется убыточной. Поясним этот вывод с помощью примера.

Трейдер входит на всех валютных парах корзины, понимая, что не на всех валютных парах корзины может получить профит. На некоторых парах будет нулевой результат, на некоторых может быть и минус, если локальный новостной фон окажется негативным. Предположим, на паре EURJPY график давно идет в сторону продаж. В еврозоне проблемы, и статистика не слишком хороша. Соответственно, линия объединенного WPR по корзине EUR идет вниз и начинает приближаться к границе диапазона. Однако в этот момент ситуация на рынке начинает меняться, статистика понемногу рисует более благоприятную картину, и доверие инвесторов восстанавливается. EURJPY переходит в боковое движение, и разворот в сторону покупок уже близок. Линия объединенного WPR разворачивается и пробивает линию перепроданности. Трейдер реализует полученный сигнал и входит в рынок, покупая корзину EUR. Однако график EURJPY по-прежнему не идет в нужную сторону и даже продолжает небольшой тренд в сторону продаж.

Почему? Потому что в это же время вышли хорошие новости и статистика по иене, и инвесторы стали покупать и её. Иена стала укрепляться вместе с евро, возможно, даже с большей скоростью, в результате получилось боковое движение и даже тренд в сторону продаж. Ожидания трейдера с этой валютной парой не оправдались, но в корзине есть и другие валютные пары, по которым статистики в это время не выходило вовсе. Поэтому на остальных валютных парах трейдер получает профит. Но если бы первоначально трейдер для покупки корзины по евро входил в рынок лимитными ордерами, то он мог бы и не получить положительного результата, т. к. вход мог состояться не по всем валютным парам. Более того, вход мог произойти вообще только по той валютной паре (в данном случае EURJPY), по которой трейдер получит убыток.

Рассмотрим вполне конкретный пример из жизни. Возьмем ту же пару EURJPY и поместим на часовой таймфрейм тестовый индикатор testWPR.mq5 :

//+------------------------------------------------------------------+
//|                                                      testWPR.mq5 |
//|                                        MetaQuotes Software Corp. |
//|                                               http://fxstill.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#property indicator_buffers 1
#property indicator_plots   1

input int     WPR=14;                    //Period WRP
input color   clr= clrBlue;

#define LG 7
string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"};
int h[LG];

double ind[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   for(int i=0; i<LG; i++)
     {
      h[i]=iWPR(pair[i],0,WPR);
     }
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);

   IndicatorSetString(INDICATOR_SHORTNAME,"testWPR");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);
   PlotIndexSetString(0,PLOT_LABEL,"_tstWPR_");

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetValue(int shift)
  {
   double dBuf[1];
   double res=0.0;
   for(int i=0; i<LG; i++)
     {
      CopyBuffer(h[i],0,shift,1,dBuf);
      res+=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)      
   res=res/LG;
   return (NormalizeDouble((res + 50) * 2, _Digits) );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(prev_calculated==0 || rates_total>prev_calculated+1)
     {
      int rt=rates_total-WPR;
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
     }
   else
     {
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {
   for(int i=0; i<LG; i++)
     {
      if(h[i]!=INVALID_HANDLE) IndicatorRelease(h[i]);
     }
   string text;
   switch(reason)
     {
      case REASON_PROGRAM:
         text="Indicator terminated its operation by calling the ExpertRemove() function";break;
      case REASON_INITFAILED:
         text="This value means that OnInit() handler "+__FILE__+" has returned a nonzero value";break;
      case REASON_CLOSE:
         text="Terminal has been closed"; break;
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
   PrintFormat("%s",text);
  }
//+------------------------------------------------------------------+

Заметим, что поскольку диапазон объединенного WPR составляет от -100% до 100%, то уровень перекупленности будет располагаться на уровне 60%, а не на -20%, как на родительском WPR. Уровень перепроданности будет при этом на уровне -60%, а не на -80%. Учитывая данный факт, отметим эти уровни на графике индикатора.

Проанализируем точку пересечения уровней перекупленности/перепроданности. На момент написания статьи она располагается на закрытии трехчасовой свечи 17.10.2016 года на часовом таймфрейме: 


Будем считать, что мы в это время гипотетически вошли в рынок. Сразу определимся с моментом выхода из рынка. Примем, что выходить станем, невзирая на результаты, когда значение индикатора приблизился к нулю или сравняется с ним. Этот момент настанет в семь утра того же дня. Отметим оба момента вертикальными линиями. Скриншоты для остальных валютных пар корзины EUR имеются в приложенном архиве с уже проставленными линиями. Заметим, что явно отрицательный результат будет получен на паре EURNZD, на EURGBP он будет близким к нулю, а на остальных пяти парах будет получен профит.

Однако возникает вопрос о легитимности уровней перепроданности и перекупленности. Из сравнения графика стандартного Стохастика и объединенного Стохастика в прошлой статье выяснилось, что график объединенного Стохастика существенно более сглаженный. Такая же картина наблюдается и при сравнении стандартного и объединенного WPR, как это можно видеть на скриншоте:

Здесь приведены графики объединенного WPR (толстая синяя линия) и стандартного WPR (тонкая голубая линия).

Сохраняются ли значения уровней перекупленности и перепроданности неизменными в объединенных индикаторах в сравнении с родительскими? Любой ответ на этот вопрос потребует серьезных исследований и весомых доказательств. В рамках же настоящей статьи возможна лишь самая грубая, примитивная оценка, в первую очередь визуальная. Чтобы избежать субъективности суждений, представляется нецелесообразным приводить здесь личные соображения по этому поводу.

Есть и еще один вопрос касательно данного паттерна (и не только его). Как выходить из рынка, по каким критериям? Можно предложить два ответа на данный вопрос:

  1. Выход из рынка осуществлять на разных валютных парах корзины независимо друг от друга, в соответствии с правилами Price Action. Это дает возможность применять уже наработанный инструментарий и трейлинг стоп. Но можно оказаться с незакрытой до конца корзиной, и в конце концов незакрытые ордера принесут убыток, превышающий весь остальной профит. Разумеется, трейдер может (и должен) не допустить такой ситуации.
  2. Выход из рынка осуществлять сразу на всех валютных парах корзины, ориентируясь на показания индикатора. Например, трейдер может купить корзину, дождавшись пробития уровня перепроданности (-60%) и продать её при подходе индикатора к нулю (или, например, к уровню -10%). В этом случае корзина гарантированно будет закрыта полностью, но, возможно, не будет полностью получен ожидаемый профит.

Подведем некоторые итоги по анализу Паттерна №3:

  1. Паттерн можно применять в торговле. Он определяется после закрытия свечи и идентифицируется по уровням, пробитие которых дает трейдеру сигнал о возможном входе.
  2. Паттерн не имеет вполне определенных авторитетных правил входа и выхода. Хотя само по себе наличие уровней перекупленности и перепроданности, определяющих получение сигнала на вход в рынок, сомнений не вызывает.
  3. Паттерн допускает значительную просадку.
  4. Паттерн никак не учитывает факт наличия второй валюты в каждой валютной паре. Это самый существенный его недостаток, который может стать причиной как просадок, длящихся длительное время, так и просто получения отрицательного результата.
  5. И еще один минус, неявный, но не менее существенный. Ранее написано, что при операциях с корзиной валютных пар  можно ожидать отрицательного результата на некоторых парах, нейтрального на других и положительного на третьих. Трейдер получает профит, потому что состояние валюты корзины подсказывает ему, в какую сторону открываться, повышает вероятность того, что положительный результат будет на большинстве валютных пар. И вот на этом этапе результат может быть серьезно скорректирован в отрицательную сторону различной стоимостью пунктов различных валютных пар, размером свопа и  комиссий.

Рассмотрим, имеются ли способы повысить эффективность данного паттерна, снизить просадки и увеличить прибыльность. Такое вполне возможно: познакомьтесь со следующим паттерном.

Вход при усилении одной из валют и одновременном ослаблении другой валюты. Паттерн №4

Паттерн учитывает тот факт, что в формировании цены участвуют две валюты, в то время как вышеописанный Паттерн №3 принимал во внимание только одну.

Поясним вышесказанное. Например, для уже не раз упомянутой пары EURJPY цена может пойти в сторону покупок в трех случаях:

  • Усиление первой валюты — EUR. Это уже описанный паттерн №3. Положительные и отрицательные стороны этого паттерна мы уже рассмотрели.
  • Ослабление второй валюты — JPY. Тот же паттерн №3, но со второй валютой пары.
  • Одновременное усиление первой валюты EUR и ослабление второй валюты JPY. Очевидно, что такое событие увеличивает вероятность разворота и движения цены в сторону, нужную трейдеру. Причем эта вероятность будет увеличиваться с ростом усиления одной валюты и ростом ослабления второй.

Паттерн №4 дает сигнал на вход в рынок, фиксируя ситуацию, описанную в третьем пункте. Происходит это следующим образом.

С точки зрения методики работы с корзинами валютных пар, в каждой валютной паре присутствуют две валюты корзин. Следовательно, в нашем случае, валютную пару EURJPY трейдер может анализировать при помощи двух объединенных индикаторов, настроенных один на EUR, другой на JPY, тем самым контролируя ослабление / усиление каждой из двух валют. Попутно есть возможность идентифицировать и Паттерн №3, но самое главное — Паттерн №4.

Он будет идентифицироваться путем анализа графика разницы между показаниями объединенного индикатора для базовой валюты и для валюты котировки. Пока эта разница остается в районе нуля процентов (0%), неважно, со знаком плюс, или со знаком минус, на рынке присутствует боковое движение. Этот факт будет следствием того, что на рынке сложилась ситуация, когда обе валюты, составляющие валютную пару, имеют примерно одинаковую силу. Инвесторы доверяют обеим валютам, новостной фон средний, каких-либо резких движений нет. Поэтому объединенный индикатор выдает примерно одинаковые значения для каждой валюты, а значит, разница между ними мала. Представляется логичным не входить в рынок в это время.

Но вот ситуация начинает меняться. Иена усиливается, а евро ослабляется. Причем ситуация развивается в таком направлении в течение определенного времени — иными словами, это усиление/ослабление валют представляет собой тренд, а не единомоментное движение.  Трейдер наблюдает за рынком и видит, что показания объединенных индикаторов начинают меняться. Показания для евро с течением времени переходят в отрицательную зону и приближаются к границам диапазона. С иеной ситуация обратная. Сам же график EURJPY идет в сторону продаж. Теперь трейдер будет наблюдать за графиком разницы между показаниями объединенного индикатора для евро и для иены. Этот график идет вниз и стремится к своему минимальному значению -200%.

Заметим, что при противоположном движении верхней границей будет 200%. И вот здесь становится ясно, почему понадобилось изменение диапазона объединенного WPR от 100% до -100%, о котором говорилось в начале статьи: для того, чтобы графики объединенных индикаторов и график разницы между ними можно было бы размещать в одном окне. Ну а чтобы избавиться от "некрасивого" значения 200%, величину разницы между двумя объединенными индикаторами следует просто разделить пополам, приведя её к 100%.

Итак, трейдер получает сигнал на вход в рынок, когда разница между показаниями объединенных индикаторов достигнет определенной величины. Говоря конкретнее, трейдер будет ждать, когда график разницы приблизится к той или иной границе диапазона, развернется и пробьет линию перепроданности сверху вниз, либо линию перекупленности снизу вверх. И, конечно же, фиксировать факт пробития следует на закрытии свечи. Другими словами, тактика действий такая же, как и в случае Паттерна №3, но с определенными особенностями:

  • Для принятия решения на вход в рынок используются два объединенных индикатора, отражающих состояние каждой валюты из пары. Таким образом удается существенно увеличить вероятность получения профита.
  • Вход в рынок выполняется не на всех валютных парах корзины, а на одной. Таким образом удается снизить просадку.

Рассмотрим конкретную работу с Паттерном №4. Для этого создадим еще один индикатор для корзины JPY. Создавать его будем точно так же, как и индикатор testWPR. Список валютных пар для корзины по иене возьмем из прошлой статьи. Поскольку код индикатора повторяет код индикатора testWPR, то приводить его еще и здесь мы не станем. Скомпилированный код индикатора прилагается к статье. Изменим лишь цвет индикатора на красный и установим его на ту же пару EURJPY в то же окно, где уже находится testWPR. Наблюдаем следующую картину: 

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

Однако на таком графике трудно отследить такой параметр, как искомая разница. Напишем еще один тестовый индикатор testDistance.mq5:

//+------------------------------------------------------------------+
//|                                                 testDistance.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#property indicator_buffers 1
#property indicator_plots   1

input int WPR = 14;//Period WPR
input color   clr= clrGreen;

double ind[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int h,h1;
int OnInit()
  {
//--- indicator buffers mapping
      h = iCustom(NULL,0,"testWPR",WPR);
      if (h == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }
      h1 = iCustom(NULL,0,"testWPRjpy",WPR);
      if (h1 == INVALID_HANDLE) {
         Print("Error while creating testWPRjpy");
         return (INIT_FAILED);
      }  
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
  
   IndicatorSetString(INDICATOR_SHORTNAME,"testWPRdistance");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);
   PlotIndexSetString(0,PLOT_LABEL,"_tstWPRdistance_");    
//---
   return(INIT_SUCCEEDED);
  }
  
double GetValue(int shift)
  {
   double dBuf[1], dBuf1[1];
   double res=0.0;
   CopyBuffer(h,0,shift,1,dBuf);
   CopyBuffer(h1,0,shift,1,dBuf1);
   return (NormalizeDouble((dBuf[0] - dBuf1[0])/2, _Digits) );
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated==0 || rates_total>prev_calculated+1)
     {
      int rt=rates_total-WPR;
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
     }
   else
     {
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   IndicatorRelease(h1);

  }
//+------------------------------------------------------------------+

Разместим  его в отдельном окне на том же EURJPY и рассмотрим ранее отмеченный участок:


Здесь зеленой линией выведен график разницы между двумя объединенными WPR для EUR и JPY. Интересно пронаблюдать, как разница между сильной и слабой валютой связана с текущим трендом и его разворотами. Можно отметить, что и здесь допустимо говорить о зонах перекупленности / перепроданности и об идентификации Паттерна №4 на закрытии свечи после пробития этих зон, что и получилось в нашем случае на последнем скриншоте.  В последнем случае, если бы трейдер вошел в рынок 21 октября в 11.00, как и подсказывал индикатор, то можно было захватить начало тренда, который не окончился до сих пор (1 ноября). 

Таким образом, работа с Паттерном №4 на этапе реализации — это работа с обычным ордером, а не с корзиной ордеров, как в случае Паттерна №3. Следовательно, можно ожидать существенного снижения просадки. Можно ожидать и увеличения количества прибыльных сделок (но не сделок вообще), т.к. Паттерн №4 увеличивает вероятность получения прибыли. Напомним, что можно применять трейлинг-стоп и вообще пользоваться привычным инструментарием, раз ордер только один и его можно сопровождать обычным способом.

Весьма интересно возможное перспективное применение Паттерна №4 в качестве фильтра совместно с Паттерном №3. Вход в рынок по Паттерну №3 выполняется на всех валютных парах корзины, а фильтр на базе Паттерна №4 мог бы отбраковать некоторые из них. Таким образом, есть возможность приблизиться к суммарной прибыльности Паттерна №3 на нескольких парах, при этом сохраняя преимущества Паттерна №4. Впрочем, это лишь моя теория, поскольку такое сочетание паттернов в реальной торговле мною не проверялось.

Под конец описания Паттерна №4 опишем ситуации, в которых Паттерн №4 дает ложный сигнал. Это довольно понятные рыночные ситуации, когда движение объединенного индикатора к границам диапазона и последующие развороты происходят за счет других валютных пар, а та пара, на которой трейдер собирается войти в рынок, как раз стоит на месте. Нужно понимать, что в корзину входит много валютных пар, и объединенный индикатор выдает усредненное значение, при этом локальные события могут толкнуть в другую сторону как раз ту пару, на которой трейдер вошел в рынок. В описании Паттерна №3 об этом уже говорилось. Для Паттерна №4 такая возможность тоже сохраняется, только она гораздо ниже.

Попытаемся подвести итоги по Паттерну №4.

Плюсы:

  1. Вероятность получения профита увеличивается.
  2. Снижается просадка.
  3. Весьма вероятно, что планируемый профит будет достигнут за меньшее время. Возможно, это не совсем отдельное преимущество, а скорее дополнение к выводу о том, что увеличивается вероятность получения профита. 
  4. Трейдеру не приходится иметь дело с корзиной ордеров, а только с одним ордером. Поэтому сопровождать сделку несложно. 

Минусы:

  1. Ситуация, возникновение которой необходимо для идентификации Паттерна №4, случается далеко не так часто, как хотелось бы.
  2. Суммарный профит меньше. Это следствие того, что прибыль приносит только один ордер. 

Попытаемся повлиять на Паттерн №4 с целью уменьшения влияния его отрицательных характеристик. Для этого ответим на вопрос, возможно ли увеличить количество сделок в ситуации, когда одна валюта сильно ослаблена, а другая чересчур сильна, помимо Паттерна №4? Возможно, есть еще один способ входа в рынок, помимо пробоя уровней прекупленности / перепроданности:

Вход с учетом средней. Паттерн №5

Действительно, использование скользящей средней — признанный и уважаемый способ анализа рынка. Мы видим множество индикаторов и советников, использующих этот принцип. Мы приняли, что в объединенном WPR будут работать уровни перекупленности / перепроданности. То же самое мы признали справедливым и для разницы между значениями двух объединенных WPR. Поэтому не видно причин, чтобы не применить еще и этот принцип — добавить к графикам индикаторов скользящую среднюю.

Кажется вполне очевидным, что добавить скользящую среднюю можно к графикам обнаружения обоих паттернов — к третьему и к четвертому. Значение и смысл скользящей средней хорошо известны, не станем здесь их описывать. Преимущества и недостатки скользящей средней известны не менее хорошо, в частности — склонность к запаздыванию. С учетом имеющихся знаний, трейдер  может анализировать результаты размещения скользящей средней на графиках с целью идентификации Паттерна №5:

Трейдер получает сигнал на вход в рынок, когда график индикатора пересекает скользящую среднюю. Факт пересечения фиксируется на закрытии свечи текущего таймфрейма.

Подобных пересечений весьма много, особенно, если использовать "быструю" среднюю. Следовательно, и количество сделок увеличится. Здесь и далее мы будем рассматривать размещение скользящей средней на графике, на котором идентифицируется Паттерн №4, а использование скользящей средней на графике с  Паттерном №3 будет опущено и может быть рассмотрено читателями факультативно.

Возникает вопрос: насколько правильно выделять применение скользящей средней в отдельный Паттерн? Не является ли её применение просто дополнительным фильтром для Паттерна №4? Ни в коем случае, это именно отдельный паттерн. Есть и исключение, когда пробитие уровней перекупленности/перепроданности происходит примерно одновременно с пересечением графиком индикатора скользящей средней. В этом случае происходит взаимное усиление Паттернов №№ 4 и 5, и вряд ли будет правильным выделить из них "наиболее важный". В остальных случаях Паттерн №4 — самостоятельная ситуация, а пересечение графика и скользящей — Паттерн №5, другая самостоятельная ситуация, никак не связанная с наличием или отсутствием Паттерна №4.

В любом случае, введем некоторые правила:

  • Если Паттерн №5 "предшествует" Паттерну №4, т.е. идентифицируется в промежутке от границ диапазона до уровней перекупленности / перепроданности, то такой паттерн не торгуется.
  • В прочих случаях после идентификации Паттерна №5 решение о входе в рынок будет приниматься вне зависимости от того, предшествовал ли Паттерн №4 Паттерну №5 или нет.

И вот на втором правиле стоит остановиться подробнее. Для анализа возможных ситуаций с Паттерном №5 создадим еще один индикатор, последний в данной статье:

//+------------------------------------------------------------------+
//|                                                 testDistance.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#property indicator_buffers 2
#property indicator_plots   2

input int WPR       = 14; //Period WPR
input int maperiod  = 10; //Period MA
input color   clr   = clrGreen;
input color   clrMA = clrMagenta;


double ind[],ma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int h,h1;
int OnInit()
  {
//--- indicator buffers mapping
      h = iCustom(NULL,0,"testWPR",WPR);
      if (h == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }
      h1 = iCustom(NULL,0,"testWPRjpy",WPR);
      if (h1 == INVALID_HANDLE) {
         Print("Error while creating testWPRjpy");
         return (INIT_FAILED);
      }  
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
  
   IndicatorSetString(INDICATOR_SHORTNAME,"testWPRdistance");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);
   PlotIndexSetString(0,PLOT_LABEL,"_tstWPRdistance_");    
  
   ArraySetAsSeries(ma,true);  
   SetIndexBuffer(1,ma);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE           );
   PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_SOLID            );
   PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 1            );
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrMA            );
   PlotIndexSetString (1, PLOT_LABEL, "Middle_Basket_line_MA" );    
//---
   return(INIT_SUCCEEDED);
  }
  
double GetValue(int shift)
  {
   double dBuf[1], dBuf1[1];
   double res=0.0;
   CopyBuffer(h,0,shift,1,dBuf);
   CopyBuffer(h1,0,shift,1,dBuf1);
   return (NormalizeDouble((dBuf[0] - dBuf1[0])/2, _Digits) );
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated==0 || rates_total>prev_calculated+1)
     {
      int rt=rates_total-WPR;//-maperiod;
  
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
      rt -= maperiod;  
      for (int i = 1; i< rt; i++)
        {
         ma[i] = GetMA(ind, i, maperiod, _Digits);
        }
     }
   else
     {
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   IndicatorRelease(h1);
   string text;
   switch(reason)
     {
      case REASON_PROGRAM:
         text="Indicator terminated its operation by calling the ExpertRemove() function";break;
      case REASON_INITFAILED:
         text="This value means that OnInit() handler "+__FILE__+" has returned a nonzero value";break;
      case REASON_CLOSE:
         text="Terminal has been closed"; break;
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
   PrintFormat("%s",text);
  }
//+------------------------------------------------------------------+

double GetMA(const double& arr[], int index , int period, int digit) {
   double m = 0;
   for (int j = 0; j < period; j++)  m += arr[index + j];
   m /= period;
   return (NormalizeDouble(m,digit));
}

Поместим данный индикатор на ту же самую пару и получим вот такие результаты:


Здесь скользящая средняя отрисована тонкой линией малинового цвета. Некоторые участки, которые могут быть идентифицированы как содержащие Паттерн №5, отмечены вертикальными линиями. Линии синего цвета отмечают получение сигнала на покупку, красные — на продажу. Нетрудно заметить, что выделены далеко не все точки пересечения графика разницы и скользящей средней. Объясним эту ситуацию, не забывая ранее введенные правила.

Разобьем весь диапазон индикатора на несколько зон и окончательно сформулируем правила для Паттерна №5:

  • Если пересечение скользящей средней и графика индикатора образуется в диапазоне от границы индикатора до зоны перекупленности или перепроданности, то такой сигнал игнорируется. Назовем эти участки Зоной №0 (нулевой зоной). Таких зон будет две, как и указано на скриншоте и как уже было бегло упомянуто.
  • Про возможное одновременное возникновение Паттернов №№ 4,5 и о том, что это взаимно усиливающий сигнал, также упомянуто выше. К сказанному нужно добавить, что, если трейдер идентифицировал Паттерн №4 (или Паттерны №№4 и 5) и вошел в рынок, то ему следует подумать о возможности игнорирования всех последующих Паттернов №5 до момента выхода из рынка по Паттерну №4.
  • С течением времени сильная валюта начнет слабеть, а  слабая начнет усиливаться. Ситуация не обязательно начнет развиваться именно так, возможно одна валюта будет продолжать ослабевать, а сильная начнет терять силу, или произойдет наоборот — сильная продолжит усиление, а слабая прекратит ослабевать. В любом случае график индикатора начнет отходить от границ диапазона и от уровней перекупленности / перепроданности. Начнется движение к нулевому значению индикатора, что означает примерно равную силу каждой валюты. Это будет означать постепенное прекращение текущего тренда и переход в боковое движение, а далее, вполне возможно, — разворот тренда и повторение данной ситуации, но только с противоположной стороны. Такое развитие ситуации дает трейдеру сигнал на выход из рынка. Действительно, если трейдер вошел в рынок, основываясь на том, что первая валюта слаба, а вторая сильна, то вполне разумно будет выйти из рынка, когда первая и вторая валюты станут примерно одинаковой силы, подойдя к нулевому значению индикатора. Тем более опасно будет оставаться в рынке, когда первая валюта усилится, а вторая ослабнет, т.е. когда график индикатора пересечет нулевой уровень, ситуация "перевернется". Назовем зону в районе нуля Зоной №3. Границы этой зоны трейдер может выбрать сам, автор предпочитает от десяти процентов (10%) до минус десяти процентов (-10%). В этой зоне все Паттерны №5 игнорируются, а ранее открытые сделки рассматриваются к закрытию, к частичному закрытию, переводу в безубыток.
  • Для реальной торговли Паттерна №5 предназначены только две зоны:
    • Зона №1 для торговли на покупку. На последнем скриншоте эти сделки обозначены синими вертикальными линиями. Чем ближе Паттерн №5 расположен к границе между Зонами №1 и №0, тем выше вероятность того, что торговля на паттерне принесет профит.
    • Зона №2 для торговли на продажу. На последнем скриншоте эти сделки обозначены красными вертикальными линиями. Здесь действует то же самое замечание: чем ближе к верхней границе Зоны №2, тем выше вероятность получения прибыли.

    Общее важное правило: Паттерны №5 на покупку, которые образовались в Зоне №2, игнорируются. И наоборот, паттерны №5 на продажу, которые образовались в Зоне №1, игнорируются также.

В завершении обзора Паттерна №5 нужно сказать, что здесь сохраняется та же опасность, что и в Паттерне №4:

  • Возникновение Паттерна №5 может быть связано не с той валютной парой, на которой трейдер намерен войти в рынок. Другими словами, риск получения отрицательного результата все равно сохраняется, хотя мы и постарались рассмотреть все возможности его минимизировать.

Некоторые общие моменты

Во всех упомянутых паттернах есть нечто общее, а именно: пробитие уровней перекупленности / перепроданности, которое фиксируется по закрытию свечи текущего таймфрейма. Предположим, что мы фиксируем пробитие уровня перекупленности. Уровень располагается на 60% в окне объединенного WPR. Итак, график индикатора поднялся до 61.5%, а потом снизился, на закрытии свечи зафиксирован уровень 59%. Считать это пробитием или нет? Технически условия соблюдены, но торговать ли такой микроскопический паттерн?

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

Представляется, что торговать стоит паттерны, заметные для всех, бесспорные и очевидные. Другими словами, можно попытаться применить здесь истину, применимую для построений линий поддержки/сопротивления: эти линии должны быть очевидны для остальных. В применении к предыдущему случаю, рассматривать пробитие уровня перекупленности можно было бы в том случае, если значение индикатора снизилось от уровня в 70% или около того до уровня в 55%-45%. В таком случае пробитие уровня было бы вполне очевидно. Кроме того, есть задел для движения в сторону нулевой зоны, где можно закрыться либо принять какое-то другое решение.

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

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


Заключение

Все то, что написано здесь на примере объединенного индикатора WPR, будет справедливо и для других объединеннных индикаторов на базе осцилляторов. Это создает и преимущество в виде имеющихся, хорошо известных, уровней перекупленности / перепроданности, но и сохраняет ограничения, присущие осцилляторам. Следовательно точку ставить рано, ведь, кроме осцилляторов есть множество других интересных инструментов, которые можно применить в торговле корзинами валютных пар.

Прикрепленные файлы |
monitor.zip (1031.41 KB)
pattern3.zip (137.12 KB)
testWPR.zip (15.36 KB)
testWPRjpy.ex5 (14.86 KB)
testDistance.zip (13.37 KB)
testDistanceMA.zip (16.56 KB)
Must1980
Must1980 | 25 ноя 2016 в 11:34

Ну вот, дождались.

Автор, Ваши индикаторы показывают совсем не то, что изображено на картинкакх. Почему? Есть ли нормальные индикаторы, что бы  реально было пользоваться

Andrei Novichkov
Andrei Novichkov | 25 ноя 2016 в 19:40
Must1980:

Ну вот, дождались.

Автор, Ваши индикаторы показывают совсем не то, что изображено на картинкакх. Почему? Есть ли нормальные индикаторы, что бы  реально было пользоваться

Это тестовые индикаторы. Индикаторы для анализа состояния валют корзин крайне чувствительны к истории. А тут, обратите внимание, для того что бы проанализировать одну пару, необходима качественная история для более десяти пар. Ведь анализу будут подвергаться две корзины, каждая из которых состоит из множества пар. Встраивать в тестовый индикатор сложные средства контроля истории я не видел смысла, цель тестовых индикаторов другая все таки. Но,  как Вы выражаетесь "нормальные" индикаторы имеются. Я про них писал в прошлой статье, да и сам разрабатывал все индикаторы, которые приводил в пример. RSI, WPR, SToch, Index, они все есть во вполне рабочем  варианте. Но выложить их в маркет я не могу, т.к. они сконфигурированы для управления из "единого центра", который состоит из нескольких текстовых файлов. Это запрещено правилами.
Иван Корнилов
Иван Корнилов | 17 янв 2017 в 15:00
На мой взгляд замена среднего геометрического на средннее арифметическое большего выйграша в производительности не даст, а вот такая оптимизация очень подпортит результат, с математической точки зрения. Индикатор WPR не плохой выбор - это Stoch c нулевой задержкой, только вот строить его правильнее было по тем результатам которые в получаете в индикаторе testBasket.mq4, то есть сначаль получить "чистый" график евро, без влияния других валют, а по тем значениям простить классический WPR, это не сложно сделать если вычислить его самостоятельно, не используя функцию iWPR.
Andrei Novichkov
Andrei Novichkov | 17 янв 2017 в 16:16
Иван:
На мой взгляд замена среднего геометрического на средннее арифметическое большего выйграша в производительности не даст, а вот такая оптимизация очень подпортит результат, с математической точки зрения. Индикатор WPR не плохой выбор - это Stoch c нулевой задержкой, только вот строить его правильнее было по тем результатам которые в получаете в индикаторе testBasket.mq4, то есть сначаль получить "чистый" график евро, без влияния других валют, а по тем значениям простить классический WPR, это не сложно сделать если вычислить его самостоятельно, не используя функцию iWPR.

Я не пытался замерять разницу в производительности, поэтому ничего сказать не могу. Среднее геометрическое не везде можно применять. Если имеются исходные значения непредсказуемо меняющие знак, то в общем случае мы получим исключение, что нам не нужно ) Именно поэтому и применяется среднее арифметическое там, где такой риск есть. Я, кстати, где то об этом упоминал. И даже график сравнения среднего геометрического и среднего арифметического приводил. Замечу, что в "боевых" индикаторах у меня предусмотрена возможность менять, где это возможно конечно, способ расчета. И я бы высказал сомнение насчет "подпортит результат". Да, эти способы покажут разные значения в абсолютном выражении. Но экстремумы они покажут в одних и тех же местах. Покажут ли они одинаковые моменты выхода из зон перекупленности/перепроданности - это требует проверки, я вполне допускаю, что среднее геометрическое даст более точные данные, с более ранним выходом. Но еще раз повторю, это нужно проверять, иметь статистическую базу.

Что касается предложенного Вами способа применить расчет WPR к "индексу" (testBasket.mq4 именно его считает), то я считаю это весьма интересной идеей и при случае попытаюсь внедрить. Замечу, что описание данного способа  все таки выходило бы за рамки настоящей статьи.

Универсальный осциллятор с графическим интерфейсом Универсальный осциллятор с графическим интерфейсом

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

Графические интерфейсы X: Текстовое поле ввода, слайдер картинок и простые элементы управления (build 5) Графические интерфейсы X: Текстовое поле ввода, слайдер картинок и простые элементы управления (build 5)

В этой статье будут рассматриваться новые элементы управления: «Текстовое поле ввода», «Слайдер картинок», а также простые дополнительные элементы: «Текстовая метка» и «Картинка». Библиотека продолжает развиваться, и кроме добавления новых элементов управления, дорабатываются и ранее созданные.

Пример разработки спредовой стратегии на фьючерсах Московской биржи Пример разработки спредовой стратегии на фьючерсах Московской биржи

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

Автоматическое нахождение экстремумов на основе заданного ценового перепада Автоматическое нахождение экстремумов на основе заданного ценового перепада

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