English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Пример разработки торговой системы, основанной на различиях  часовых поясов на разных континентах

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

MetaTrader 5Примеры | 23 апреля 2010, 10:02
6 099 0
Vasily
Vasily

Введение

У меня было некоторое количество свободного времени и было ясно, что это время я проведу за изучением рынков, исследованием дивергенции и экономических циклов и технических индикаторов. Вы можете видеть результаты исследования в статье Создание индикатора с возможностями графического управления, но мои находки этим не ограничивались! Я заметил одно явление другого масштаба, но чтобы его понять, давайте посмотрим на наш мир с точки зрения часовых поясов (рис. 1).

Рис 1. Часовые пояса

Как мы видим, день начинается у каждой страны по-разному и продолжается разное время, как видно наша великая огромная страна растянулась почти на 10 часов, когда Атлантический океан растянулся не более 6 часовых поясов.

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

Вот тут-то и начинается самое интересное. Открывшись, европейские брокеры и управляющие хэдж-фондов выводят свои активы на биржи, совершают спекулятивные или согласно своим инвесторским соображениям, действия. Нет, ещё пока рано до самого интересного, самое интересное начинается с рассветом в Чикаго, в связи с меньшей протяженностью Атлантического океана, наступает такой момент, когда на чикагской бирже Американские управляющие открывают свои торговые терминалы и начинают управление своими капиталами.

Остановимся на этом моменте, в связи с меньшей протяженностью Атлантического океана. Европейская сессия ещё не завершилась (рис. 1). Лондон расположен от Чикаго в 8 часовых поясов, если считать что рабочий день 8 часов + положено на перекуры 45 минут и обед около часа, что продлевает рабочий день ещё на 1,30 - 2 часа (кто работал в офисе, тот знает).

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

Рис 2. Пульс рынка

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

Вы, думаю, замечали такую особенность рынков, что цена, возможно, пойдёт либо вверх, либо вниз, НО ВСЕГДА ВПРАВО.


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

Первый блок "Пуск-Остановка" программы изображен на рис 3:


Рис 3. Блок "Пуск-Остановка"

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


Рис 4. Блок "Данные"

Блок "Данные" используется для определения задаваемых параметров при запуске программы или вывода переменных в случае MQL5, данный блок также служит для функции назначения глобальных переменных.

Далее рассмотрим очень часто используемый блок (99% программ на MQL использует этот метод) - изображается он двумя частями, которые обозначают границы ЦИКЛА. Смотрим на рис. 5:


Рис. 5. Цикл-блоки

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


Рис 6. Действия

Также нельзя забывать про логические блоки - на рис. 7 изображен блок "Решение".


Рис 7. Блок "Решение"

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

Следующий блок вызывает предопределённые функции, такие, как например, iMACD или iRSA а также пользовательские функции, определённые в другом месте программы, либо в библиотеке (рис. 8).


Рис 8. Функция

И последние два блока носят исключительно служебные функции - это комментарии и разрыв (рис 9).


Рис 9. Служебные блоки

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

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


3. Составление алгоритма

Итак, приступим к составлению советника по стратегии блок-схемами.

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

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

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


Рис 10. Входные параметры

//--- input parameters
input int      America=16;
input double   Lots=0.1;
input int      TakeProfit=500;
input long     MagicNumber=665;
input int      Limited=600;
input int      TrailingStop=100;

Приступим с следующей части формирования стратегии.

Нам нужно определить, является ли данная сессия перекрестной и установлены или устанавливались ли ордера (рис. 11).


Рис 11. Время торговать

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

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

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

bool time2trade(int TradeHour,int Number)
  {
   MqlDateTime time2trade;
   TimeTradeServer(time2trade);
   if(time2trade.hour!=TradeHour) return(false);
   time2trade.hour= 0;
   time2trade.min = 0;
   time2trade.sec = 1;
   for(int ii=OrdersTotal()-1;ii>=0;ii--)
     {
      OrderGetTicket(ii);
      long ordmagic=OrderGetInteger(ORDER_MAGIC);
      if(Number==ordmagic) return(false);
     }
   HistorySelect(StructToTime(time2trade),TimeTradeServer());
   for(int ii=HistoryOrdersTotal()-1;ii>=0;ii--)
     {
      long HistMagic=HistoryOrderGetInteger(HistoryOrderGetTicket(ii),ORDER_MAGIC);
      if(Number==HistMagic) return(false);
     }
   return(true);
  }

Мы определили нужную нам сессию и устанавливали ли мы ордера. Разберём, что необходимо сделать дальше.

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

Когда на рынках царят спокойные настроения, то в данные сессии повысится волатильность. Что даст нам возможность определить максимальные отклонения от основной тенденции, и установить на безопасном расстоянии ордера-ловушки, которые сработают, так как основная тенденция продолжиться. Как мы заметили ранее, цена, возможно, пойдёт либо вверх, либо вниз, но всегда вправо. (рис. 12).


Рис 12. Алгоритм установки ордера

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

void OnTick()
  {
//---
   if(time2trade(America+2,MagicNumber))
     {
      int i;
      double Higest = 0;
      double Lowest = 0;
      MqlRates Range[];
      CopyRates(Symbol(),15,0,9,Range);
      Lowest=Range[1].low;
      for(i=0; i<9;i++)
        {
         if(Higest<Range[i].high) Higest=Range[i].high;//MathMax(,Higest);
         if(Lowest>Range[i].low)  Lowest=Range[i].low;
        }
      long StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
      Higest=Higest+StopLevel*Point();
      // добавим к текущим ценам установки минимальную возможную дистанцию для установки ордера
      Lowest=Lowest-StopLevel*Point();
      // чтобы обеспечить максимальную вероятность принятия нашего ордера

      if((Higest-Lowest)/Point()<Limited)
        {
         MqlTradeRequest BigDogBuy;
         MqlTradeRequest BigDogSell;
         BigDogBuy.action=TRADE_ACTION_PENDING;
         // Устанавливаем отложенный ордер
         BigDogBuy.magic = MagicNumber;
         BigDogBuy.symbol=Symbol();
         BigDogBuy.price=Higest;
         //Цена, по которой будет установлен ордер
         BigDogBuy.volume=Lots;
         BigDogBuy.sl=Lowest;
         //если стоп лосс не задан, то будем устанавливать по стратегии
         BigDogBuy.tp=Higest+TakeProfit*Point();
         //устанавливаем тейк профит
         BigDogBuy.deviation=dev;
         //минимальное отклонение от запрошенной цены, 
         //то есть, насколько цена исполнения может отличаться от заданной цены
         BigDogBuy.type=ORDER_TYPE_BUY_STOP;
         //тип ордера, который исполняется по указанной цене или по цене лучше указаной
         //в данном случае ордер установится по цене выше или равной указанной 
         //если бы тип ордера был buy_limit, то он бы исполнился 
         //по указанной цене или ценам, ниже указанной
         BigDogBuy.type_filling=ORDER_FILLING_FOK;
         //данный параметр показывает, как ведёт себя ордер 
         //при частичном исполнения обьёма 
         BigDogBuy.expiration=TimeTradeServer()+6*60*60;
         //по тексту стратегии срок жизни ордера только на текуший рабочий день
         //так как после открытия Америки прошло 2 часа, а рабочий день у нас 8 часов, то 8-2 = 6
         BigDogSell.action=TRADE_ACTION_PENDING;

         // Устанавливаем отложенный ордер
         BigDogSell.magic = MagicNumber;
         BigDogSell.symbol=Symbol();
         BigDogSell.price=Lowest;
         //Цена, по которой будет установлен ордер
         BigDogSell.volume=Lots;
         BigDogSell.sl=Higest;
         //Стоп лосс устанавливаем по стратегии
         BigDogSell.tp=Lowest-TakeProfit*Point();
         //устанавливаем тейк профит
         BigDogSell.deviation=dev;
         //Минимальное отклонение от запрошенной цены, 
         //то есть, насколько цена исполения может отличаться от заданной цены
         BigDogSell.type=ORDER_TYPE_SELL_STOP;
         //тип ордера, который исполняется по указанной цене или по цене лучше указаной
         //в данном случае ордер установиться по цене ниже или равной указанной 
         //если бы тип ордера был buy_limit, то он бы исполнился
         //по указанной цене или ценам ниже указанной
         BigDogSell.type_filling=ORDER_FILLING_FOK;
         //данный параметр показывает, как ведёт себя ордер 
         //при частичном исполнения обьёма 
         BigDogSell.expiration=TimeTradeServer()+6*60*60;
         //по тексту стратегии срок жизни ордера только на текуший рабочий день
         //так как после открытие америки прошло 2 часа, а рабочий день у нас 8 часов, то 8-2 = 6
         MqlTradeResult ResultBuy,ResultSell;
         OrderSend(BigDogBuy,ResultBuy);
         OrderSend(BigDogSell,ResultSell);
        }
     }

Ордера установлены, ловушки расставлены - теперь стоит позаботиться о снижении рисков по нашим позициям, применим технику сопровождающего стопа (trailing stop).

Для идентификации наших позиций будем использовать установленный нами Магический номер (MagicNumber) и передвигать уровень стоп-лосса при достижении определенного уровня прибыли в минимальных изменениях цены (рис. 13).


Рис 13. Реализация Сопровождающего Стопа

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

// реализация трайлинга
   int PosTotal=PositionsTotal();
   for(int i=PosTotal-1; i>=0; i--)
     {
      // перебираем открытые позиции и смотрим, есть ли позиции, созданные этим советником.
      if(PositionGetSymbol(i)==Symbol())
        {
         if(MagicNumber==PositionGetInteger(POSITION_MAGIC))
           {
            MqlTick lasttick;
            SymbolInfoTick(Symbol(),lasttick);
            if(PositionGetInteger(POSITION_TYPE)==0)
              { //buy
               if(TrailingStop>0
                  &&(((lasttick.bid-PositionGetDouble(POSITION_PRICE_OPEN))/Point())>TrailingStop)
                  && ((lasttick.bid-PositionGetDouble(POSITION_SL))/Point())>TrailingStop)
                 {
                  MqlTradeRequest BigDogModif;
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.bid - TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
            if(PositionGetInteger(POSITION_TYPE)==1)
              {//sell
               if(TrailingStop>0
                  && ((PositionGetDouble(POSITION_PRICE_OPEN)-lasttick.ask)/Point()>TrailingStop)
                  && (PositionGetDouble(POSITION_SL)==0
                  || (PositionGetDouble(POSITION_SL)-lasttick.ask)/Point()>TrailingStop))
                 {
                  MqlTradeRequest BigDogModif;
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.ask + TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
           }
        }
     }
  }

Далее соберём наш алгоритм (рис. 14).





Рис. 14. Алгоритм в сборе

//+------------------------------------------------------------------+
//|                                          BigDog_By_CoreWinTT.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      America=16;
input double   Lots=0.1;
input int      TakeProfit=500;
input long     MagicNumber=665;
input int      Limited=600;
input int      TrailingStop=100;
int dev=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
bool time2trade(int TradeHour,int Number)
  {
   MqlDateTime time2trade;
   TimeTradeServer(time2trade);
   if(time2trade.hour!=TradeHour) return(false);
   time2trade.hour= 0;
   time2trade.min = 0;
   time2trade.sec = 1;
   for(int ii=OrdersTotal()-1;ii>=0;ii--)
     {
      OrderGetTicket(ii);
      long ordmagic=OrderGetInteger(ORDER_MAGIC);
      if(Number==ordmagic) return(false);
     }
   HistorySelect(StructToTime(time2trade),TimeTradeServer());
   for(int ii=HistoryOrdersTotal()-1;ii>=0;ii--)
     {
      long HistMagic=HistoryOrderGetInteger(HistoryOrderGetTicket(ii),ORDER_MAGIC);
      if(Number==HistMagic) return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(time2trade(America+2,MagicNumber))
     {
      int i;
      double Higest = 0;
      double Lowest = 0;
      MqlRates Range[];
      CopyRates(Symbol(),15,0,9,Range);
      Lowest=Range[1].low;
      for(i=0; i<9;i++)
        {
         if(Higest<Range[i].high) Higest=Range[i].high;
         if(Lowest>Range[i].low)  Lowest=Range[i].low;
        }
      long StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
      Higest=Higest+StopLevel*Point();
      // добавим к текущим ценам установки минимальную возможную дистанцию для установки ордера
      Lowest=Lowest-StopLevel*Point();
      // чтобы обеспечить максимальную вероятность принятия нашего ордера

      if((Higest-Lowest)/Point()<Limited)
        {
         MqlTradeRequest BigDogBuy;
         MqlTradeRequest BigDogSell;
         BigDogBuy.action=TRADE_ACTION_PENDING;
         // Устанавливаем отложенный ордер
         BigDogBuy.magic = MagicNumber;
         BigDogBuy.symbol=Symbol();
         BigDogBuy.price=Higest;
         //Цена, по которой будет установлен ордер
         BigDogBuy.volume=Lots;
         BigDogBuy.sl=Lowest;
         //если стоп лосс не задан, то будем устанавливать по стратегии
         BigDogBuy.tp=Higest+TakeProfit*Point();
         //устанавливаем тейк профит
         BigDogBuy.deviation=dev;
         //минимальное отклонение от запрошенной цены, 
         //то есть, насколько цена исполнения может отличаться от заданной цены
         BigDogBuy.type=ORDER_TYPE_BUY_STOP;
         //тип ордера, который исполняется по указанной цене или по цене лучше указаной
         //в данном случае ордер установится по цене выше или равной указанной 
         //если бы тип ордера был buy_limit, то он бы исполнился 
         //по указанной цене или ценам, ниже указанной
         BigDogBuy.type_filling=ORDER_FILLING_FOK;
         //данный параметр показывает, как ведёт себя ордер 
         //при частичном исполнения обьёма 
         BigDogBuy.expiration=TimeTradeServer()+6*60*60;
         //по тексту стратегии срок жизни ордера только на текуший рабочий день
         //так как после открытия америки прошло 2 часа, а рабочий день у нас 8 часов, то 8-2 = 6
         BigDogSell.action=TRADE_ACTION_PENDING;

         // Устанавливаем отложенный ордер
         BigDogSell.magic = MagicNumber;
         BigDogSell.symbol=Symbol();
         BigDogSell.price=Lowest;
         //Цена, по которой будет установлен ордер
         BigDogSell.volume=Lots;
         BigDogSell.sl=Higest;
         //Стоп лосс устанавливаем по стратегии
         BigDogSell.tp=Lowest-TakeProfit*Point();
         //устанавливаем тейк профит
         BigDogSell.deviation=dev;
         //Минимальное отклонение от запрошенной цены, 
         //то есть, насколько цена исполения может отличаться от заданной цены
         BigDogSell.type=ORDER_TYPE_SELL_STOP;
         //тип ордера, который исполняется по указанной цене или по цене лучше указаной
         //в данном случае ордер установиться по цене ниже или равной указанной 
         //если бы тип ордера был buy_limit, то он бы исполнился
         //по указанной цене или ценам ниже указанной
         BigDogSell.type_filling=ORDER_FILLING_FOK;
         //данный параметр показывает, как ведёт себя ордер 
         //при частичном исполнения обьёма 
         BigDogSell.expiration=TimeTradeServer()+6*60*60;
         //по тексту стратегии срок жизни ордера только на текуший рабочий день
         //так как после открытие америки прошло 2 часа, а рабочий день у нас 8 часов, то 8-2 = 6
         MqlTradeResult ResultBuy,ResultSell;
         OrderSend(BigDogBuy,ResultBuy);
         OrderSend(BigDogSell,ResultSell);
        }
     }

// реализация трайлинга
   int PosTotal=PositionsTotal();
   for(int i=PosTotal-1; i>=0; i--)
     {
      // перебираем открытые позиции и смотрим есть ли позиции, созданные этим советником.
      if(PositionGetSymbol(i)==Symbol())
        {
         if(MagicNumber==PositionGetInteger(POSITION_MAGIC))
           {
            MqlTick lasttick;
            SymbolInfoTick(Symbol(),lasttick);
            if(PositionGetInteger(POSITION_TYPE)==0)
              { //buy
               if(TrailingStop>0
                  &&(((lasttick.bid-PositionGetDouble(POSITION_PRICE_OPEN))/Point())>TrailingStop)
                  && ((lasttick.bid-PositionGetDouble(POSITION_SL))/Point())>TrailingStop)
                 {
                  MqlTradeRequest BigDogModif;
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.bid - TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
            if(PositionGetInteger(POSITION_TYPE)==1)
              {//sell
               if(TrailingStop>0
                  && ((PositionGetDouble(POSITION_PRICE_OPEN)-lasttick.ask)/Point()>TrailingStop)
                  && (PositionGetDouble(POSITION_SL)==0
                  || (PositionGetDouble(POSITION_SL)-lasttick.ask)/Point()>TrailingStop))
                 {
                  MqlTradeRequest BigDogModif;
                  BigDogModif.action= TRADE_ACTION_SLTP;
                  BigDogModif.symbol= Symbol();
                  BigDogModif.sl = lasttick.ask + TrailingStop*Point();
                  BigDogModif.tp = PositionGetDouble(POSITION_TP);
                  BigDogModif.deviation=3;
                  MqlTradeResult BigDogModifResult;
                  OrderSend(BigDogModif,BigDogModifResult);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Заключение

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

В сети вы сможете ознакомиться с различными вариациями данной стратегии, в данной статье рассматривается явление, на котором базируется данная стратегия и не только.


Прикрепленные файлы |
Связь ICQ и эксперта в MQL5 Связь ICQ и эксперта в MQL5
В статье рассматривается способ двустороннего обмена текстовыми сообщениями между клиентами ICQ, используя средства программирования языка MQL5. Материал заинтересует тех, кто хочет получать торговую информацию из работающего торгового терминала удаленно, например, через ICQ клиента в своем мобильном телефоне или КПК.
Практическое применение баз данных для анализа рынков Практическое применение баз данных для анализа рынков
Работа с данными стала главной задачей современного программного обеспечения, как автономных, так и сетевых прикладных программ. Для ее решения было создано специализированное программное обеспечение - системы управления базами данных (СУБД), которые позволяют структурировать, систематизировать и организовывать данные для их компьютерного хранения и обработки. Что касается трейдинга, то основная масса аналитиков не прибегает к использованию баз данных (БД) в своей работе. Но бывают задачи, где такое решение пришлось бы кстати. В данной статье приводится пример индикатора, который может сохранять и загружать данные из баз как с клиент-серверной, так и с файл-серверной архитектурами.
ООП в MQL5 на примерах: обработка кодов ошибок и предупреждений ООП в MQL5 на примерах: обработка кодов ошибок и предупреждений
В статье рассматривается пример создания класса для работы с кодами возврата торгового сервера и всеми ошибками, возникающими в процессе работы MQL-программы. После прочтения статьи, вы сможете сформулировать для себя начальное представление о том как работать с классами и объектами в MQL5. И в то же время у вас появится удобный инструмент для обработки ошибок, который в дальнейшем можно будет дорабатывать на свой вкус и цвет.
Создание активных панелей управления  на MQL5 для торговли Создание активных панелей управления на MQL5 для торговли
Статья посвящена разработке активных панелей управления на MQL5. Управление элементами интерфейса осуществляется при помощи механизма обработки событий, есть возможность гибкой настройки свойств элементов управления. Реализована работа с позициями а также возможность выставления, модификации и удаления рыночных и отложенных ордеров.