Скачать MetaTrader 5

Virtual Order Manager для управления ордерами в позициях терминала MetaTrader 5

14 мая 2010, 10:11
Paul
17
6 567


1. Введение

Возможно, самым большим изменением в переходе от MetaTrader 4 к MetaTrader 5 является изменение подхода к торговле с точки зрения совокупных позиций. В каждый момент времени по каждому инструменту может быть открыта только одна позиция, ее размер увеличивается или уменьшается каждый раз при исполнении брокером торговых приказов. Этот подход аналогичен правилу FIFO NFA 2-43(b), введенному в США, и соответствует правилам торговли многих других инструментов, таких как фьючерсные контракты и контракты на разницу (CFD).

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

Код, подобный приведенной ниже функции OpenOrders советника на MQL4 (или похожий вариант), при переходе на MQL5, не будет работать так, как ожидается.

int OpenOrders()  // MT4 - код для подсчета полного количества открытых ордеров этим советником
{
  int nOpenOrders=0;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber()==magic)
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        if (OrderSymbol()==Symbol())
          nOpenOrders++;
  }
  return(nOpenOrders);
}

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


2. Способы работы с позициями в MetaTrader 5

Есть несколько способов управления торговлей в рамках позиционно-ориентированного подхода, реализованного в MetaTrader 5, зависящих от сложности торговых стратегий.

Во-первых, отметим, что обработка отложенных ордеров выполняется так же, как и в MetaTrader 4, поэтому код MQL5, использующий только отложенные ордера, может быть относительно просто перенесен с кода, написанного на MQL4.

2.1 Простой советник; один советник, торгующий на одном инструменте

Самый простой подход - использовать в торговле один простой советник на одном символе. "Простой советник" в данном случае означает торговлю одним ордером, это общий метод, но он исключает возможность использования стратегий "pyramiding" и "grid trading". Такой советник может быть просто переписан с MQL4, возможно, используя класс CTrade стандартной библиотеки.

2.2 Сложный советник; один советник, торгующий на одном инструменте
Для сложных советников, торгующих по стратегиям "pyramiding" или "grid trading", в которых требуется открытие более одного ордера на инструменте, все что требуется - это добавление в стратегию некоторого относительно простого кода отслеживания ордеров. Это будет возможно лишь в случае, если советник работает только со своими позициями и не затрагивает позиции, открытые другим советником, торгующим на данном инструменте.

2.3 Более чем один советник, торгующий на нескольких инструментах
Этот случай требует создания сложных алгоритмов программирования и торговли и является причиной создания библиотеки Virtual Order Manager (VOM). Предназначение библиотеки - значительно упростить создание надежного кода советника, который будет прозрачен и не будет конфликтовать с другими советниками.

Далее в статье мы более подробно рассмотрим библиотеку Virtual Order Manager.


3. Цели архитектуры, преимущества и недостатки Virtual Order Manager

При проектировании библиотеки VOM преследовались четыре цели:

  1. Прозрачность: поведение советников, написанных корректно с использованием торговых функций VOM, изолировано от деятельности других советников.
  2. Робастность: элегантная обработка исключительных событий, таких как ошибки потери соединения с торговым сервером и неполное исполнение ордеров.
  3. Легкость в использовании: предоставление простых и хорошо документированных торговых функций
  4. Возможность использования в тестере стратегий терминала
Эти цели были реализованы следующим образом:
  • Использование "виртуальных" открытых и отложенных ордеров, а также Take Profit и Stop Loss ордеров. Понятие "виртуальность" означает, что их статус поддерживается на уровне клиентского терминала, независимо от позиции на сервере. Эти ордера изображаются на графике горизонтальными линиями, подобно открытым позициям.
  • Для защиты от сбоев компьютера или потери соединения, стопы на сервере устанавливаются значительно дальше виртуальных стопов.

Подход, реализованный в библиотеке VOM, предоставляет следующие возможности для программиста советников на языке MQL5:

  • Создавать советников, работающих с ордерами как в MetaTrader 4.
  • Реализовать возможность локов (термин, используемый в MQL4.Community) или более точно - возможность одновременной торговли по одному символу в различных направлениях.
  • Относительно легко создавать другие продвинутые торговые стратегии, такие как "grid trading", "pyramiding" и подходы к управлению капиталом.
  • Устанавливать стопы отложенных ордеров ближе, чем на минимально разрешенных уровнях установки стопов.

Также следует отметить, что побочным эффектом подхода VOM является то, что используемые виртуальные ордера Stop Loss, Take Profit, и отложенные ордера по своей природе являются "невидимыми", т.е. они не видны на стороне брокера. По мнению некоторых трейдеров, прятать уровни Stop Loss необходимо для того, чтобы предотвратить возможность охоты за стопами.

У библиотеки VOM также есть и недостатки. Рисковый капитал в торговле увеличивается при сбоях компьютера или сбоях соединения с Интернет за счет зависимости от более удаленных стопов, установленных на торговом сервере. В моменты большой волатильности, например, при выходе новостей, величина проскальзывания при исполнении виртуальных отложенных ордеров, ордеров Take Profit и Stop Loss может быть значительно выше, чем у стандартных, установленных на торговом сервере.

Влияние этих недостатков может быть минимизировано, если советники на базе VOM будут размещены на высоконадежных виртуальных компьютерах (VPS) с коротким временем пинга до сервера брокера.


4. Практическое использование VOM – пример простого советника

Прежде чем двигаться дальше, рассмотрим пример советника, использующего Virtual Order Manager. Мы напишем простого советника, торгующего при пересечении скользящих средних. Начнем с шаблона советника, который находится в прилагаемом к статье архиве. Мы будем использовать фрактальную скользящую среднюю (Fractal Moving Average), она потенциально способна снизить количество бессмысленных сделок на рынках, где использование стратегий пересечения обычных средних неэффективно. Нужно подчеркнуть, что этот советник представлен в качестве простого примера и не рекомендуется его использование в реальной торговле, по результатам тестирования он прибыльный, однако небольшое число торгов означает, что этот вывод не является статистически значимым.

Советник находится в папке MQL5\Experts\Virtual Order Manager\VOM EAs.

//+------------------------------------------------------------------+
//|                                           FraMA Cross EA VOM.mq5 |
//+------------------------------------------------------------------+
#property copyright "Paul Hampton-Smith"
#property link      "http://paulsfxrandomwalk.blogspot.com"
#property version   "1.00"

// это единственный файл, который нужно включить.
// он находится в родительской папке
#include "..\VirtualOrderManager.mqh"

input double   Lots=0.1;
input int      Fast_MA_Period=2;
input int      Slow_MA_Period=58;
/* 
Поскольку брокеры бывают с 3/5 знаками, уровни Stop Loss и Take Profit должны быть умножены на 10.
Похоже, что все брокеры, которые будут поддерживать MT5, будут работать с 3/5-значными котировками.
Но если такого не будет, без проблем можно добавить определение точности котировок.
 */
input int      Stop_Loss=5000;
input int      Take_Profit=0;
/*
Мы также можем изменить уровень логирования. Самым подробным является уровень LOG_VERBOSE. 
После того, как советник полностью отлажен, можно изменить уровень на LOG_MAJOR.
Файлы логов записываются в каталог files\EAlogs и автоматически удаляются после 30 дней.
 */
input ENUM_LOG_LEVEL Log_Level=LOG_VERBOSE;

// Следующие глобальные переменные будут хранить хэндлы и значения скользящих средних 
double g_FastFrAMA[];
double g_SlowFrAMA[];
int g_hFastFrAMA;
int g_hSlowFrAMA;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   LogFile.LogLevel(Log_Level);

   // Эту строку необходимо включать во все эксперты, которые используют CVirtualOrderManager  
   VOM.Initialise();
   Comment(VOM.m_OpenOrders.SummaryList());

   g_hFastFrAMA = iFrAMA(_Symbol,_Period,Fast_MA_Period,0,PRICE_CLOSE);
   g_hSlowFrAMA = iFrAMA(_Symbol,_Period,Slow_MA_Period,0,PRICE_CLOSE);
   ArraySetAsSeries(g_FastFrAMA,true);
   ArraySetAsSeries(g_SlowFrAMA,true);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // Эту строку необходимо включать во все эксперты, использующие CVirtualOrderManager  
   VOM.OnTick();
   Comment(VOM.m_OpenOrders.SummaryList());

   // Теперь получим копии свежих значений двух скользящих средних FrAMA 
   // в массивы g_FastFrAMA и g_SlowFrAMA. 
   if(CopyBuffer(g_hFastFrAMA,0,Shift,2,g_FastFrAMA)!=2) || 
      CopyBuffer(g_hSlowFrAMA,0,Shift,2,g_SlowFrAMA)!=2)
     {
      Print("Недостаточно загруженной истории");
      return;
     }

   // Теперь мы определяем факт пересечения быстрой FrAMA через медленную FrAMA,
   // закрываем все ордера, открытые в противоположном направлении и открываем один новый на покупку
   if(g_FastFrAMA[0]>g_SlowFrAMA[0] && g_FastFrAMA[1]<=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_SELL);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Buy(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }

   // Обратная ситуация для продажи
   if(g_FastFrAMA[0]<g_SlowFrAMA[0] && g_FastFrAMA[1]>=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_BUY);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Sell(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }
  }
//+------------------------------------------------------------------+

Теперь, с выходом тестера стратегий, он может быть протестирован в терминале, результат изображен на рис. 1:

 Figure 1. FrAMA Cross EA backtest

Рисунок 1. Результат тестирования советника FrAMA Cross EA

На рис. 2 приведены записи логов журнала тестера:

 Figure 2. Strategy test log

Рисунок 2. Записи в журнале тестера стратегий

 

5. Структура VOM

На рис. 4, приведенном ниже, показана схема использования VOM в нескольких советниках:

Figure 3. Multiple VOM EAs

Рисунок 3. Несколько советников, торгующих с использованием VOM

С точки зрения внутренней структуры, основные компоненты VOM выглядят следующим образом (рис. 4):

Figure 4. VOM internal structure

Рисунок 4. Внутренняя структура VOM

Описание элементов структуры VOM, приведенных на рис. 4:
  • Configuration -для сохранения всех элементов конфигурации в одном месте класс VOM использует глобальный объект Config класса CConfig.  Для упрощения доступа переменные этого объекта объявлены как public (открытые), функции для их чтения/установки отсутствуют.
  • Global variables - это глобальные переменные, доступ к которым осуществляется при помощи функций языка MQL5, таких как GlobalVariableGet(). Virtual Order Manager использует глобальные переменные для следующих целей:
    • для того чтобы сохранять и увеличивать на единицу тикет последнего виртуального ордера в CGlobalVariable;
    • для того чтобы поддерживать список всех виртуальных стоп-лоссов таким образом, чтобы обеспечить защиту стопов, установленных на сервере.
  • Open trades and history files - это постоянные файлы на диске, которые хранит CVirtualOrderArrays для того, чтобы контролировать открытые ордера и восстанавливать их при перезапуске. Пара этих файлов создается и хранится в папке Files\\VOM для каждого советника, использующего VOM. Класс CVirtualOrder начинает свое существование в массиве VOM.m_OpenOrders и затем при закрытии или удалении ордера переносится в массив VOM.m_OrderHistory.
  • Activity and debug log - большая часть кода разной сложности требует обеспечения протоколирования действий, и этот функционал помещен в класс CLog. Он обеспечивает запись логов для четырех различных уровней детализации и важности, он содержит функционал автоматической очистки старых файлов логов для обеспечения свободного места на диске.

Советники, которые используют VOM, взаимодействуют с библиотекой по схеме, представленной ниже на рис. 5:

 Figure 5. EA interaction with the VOM library

Рисунок 5. Схема взаимодействия советника с библиотекой VOMy


6. Подробнее о защитных стоп-лоссах

Для советников, написанных на MQL4, весьма распространенным является использование виртуальных стопов. Если значение стопа сохраняется только на уровне клиентского терминала, стоп невидим для брокера, часто стратегии разрабатываются с учетом этого момента для предотвращения охоты за стопами. Такие виртуальные стопы значительно увеличивают риск в торговле, поскольку требуют постоянного соединения с брокером для своего исполнения.

Virtual Order Manager контролирует этот риск установкой стопов на сервере на значительном расстоянии от самого близкого виртуального стопа. Эти стопы можно назвать защитными стопами на крайний случай (DPSL-стопы, disaster protection stoploss), поскольку они будут исполнены только в случае потери соединения с брокером на некоторое время, это могут быть ситуации разрыва соединения с Интернет или сбой компьютера.

Поскольку виртуальные ордера открываются и закрываются, превращаясь в позицию на сервере, поддержание на правильном уровне DPSL-стопов не является простой задачей. Рассмотрим пример.

Виртуальные
ордера
Цена
открытия
Виртуальный
 SL
Позиция
на сервере
Stop loss
на сервере
Комментарий
0.1 lots BUY #1 2.00000 1.99000 0.1 lots BUY 1.98500 DPSL установлена на 50 пипсов ниже виртуального SL #1
0.1 lots BUY #2 2.00000 1.99500 0.2 lots BUY 1.99000 Виртуальный ордер #2 имеет близкий SL, поэтому
DPSL делается ближе на 50 пипсов выше виртуального SL #2
Close #2     0.1 lots BUY 1.98500 Вернуться к старому DPSL
0.1 lots SELL #3 2.00000 2.00500 нет нет Виртуальные ордера #1 и #3 как противоположные
"компенсируют" друг друга на сервере

Close #1     0.1 lots SELL 2.01000 Виртуальный ордер #3 остается открытым,
DPSL теперь на 50 пипсов выше виртуального SL #3


7. Тестируем Virtual Order Manager

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

На рис. 6, представленном ниже, показана ситуация с виртуальными ордерами buy 0.1 лота для двух советников, открытых в окнах EURUSD M5 и EURUSD H4. Во вкладке "Торговля" правильно отображается одна позиция buy объемом 0.2 лота, открытая на сервере. Поскольку результирующая позиция длинная, защитный стоп DPSL, как видно, находится ниже стопа в 20 пунктов.

Figure 6. Two EAs agreeing on direction

Рисунок 6. Работа двух советников, открывших позицию в одном направлении

На рис. 7 показаны два тестовых советника, открывших противоположные виртуальные ордера, при этом суммарная позиция нулевая:

Figure 7. Two EAs with opposing virtual orders and no position is open at the broker

Рисунок 7. Работают два советника с противоположно направленными позициями, результирующая позиция у брокера нулевая


8. Очень простое отображение всех ордеров, открытых VOM

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


9. Выводы

На момент написания данной статьи - это бета-версия Virtual Order Manager, как и терминала MetaTrader 5, время покажет, станет ли концепция VOM популярной, или же это окажется всего лишь интересным применением языка MQL5.

Еще раз вернемся к целям, которые были упомянуты в разделе 3:

  1. Прозрачность: поведение советников, написанных корректно с использованием торговых функций VOM, изолировано от деятельности других советников.
    • Результат - да, цель достигнута в рамках подхода VOM.
  2. Робастность: элегантная обработка исключительных событий, таких как ошибки потери соединения с торговым сервером и неполное исполнение ордеров.
    • Результат - некоторая надежность очевидна, однако, возможно, могут понадобиться улучшения - нужно анализировать ситуации, которые могут возникнуть в реальной торговле
  3. Легкость в использовании: предоставление простых и хорошо документированных торговых функций.
    • Результат - см. ниже описание файлов поставки, также включена подробная документация в виде файла справки vom-doc.chm
  4. Возможность использования в тестере стратегий терминала
    • Результат - предварительные испытания, проведенные с помощью недавно выпущенного тестера стратегий, показывают, что в тестере VOM работает правильно, хотя и значительно замедляет процесс тестирования. Вероятно, понадобится определенная работа для ускорения этого процесса.

Улучшения, которые желательно сделать в будущих версиях:

  • При разработке любого достаточно сложного программного обеспечения в коде бывают ошибки, возможно, они еще остались.
  • С выходом каждого нового билда MetaTrader 5, для сохранения совместимости, возможно, понадобится модификация кода VOM.
  • Реализовать функции VomGetLastError() и VomErrorDescription().
  • Возможность читать конфигурацию из файла.
  • Реализовать различные типы трейлинга стопов.

10. Файлы поставки, прилагаемые в архиве

Поставка библиотеки Virtual Order Manager включает несколько .mqh-файлов, которые должны быть в папке  \Experts\каталог Virtual Order Manager\:

  • ChartObjectsTradeLines.mqh - классы CEntryPriceLine, CStopLossLine, CTakeProfitLine;
  • StringUtilities.mqh - полезные функции, такие как ErrorDescription();
  • Log.mqh - класс CLog;
  • GlobalVirtualStopList.mqh - класс CGlobalVirtualStopList;
  • SimpleChartObject.mqh - CButton, CLabel and CEdit;
  • VirtualOrder.mqh - CVirtualOrder;
  • GlobalVariable.mqh - CGlobalVariable;
  • VirtualOrderArray.mqh - CVirtualOrderArray;
  • VirtualOrderManager.mqh - CVirtualOrderManager;
  • VirtualOrderManagerConfig.mqh - CConfig;
  • VirtualOrderManagerEnums.mqh - различные перечисления, определяемые для VOM
  • VOM_manual.mqh - для файла справки по библиотеке
  • VOM_doc.chm - файл справки ***

В каталог Experts\Virtual Order Manager\VOM EAs также включены пять советников в виде .mq5 файлов:

  • VOM_template_EA.mq5 - шаблон для создания советников с VOM, создайте его копию и поместите в каталог Experts\Virtual Order Manage\VOM EAs
  • VirtualOrderManagerTester.mq5
  • Support_Resistance_EA_VOM.mq5
  • FrAMA_Cross_EA_VOM.mq5
  • VOM_OrderDisplay.mq5 

***Возможно, для чтения документации понадобится разблокировать файл VOM_doc.chm:


Перевод с английского произведен MetaQuotes Software Corp.
Оригинальная статья: https://www.mql5.com/en/articles/88

Прикрепленные файлы |
vom-doc.zip (769.18 KB)
vom2_0.zip (608.43 KB)
vom-sources.zip (44.31 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (17)
Vladimir Batrudinov
Vladimir Batrudinov | 8 июл 2010 в 21:05
Urain:

Да магик более надёжен тк не изменяем со стороны сервера,

хотя там уместится меньше информации тк код магика 10-ричный в отличии от стрингов которые кодируются 256-ричным кодом.

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

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

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

При завершении работы разумеется инфу следует сохранить.

PS

Ну или как-то так...

masharov
masharov | 12 сен 2011 в 12:16

Кто-нибудь использовал эту библиотеку?

Библиотека выглядит полезной. Но возникли сложности.

При компиляции примера советника VirtualOrderManagerTester.mq5

выдает ошибки: 

'TRADE_RETCODE_REQUEST' - undeclared identifier StringUtilities.mqh 42 12

'TRADE_RETCODE_REQUEST' - constant expression is required StringUtilities.mqh 42 12

'ERR_TRADE_SELECT_TIMOUT' - undeclared identifier StringUtilities.mqh 112 12

'ERR_TRADE_SELECT_TIMOUT' - constant expression is required StringUtilities.mqh 112 12

Как их убрать? 

 

Automated-Trading
Automated-Trading | 11 окт 2011 в 11:51
masharov:

Кто-нибудь использовал эту библиотеку?

Библиотека выглядит полезной. Но возникли сложности.

При компиляции примера советника VirtualOrderManagerTester.mq5

выдает ошибки: 

'TRADE_RETCODE_REQUEST' - undeclared identifier StringUtilities.mqh 42 12

'TRADE_RETCODE_REQUEST' - constant expression is required StringUtilities.mqh 42 12

'ERR_TRADE_SELECT_TIMOUT' - undeclared identifier StringUtilities.mqh 112 12

'ERR_TRADE_SELECT_TIMOUT' - constant expression is required StringUtilities.mqh 112 12

Как их убрать? 

 

Эти коды ошибок теперь неактуальны, можно просто закомментировать строки 42 и 112 в файле StringUtilities.mqh.

Коды статьи обновлены.

Ilnur Khasanov
Ilnur Khasanov | 14 янв 2012 в 14:27
Paul, спасибо за новую версию vom. За быстрое обновление и за быстрые ответы тоже большое спасибо.
Сергей
Сергей | 9 апр 2012 в 19:31

Неделю изобретаю велосипед, весьма преуспел, а тут бац! Вот он - готовый, да еще какой шикарный!

Paul, спасибо большое! Желаю развития проекту!

Переход на новые рельсы: пользовательские индикаторы в MQL5 Переход на новые рельсы: пользовательские индикаторы в MQL5

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

Вот мы и получили долгожданные MetaTrader 5 и MQL5 Вот мы и получили долгожданные MetaTrader 5 и MQL5

Это очень краткий обзор MetaTrader 5. Я не могу описать все новшества системы за столь короткий период времени - тестирование стартовало 09-09-2009. Это символическая дата, и я уверен, что это будет счастливым числом. Всего несколько дней у меня на руках бета-версия терминала MetaTrader 5 и MQL5. Я не успел опробовать все, что в нем есть нового, но то, что есть, уже впечатляет.

Работа с корзинами валютных пар на рынке Форекс Работа с корзинами валютных пар на рынке Форекс

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

Текстовые файлы для хранения входных параметров советников, индикаторов и скриптов Текстовые файлы для хранения входных параметров советников, индикаторов и скриптов

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