English 中文 Español Deutsch 日本語 Português
Паттерны, доступные при торговле корзинами валют. Часть III

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

MetaTrader 5Трейдинг | 2 июня 2017, 10:17
2 756 7
Andrei Novichkov
Andrei Novichkov

Введение

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


Индекс валюты корзины в качестве исходных данных

В комментариях к одной из предыдущих статей была высказана очень перспективная идея: вместо того, чтобы получать значения индикаторов по каждой валютной паре корзины и находить среднее значение, следует применить формулу технического индикатора к данным объединенного индикатора — индекса валюты корзины. Поясню эту длинную мысль. К примеру, для расчета данных объединенного WPR мы получали значения стандартного технического индикатора WPR по каждой валютной паре корзины. Далее от полученных  значений мы рассчитывали среднее арифметическое (в общем случае можно использовать и среднее геометрическое). Результатом был объединенный WPR, показывающий поведение не отдельных пар корзины, а одной валюты — "валюты корзины валютных пар".

Здесь предлагается альтернативный способ получения тех же данных. Ранее мы уже обсуждали, что такое индекс валюты корзины и как его рассчитать. Напомню: это среднее геометрическое цен всех пар корзины, "очищенная цена" валюты корзины. Итак, предлагается получать значения объединенного WPR применением формулы расчета стандартного WPR к графику индекса валюты корзины. Соответственно, чтобы получить значения объединенного RSI или объединенного STOCH, нужно будет использовать их формулы расчета. Идея очень интересная, проверим ее. Если это предположение верно, то мы получим значения объединенных индикаторов, похожие на те, которые получаются после использования методики, описанной в прошлых статьях.

Для начала этой работы нам понадобятся два индикатора, коды которых можно найти в прилагаемом к статье архиве wpr.zip:

  • testWPR, представленный в одной из прошлых статей. Используем в нем набор валютных пар для корзины по USD: EURUSD, GBPUSD, AUDUSD, NZDUSD, USDCAD, USDCHF и USDJPY. Его мы будем использовать в качестве эталона для сравнения.
  • Код технического индикатора WPR. Он взят из Библиотеки открытых кодов в сообществе. Его фрагменты мы используем в новом индикаторе для демонстрации интересующей нас методики. 

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

//+------------------------------------------------------------------+
//|                                                testIndex+WPR.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots   1


input color   clrWPR = clrGreen;
input int wprperiod  = 14; 

double ind[],ma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit()
  {
//--- indicator buffers mapping
     
  IndicatorSetDouble(INDICATOR_MINIMUM,-100);
  IndicatorSetDouble(INDICATOR_MAXIMUM, 0);   
      
   ArraySetAsSeries(ma,true);   
   SetIndexBuffer(0,ma);
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE           ); 
   PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID            ); 
   PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 1            ); 
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrWPR            ); 
   PlotIndexSetString (0, PLOT_LABEL, "_tstdistance_MA" );       
   
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(1,ind , INDICATOR_CALCULATIONS);       
//---
   return(INIT_SUCCEEDED);
  }
  
string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
bool bDirect[]={false,false,false,false,true,true,true};
int iCount=7;

//Calc. index  
double GetIndex(int shift) 
  {
   double res=1.0,t;
   double dBuf[1];
   for(int i=0; i<iCount; i++) 
     {
      t=CopyClose(pair[i],PERIOD_CURRENT,shift,1,dBuf);
      if(!bDirect[i]) dBuf[0]=1/dBuf[0];
      res*=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)
   return (NormalizeDouble(MathPow (res, 1/(double)iCount), _Digits) );  
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
double HH,LL;

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;
      for(int i=1; i<rt; i++) 
        {
         ind[i]= GetIndex(i);
        }
      rt -= wprperiod;  
      for (int i = 1; i< rt; i++) 
        {
         ma[i] = GetMA(ind, i, wprperiod, _Digits);
        }        
     }
   else 
     {
         ind[0] = GetIndex(0);
         ma[0]  = GetMA(ind, 0, wprperiod, _Digits);
     }
   return(rates_total);
  }

//Calc. WPR
double GetMA(const double& arr[], int index , int period, int digit) {
   double m = 0;
   HH = arr[ArrayMaximum(arr, index, period)];
   LL = arr[ArrayMinimum(arr, index, period)];   
   m = -100 * (HH - arr[index]) / (HH - LL);
   return (NormalizeDouble((m + 50) * 2, _Digits));
}

Применим его к валютной паре EURUSD совместно с эталонным индикатором testWPRusd. Результат следующий:


Здесь в первом подокне — кривая нашего тестового индикатора, а во втором — кривая эталонного индикатора. Результат неожиданно разочаровывает. Мы могли ожидать большего, но придется анализировать то, что получилось. Сразу можно сказать, что тестовый индикатор к эксплуатации непригоден. Бросается в глаза, что тестовый индикатор постоянно достигает максимально возможных значений. При этом на рынке ничего особенного не происходит, и цена ведет себя довольно спокойно. Как следствие, градиенты изменения показаний индикатора неоправданно высокие. Еще следует отметить, что положения экстремумов в тестовом и эталонном индикаторах очень хорошо совпадают. Почему же мы получаем хорошее совпадение по положению экстремумов, но такие странные их значения? Ответ прост и кроется в формуле расчета индикатора WPR:

R% = - ((H – C)/(H – L)) x 100;

где:

  • C: цена закрытия;
  • L: минимальная цена за некоторый период;
  • H: максимальная цена за некоторый период.

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


Отрисовка объединенного индикатора индекса валюты корзины в виде свечей

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

Чисто технически получить такой график особого труда не составляет. Напомню, что классический "индекс доллара" очень часто изображается именно в виде свечей, а не одной линией по закрытию. Каким образом разработчик сможет получить аналогичный результат? Уже имеющийся тестовый индикатор проводит вычисления, используя значения цены закрытия свечи текущего таймфрейма. Если дополнить индикатор точно таким же расчетом, используя цену открытия свечей текущего таймфрейма, то разработчик сразу получит два значения, определяющие тело нужной ему свечи. Но на этом хорошие новости заканчиваются. Таким же способом определить Low и High свечи индекса валюты корзины не получится. Если разработчик просто вычислит среднее арифметическое или среднее геометрическое Low и High свечей валютных пар корзины, то получившееся значение ни в коем случае не будет точно определять Low и High свечи валюты корзины. Причина очевидна: совершенно не обязательно, чтобы Low и High отдельных валютных пар корзины возникали бы в одно и тоже время. Несомненно, что это возможно, но отнюдь не гарантировано. Разработчик может применить такой прием на свой страх и риск. В этом случае он своей цели достигнет и получит все значения, необходимые для отрисовки свечи, но с погрешностью, заранее не поддающейся оценке. Для получения же гарантированно истинного значения придется всё же прибегнуть к расчетам по тикам, в крайнем случае — по минутам. Такие расчеты сильно нагрузят терминал, поэтому их лучше вынести в отдельное приложение.

Ничем подобным мы заниматься не станем, чуть ниже я объясню, почему. А пока сделаем вывод о том, что обсуждаемая методика не подходит для объединенных индикаторов на основе WPR и для остальных объединенных индикаторов, которые используют для расчетов не только массивы Open и Close, но и Low с High. Для прочих же она продолжает представлять интерес, о чем мы и поговорим ниже.


Инструменты на основе индекса валюты корзины

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

Вспомним, что график индекса валюты корзины — это график цены. Попытаемся определить, работают ли с ним основные инструменты трейдера — уровни поддержки и сопротивления, каналы и уровни Фибоначчи. Учтем и то, что периодически появляются статьи о возможности применения таких инструментов на графиках индикаторов. Попытаемся их применить и мы. Для этого разместим на чарте EURUSD два объединенных индикатора индекса валюты корзины для USD и EUR (их можно найти в прилагаемом архиве index.zip) и выполним некоторые стандартные построения:


Мы разместили на обоих графиках стандартные графические инструменты. Конечно, такой вариант не единственно возможный, но он вполне реален:

  • Фибо, восходящий канал и горизонтальный уровень на EUR
  • Две линии, образующие клин и горизонтальный уровень на USD

Отметим интересные точки прямоугольниками и вертикальными линиями и посмотрим, как ведет себя цена пары EURUSD в районе этих точек.

  1. Отбой от верхней границы канала и фибо-уровня на индексе EUR. С индексом USD ничего особенного не происходит — слабое снижение. Можно ожидать движения в область sell на основном чарте, что мы и наблюдаем в действительности.
  2. Еще один отбой от верхней границы канала по EUR. Можно было бы ожидать дальнейшего движения в зону sell, но этого не происходит, т.к. есть движение индекса USD вблизи от верхней границы клина. В действительности наблюдается боковое движение с тенденцией в buy.
  3. Однако, как продолжение точки №2, тут происходит пробитие канала индекса EUR вниз, что совмещается с точкой №5 отбоя от нижней границы клина по USD. Наблюдается вполне логичное движение в sell на основном чарте.
  4. Отбой от горизонтального уровня по EUR, который совпадает с пробитием клина индекса USD в точке №7. В начале отбой по EUR интенсивнее и цена идет в sell, но потом пробой клина "перевешивает" и наблюдается движение в buy. 

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

  • Любой сигнал должен быть подтвержден другими сигналами, их должно быть несколько.
  • Отработка ценой полученных паттернов гораздо более инерционна, по сравнению со стандартным применением.
  • Заключительный вывод. Паттерны, полученные таким способом, носят вторичный, подтверждающий характер. Они могут учитываться для поиска точек входа и, возможно, при установке стоп-лоссов. Другими словами, эти паттерны несомненно полезны, но играют вспомогательную роль.

Проанализируем картину с другой стороны. Вспомним, что индекс валюты корзины показывает состояние всех валютных пар по отношению к валюте корзины. Поэтому намеченные нами точки на графике индекса EUR относятся не только к EURUSD, но и к остальным валютным парам, составляющим корзину по EUR. Мы же сделали выводы только относительно одной из них. Возможно, причина "вторичности" полученных паттернов — как раз то, от чего трейдер стремится избавиться, используя корзины валютных пар, а именно — влияние второй валюты (в данном случае USD)?  Наше предположение легко проверить, проинспектировав, как дела обстоят у других валютных пар корзины. Для примера возьмем первую точку, попавшуюся на глаза. Пусть это будет точка №2, 2015.09.18 00:00. В этой точке мы предполагаем общий тренд в sell, т.к. произошел отбой от верхней границы канала, а через некоторое время и пробой этого канала на юг. Интересующая нас точка найдена на графике индекса EUR, поэтому возьмем все валютные пары, входящие в корзину по EUR и посмотрим, что происходило с ценой в это время:


Очень интересный и обнадеживающий результат! На изображениях синей вертикальной линией отмечена интересующая нас временная метка. Наши прогнозы оправдываются на большинстве пар. Если бы трейдер вошел в рынок, используя рассматриваемый, весьма слабый, паттерн, то он получил бы прибыль. Но и стоп-лосс на некоторых парах вероятен. Я говорю об EURAUD и EURGBP и в меньшей степени — об EURUSD. На остальных парах трейдер получил бы прибыль. В данном случае полностью показал себя основной принцип работы с корзинами валютных пар: трейдер получает сигнал для входа по валюте корзины и входит сразу на всех парах, составляющих корзину. На некоторых парах он получит убыток, но на большинстве — прибыль. Об этом принципе мы уже достаточно подробно говорили в первых статьях серии. Но нелишне будет напомнить и о том, что все наши выводы и рассуждения носят вероятностный характер.

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

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

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


Простой трендовый индикатор

Для подтверждения наших выводов сконструируем примитивный объединенный индикатор, работающий по такому принципу:

  • Для массива исходных данных (в данном случае это массив индекса валюты корзины по EUR) вычисляется и отображается разница между двумя скользящими средними — "быстрой" и "медленной". Легко заметить, что принцип работы аналогичен принципу индикатора MACD. Действительно, будем надеяться, что индикатор сможет показать нам наличие дивергенции.

Код индикатора (его можно найти в прилагаемом архиве testIndexMACD.zip):

//+------------------------------------------------------------------+
//|                                                testIndexMACD.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots   1


input color   clr = clrBlue;
input int InpFastEMA = 12;   // Fast EMA Period
input int InpSlowEMA = 26;   // Slow EMA Period

double ind[],ma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
//int h,h1;
int OnInit()
  {
//--- indicator buffers mapping
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
   
   IndicatorSetString(INDICATOR_SHORTNAME,"testIndexMACD");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM/*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,"_tstMACD_");    


   ArraySetAsSeries(ma,true);
   SetIndexBuffer(1,ma , INDICATOR_CALCULATIONS);   

//---
   return(INIT_SUCCEEDED);
  }
  
string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"};
bool bDirect[]={true,true,true,true,true,true,true};
int iCount=7;
  
double GetValue(int shift) 
  {
   double res=1.0,d;
   double dBuf[1];
   for(int i=0; i<iCount; i++) 
     {
      d=CopyClose(pair[i],PERIOD_CURRENT,shift,1,dBuf);
      if(!bDirect[i]) dBuf[0]=1/dBuf[0];
      res*=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)
   return (NormalizeDouble(MathPow (res, 1/(double)iCount), _Digits) );  
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
double t;
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;
      for(int i=1; i<rt; i++) 
        {
         ma[i]= GetValue(i);
        }
      rt=rates_total - InpSlowEMA;  
      for(int i=1; i<rt; i++) 
        {
         ind[i] = GetMA(ma, i, InpFastEMA, _Digits) - GetMA(ma, i, InpSlowEMA, _Digits);
        }        
     }
   else 
     {
         ma[0]= GetValue(0);
         ind[0] = GetMA(ma, 0, InpFastEMA, _Digits) - GetMA(ma, 0, InpSlowEMA, _Digits);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

//+------------------------------------------------------------------+

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));
}

Расположив индикатор на графике, получим такую картину, используя в качестве исходного объединенный индекс EUR:


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

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


Заключение

Мы закончили рассмотрение паттернов, возникающих при торговле корзинами валютных пар. Кратко изложим общие торговые правила применения всех описанных паттернов.

  • Подтвердилась высокая точность паттерна, который получается, когда уровни перепроданности/перекупленности пересекаются графиком объединенного индикатора разницы между показаниями объединенного индикатора-осциллятора (WPR, STOCH) для базовой валюты и для валюты котировки. Вход в рынок может осуществляться после закрытия свечи, что подтвердит факт пробоя линии перекупленности / перепроданности и, возможно, начало нового тренда. Вход выполняется на одной валютной паре — на той, на которой установлен наш индикатор. Выход из рынка может осуществляться после того, как индикатор достигнет зоны возле нуля, либо на подходе к противоположной границе диапазона индикатора:

    В последнем случае, при подходе к зоне возле нуля открытые ордера стоит перевести в безубыток. Обратите внимание на ложный сигнал в Buy, это обсуждалось здесь. Стоп-лосс также может быть установлен по данному индикатору. Он может сработать, если после пробоя линий перекупленности / перепроданности индикатор не идет в сторону нуля, а разворачивается, опять пробивает линию перекупленности / перепроданности, закрепляется и начинает движение возле границы диапазона.
  • Такой же паттерн существует и для объединенных индикаторов-осцилляторов (WPR, STOCH), показывающих состояние валюты корзины. Здесь на иллюстрации изображен график объединенного WPR для EUR:

    Правила входа и выхода остаются теми же, но вход в рынок выполняется не на одной, а на всех валютных парах корзины. Обратите внимание на точку, где возможен стоп-лосс. Здесь он приведен для примера, трейдер не обязательно зафиксирует убыток именно в этом месте. Индикаторы, используемые здесь и предыдущем пункте, можно найти в прилагаемом архиве wpr2.zip.
  • Вспомогательным паттерном в дополнение к двум вышеперечисленным может служить пересечение графиков МА. Если оно происходит в районе пробоя линий перекупленности/перепроданности, то это усиливает оба паттерна.
  • Паттерны, образующиеся при применении объединенных трендовых индикаторов, также имеют вспомогательный характер. Пока нет оснований рекомендовать вход в рынок на основании их обнаружения, но в качестве дополнительных сигналов к первым двум паттернам они вполне применимы.

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

Программы, используемые в статье:

 # Имя
Тип
 Описание
1 wpr.zip Архив
Содержит эталонный индикатор testWPRusd (код и исполняемый модуль) и код технического индикатора WPR - wpr.mq5
2
testIndex+WPR.mq5 Индикатор Тестовый объединенный индикатор, отрисовывающий значения WPR, полученные после применения формулы расчета WPR к значениям индекса валюты корзины.
3
 index.zip    Архив  Два объединенных индикаторы индекса валюты корзины по USD и EUR
 4  testIndexMACD.zip   Архив  Простой трендовый индикатор на принципе MACD
5
 wpr2.zip Архив Индикаторы для иллюстрации входа и выхода с рынка


Прикрепленные файлы |
testIndex8WPR.mq5 (6.93 KB)
index.zip (3.25 KB)
testIndexMACD.ZIP (1.65 KB)
wpr.zip (3.22 KB)
wpr2.zip (4.83 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (7)
[Удален] | 5 июн. 2017 в 08:50
Как и раньше, индикаторов, что б можно пользоваться, как не было, так и нет. Очень жаль.
Andrei Novichkov
Andrei Novichkov | 5 июн. 2017 в 13:17
Рабочие индикаторы по этой методике можно было бы разместить в магазине, но это невозможно
RodgFX
RodgFX | 6 июн. 2017 в 08:34
Очень странно. Магазин для этого и существует. Может с этого места поподробнее объясните?
Andrei Novichkov
Andrei Novichkov | 6 июн. 2017 в 19:29
Мои индикаторы, которыми я сам пользуюсь состоят из нескольких файлов. Один файл - индикатор и файлы конфигурации. Все индикаторы, входящие в ТС, конфигурируются одним и тем  же набором. Очень удобно, код сокращается, нет глупых ошибок при старте. Это запрещено правилами Маркета. Должен быть только один ex5 файл и все. У меня в планах есть статья про построение торговой системы по этой методике, я там все и расскажу.
[Удален] | 7 июн. 2017 в 10:30
Пишите, пишите. Опыт в изготовлении торговых систем это всегда будет интересно
Кроссплатфоменный торговый советник: Менеджер ордеров Кроссплатфоменный торговый советник: Менеджер ордеров
В статье обсуждается создание менеджера ордеров для кроссплатформенного торгового советника. Менеджер ордеров отвечает за открытие и закрытие экспертом ордеров или позиций, а также за ведение независимой записи о них, и будет доступен для обеих версий терминала.
Универсальный торговый эксперт: Доступ к свойствам инструмента (часть 8) Универсальный торговый эксперт: Доступ к свойствам инструмента (часть 8)
Восьмая часть статьи посвящена описанию класса CSymbol — специального объекта, предоставляющего доступ к произвольному торговому инструменту. Включенный в торговый эксперт, этот класс предоставляет богатый набор свойств произвольного инструмента, делая программирование экспертов еще проще и многофункциональней.
Паттерн Флаг Паттерн Флаг
В статье рассматриваются паттерны Флаг, Вымпел, Клин, Прямоугольная формация, Сужающийся треугольник, Расширяющийся треугольник. Анализируются их сходство и различия, создаются индикаторы для их поиска на графике и индикатор-тестер для быстрой оценки их эффективности
Методы сортировки и их визуализация с помощью MQL5 Методы сортировки и их визуализация с помощью MQL5
Для работы с графикой в MQL5 создана специальная библиотека Graphic.mqh. В статье описан пример ее практического применения и поясняется сама суть сортировок. По каждой сортировке существует как минимум отдельная статья, а по ряду из них уже опубликованы целые исследования, поэтому здесь описывается лишь общая идея.