Стандартные классы языка MQL5

Введение в стандартные классы

Как вы уже могли заметить, в языке MQL5 существует большое количество групп функций для получения значений каких-либо параметров (или свойств). В каждую группу входит по три функции для получения целочисленных, дробных и строковых значений. Например, функции SymbolInfoInteger(), SymbolInfoDouble(), SymbolInfoString().

В некоторых случаях к этой группе функций добавляется еще три функции для установки значений. В частности, в группу функций, использующихся для работы с графиками, входят функции ChartGetInteger(), ChartGetDouble(), ChartGetString() и еще три функции: ChartSetInteger(), ChartSetDouble(), ChartSetString(). Кроме того что эти функции сами по себе имеют длинные имена, при вызове им надо передавать идентификатор, тоже имеющий значительную длину. В итоге процесс программирования становится очень утомительным, код объемным и сложным для прочтения.

Использование стандартных классов позволяет избежать огромного количества утомительной и однообразной работы. В первую очередь интерес представляет набор классов, предназначенных непосредственно для проведения торговых действий и связанной с ними вспомогательной работы. Эти классы располагаются в папке «Include/Trade». Всего в эту группу входит восемь файлов, в каждом из которых располагается по одному классу:

  • AccountInfo.mqh – предназначен для получения данных о счете;
  • DealInfo.mqh – для работы с историей сделок;
  • HistoryOrderInfo.mqh – для работы с историей ордеров;
  • OrderInfo.mqh – для работы с отложенными ордерами;
  • PositionInfo.mqh – для работы с позициями;
  • SymbolInfo.mqh – для получения данных о символе;
  • TerminalInfo.mqh – для получения данных о терминале;
  • Trade.mqh – для выполнения торговых действий – открытия, закрытия позиций, установки отложенных ордеров и т.п.

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

«AccountInfo.mqh» находится класс CAccountInfo, упрощающий вызов функций AccountInfoInteger(), AccountInfoDouble(), AccountInfoString(). Используя класс, не нужно писать эти длинные имена функций и их длинные идентификаторы, достаточно подключить файл, один раз создать объект, желательно с наиболее коротким именем, например «ai». Затем, достаточно ввести имя объекта, нажать клавишу с точкой и из открывшегося списка выбрать нужный метод (рис. 1).

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

Все стандартные классы являются производными от базового класса CObject, соответственно наследуют все его методы. Однако для торговли эти методы не используются, поэтому не будут рассматриваться. Будет только указано, что они относятся к классу CObject.

Список методов класса

Рис. 1. Список методов класса

Примеры применения классов располагаются в скриптах в папке «Scripts/Изучение MQL5/019 StandardClasses». Имена скриптов соответствуют именам классов и пронумерованы в порядке их рассмотрения.

Кроме торговых классов из папки «Trade» будет рассмотрен класс СArrayObj из файла «ArrayObj.mqh», располагающегося в папке «Arrays». Использование этого класса позволяет упростить работу с массивами объектов, в частности их сортировку. Также будет рассмотрен альтернативный метод сортировки, но на примере сортировки массива структур.

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

AccountInfo

Файл: «Trade/AccountInfo.mqh».

Имя класса: CAccountInfo.

Назначение: получение данных о счете, вызов функций AccountInfoInteger(), AccountInfoDouble(), AccountInfoString().

Методы класса: Balance, CAccountInfo, CObject, Company, Compare, Credit, Currency, Equity, FreeMargin, FreeMarginCheck, InfoDouble, InfoInteger, InfoString, Leverage, LimitOrders, Load, Login, Margin, MarginCall, MarginCheck, MarginLevel, MarginMode, MarginModeDescription, MarginStopOut, MaxLotCheck, Name, Next, OrderProfitCheck, Prev, Profit, Save, Server, StopoutMode, StopoutModeDescription, TradeAllowed, TradeExpert, TradeMode, TradeModeDescription, Type, ~CAccountInfo, ~CObject.

Подключение файла и создание объекта:

#include <Trade/AccountInfo.mqh> CAccountInfo ai;
Назначение методов
Balance: соответствует вызову AccountInfoDouble() с идентификатором ACCOUNT_BALANCE.

CAccountInfo: конструктор класса. Не выполняет никаких действий.

CObject: конструктор базового класса CObject.

Company: соответствует AccountInfoString() с идентификатором ACCOUNT_COMPANY.

Compare: наследован от класса CObject.

Credit: соответствует AccountInfoDouble() с идентификатором ACCOUNT_CREDIT. Currency: соответствует AccountInfoString() с идентификатором ACCOUNT_CURRENCY. Equity: соответствует AccountInfoDouble() с идентификатором ACCOUNT_EQUITY.

FreeMargin: соответствует AccountInfoDouble() с идентификатором ACCOUNT_FREEMARGIN.

Пример получения объема свободных средств:

double fm=ai.FreeMargin(); Alert("FreeMargin=",fm," ",ai.Currency());

FreeMarginCheck: функция возвращает объем свободных средств, которые останутся после открытия указанной позиции. В метод передаются параметры: символ, тип торговой операции (ORDER_TYPE_BUY или ORDER_TYPE_SELL), объем, цена. Метод работает на основе функции OrderCalcMargin() и метода FreeMargin(). В нем вычисляется разница свободных средств и средств, необходимых на открытия позиции, возвращаемых функцией OrderCalcMargin(). В случае ошибки метод возвращает значение EMPTY_VALUE.

Пример применения метода:

double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); double lots=0.1;
double fm2=ai.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,lots,ask); if(fm2<0){
Alert("Ощибка FreeMarginCheck()");
}
else{
Alert("После покупки объемом ",lots," останется свободных средств: ",fm2);
}

InfoDouble: метод для вызова функции AccountInfoDouble(). В метод передается один параметр – идентификатор получаемого свойства.

InfoInteger: метод для вызова функции AccountInfoInteger(). В метод передается один параметр – идентификатор получаемого свойства.

InfoString: метод для вызова функции AccountInfoString(). В метод передается один параметр – идентификатор получаемого свойства.

Leverage: соответствует AccountInfoInteger() с идентификатором ACCOUNT_LEVERAGE. LimitOrders: соответствует AccountInfoInteger() с идентификатором ACCOUNT_LIMIT_ORDERS. Load: наследован от класса CObject.

Login: соответствует AccountInfoInteger() с идентификатором ACCOUNT_LOGIN.

Margin: соответствует AccountInfoDouble() с идентификатором ACCOUNT_MARGIN.

MarginCall: соответствует AccountInfoDouble() с идентификатором

ACCOUNT_MARGIN_SO_CALL.

MarginCheck: вызывает функцию OrderCalcMargin(). Параметры: символ, тип торговой операции (ORDER_TYPE_BUY или ORDER_TYPE_SELL), объем, цена. В случае ошибки метод возвращает значение EMPTY_VALUE.

Пример:

double means=ai.MarginCheck(Symbol(),ORDER_TYPE_BUY,lots,ask); if(means==EMPTY_VALUE){
Alert("Ощибка MarginCheck()");
}
Alert("Для открытия покупки лотом ",lots," необходимо средств: ",means);

MarginLevel: соответствует AccountInfoDouble() с идентификатором

ACCOUNT_MARGIN_LEVEL.

MarginMode: соответствует AccountInfoInteger() с идентификатором ACCOUNT_MARGIN_MODE. Возвращает значение типа ENUM_ACCOUNT_MARGIN_MODE. Варианты возвращаемого значения:

  • ACCOUNT_MARGIN_MODE_RETAIL_NETTING – неттинг,
  • ACCOUNT_MARGIN_MODE_EXCHANGE – обмен,
  • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING – хеджинг.

MarginModeDescription: возвращает расшифровку значения, возвращаемого методом MarginMode(). Варианты: «Netting» (неттинг), «Exchange» (обмен), «Hedging» (хеджинг), «Unknown margin mode» (неизвестный тип).

MarginStopOut: соответствует AccountInfoDouble() с идентификатором ACCOUNT_MARGIN_SO_SO.

MaxLotCheck: возвращает максимальный лот, который можно открыть на указанную часть свободных средств. Параметры: символ, тип торговой операции (ORDER_TYPE_BUY или ORDER_TYPE_SELL), цена, процент. Последний параметр (процент) определяет часть свободных средств, которую допускается задействовать в сделке. Метод может использоваться для расчета лота, пропорционального свободным средствам. Если вторым параметром в метод передать константу, соответствующую любому отложенному ордеру, то метод вернет величину максимального лота (SymbolInfoDouble() с идентификатором SYMBOL_VOLUME_MAX). В случае ошибки метод возвращает значение 0.0 и выводит текстовое сообщение во вкладку «Эксперты». Возможны два типа ошибок: 1 – неправильные параметры, при этом выводится сообщение «CAccountInfo::MaxLotCheck invalid parameters» (неправильные параметры), 2 – ошибка при вызове функции OrderCalcMargin(), при этом выводится сообщение: «CAccountInfo::MaxLotCheck margin calculation failed» (не удалось выполнить метод). Пример:

double perc=10;
double lots2=ai.MaxLotCheck(Symbol(),ORDER_TYPE_BUY,ask,perc); if(lots2==0){
Alert("Ощибка MaxLotCheck() или недостаточно средств");
}
else{
Alert("При нагрузке ",perc,"% можно открыть лотов: ",lots2);
}

Name: соответствует AccountInfoString() с идентификатором ACCOUNT_NAME.

Next: наследован от класса CObject.

OrderProfitCheck: вызывает функцию OrderCalcProfit(), использующуюся для расчета прибыли позиции с указанным параметрами. Параметры: символ, тип торговой операции (ORDER_TYPE_BUY или ORDER_TYPE_SELL), объем, цена открытия, цена закрытия. В случае ошибки метод возвращает значение EMPTY_VALUE.

Пример:

int prp=100;
double profit=ai.OrderProfitCheck(Symbol(),ORDER_TYPE_BUY,lots,ask,ask+Point()*prp); if(profit==EMPTY_VALUE){
Alert("Ощибка OrderProfitCheck()");
}
else{
Alert("Прибыль ",prp," (пунктов) при лоте ",lots," равна ",profit);
}

Prev: наследован от класса CObject.

Profit: соответствует AccountInfoDouble() с идентификатором ACCOUNT_PROFIT.

Save: наследован от класса CObject.

Server: соответствует AccountInfoString() с идентификатором ACCOUNT_SERVER.

StopoutMode: соответствует вызову функции AccountInfoInteger() с идентификатором ACCOUNT_MARGIN_SO_MODE. Возвращает значение типа ENUM_ACCOUNT_STOPOUT_MODE. Варианты значения:

  • ACCOUNT_STOPOUT_MODE_PERCENT – в процентах,
  • ACCOUNT_STOPOUT_MODE_MONEY – в валюте.

StopoutModeDescription: возвращает расшифровку значения, возвращаемого методом StopoutMode(). Варианты: «Level is specified in percentage» (уровень задан в процентах), «Level is specified in money» (уровень определен в деньгах), «Unknown stopout mode» (неизвестный тип).

TradeAllowed: соответствует AccountInfoInteger() с идентификатором ACCOUNT_TRADE_ALLOWED.

TradeExpert: соответствует AccountInfoInteger() с идентификатором ACCOUNT_TRADE_EXPERT.

TradeMode: соответствует AccountInfoInteger() с идентификатором ACCOUNT_TRADE_MODE.

Возвращает значение типа ENUM_ACCOUNT_TRADE_MODE. Варианты значения:

  • ACCOUNT_TRADE_MODE_DEMO – демонстрационный счет,
  • ACCOUNT_TRADE_MODE_CONTEST – конкурсный счет,
  • ACCOUNT_TRADE_MODE_REAL – реальный счет.

TradeModeDescription: возвращает расшифровку значения, возвращаемого методом TradeMode(). Варианты: «Demo trading account» (демонстрационный счет), «Contest trading account» (конкурсный счет), «Real trading account» (реальный счет), «Unknown trade account» (неизвестный тип счета).

Пример:

string str=ai.MarginModeDescription()+". "; str=str+ai.TradeModeDescription()+"."; Alert("Тип счета: ",str);

Type: наследован от класса CObject.

~CAccountInfo: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.

DealInfo

Файл: «Trade/DealInfo.mqh».

Имя класса: CDealInfo.

Назначение: работа с историей сделок, вызов функций HistoryDealGetInteger(), HistoryDealGetDouble(), HistoryDealGetString().

Методы класса: CDealInfo, CObject, Comment, Commission, Compare, DealType, Entry, EntryDescription, ExternalId, FormatAction, FormatDeal, FormatEntry, InfoDouble, InfoInteger, InfoString, Load, Magic, Next, Order, PositionId, Prev, Price, Profit, Save, SelectByIndex, Swap, Symbol, Ticket, Time, TimeMsc, Type, TypeDescription, Volume, ~CDealInfo, ~CObject.

Подключение файла и создание объекта:

#include <Trade/DealInfo.mqh> CDealInfo di;
Назначение методов
CDealInfo: конструктор класса. Не выполняет никаких действий.

CObject: конструктор базового класса CObject.

Comment: вызов функции HistoryDealGetString() с идентификатором DEAL_COMMENT. Commission: вызов функции HistoryDealGetDouble() с идентификатором DEAL_COMMISSION. Compare: наследован от класса CObject.

DealType: вызов функции HistoryDealGetInteger() с идентификатором DEAL_TYPE. Возвращает значение типа ENUM_DEAL_TYPE. Варианты значений:

  • DEAL_TYPE_BUY – покупка,
  • DEAL_TYPE_SELL – продажа,
  • DEAL_TYPE_BALANCE – изменение баланса (снятие, пополнение),
  • DEAL_TYPE_CREDIT – кредит,
  • DEAL_TYPE_CHARGE – дополнительные сборы,
  • DEAL_TYPE_CORRECTION – коррекция,
  • DEAL_TYPE_BONUS – бонус,
  • DEAL_TYPE_COMMISSION – комиссионные,
  • DEAL_TYPE_COMMISSION_DAILY – ежедневные комиссионные,
  • DEAL_TYPE_COMMISSION_MONTHLY – ежемесячные комиссионные,
  • DEAL_TYPE_COMMISSION_AGENT_DAILY – ежедневные агентские комиссионные,
  • DEAL_TYPE_COMMISSION_AGENT_MONTHLY – ежемесячные агентские комиссионные,
  • DEAL_TYPE_INTEREST – начисление процентов,
  • DEAL_TYPE_BUY_CANCELED – отмененная сделка (при отмене покупки

DEAL_TYPE_BUY меняется на DEAL_TYPE_BUY_CANCELED),

  • DEAL_TYPE_SELL_CANCELED (при отмене продажи тип DEAL_TYPE_SELL меняется на DEAL_TYPE_SELL_CANCELED).

TypeDescription: расшифровка значения, возвращаемого методом DealType(). Варианты: «Buy type» (покупка), «Sell type» (продажа), «Balance type» (изменение баланса), «Credit type» (кредит),

«Charge type» (дополнительные сборы), «Correction type» (коррекция), «Bonus type» (бонус),

«Commission type» (комиссионные), «Daily Commission type» (ежедневные комиссионные),

«Monthly Commission type» (ежемесячные комиссионные), «Daily Agent Commission type» (ежедневные агентские комиссионные), «Monthly Agent Commission type» (ежемесячные агентские комиссионные), «Interest Rate type» (проценты), «Canceled Buy type» (отмененная покупка),

«Canceled Sell type» (отмененная продажа), «Unknown type» (неизвестный тип).

FormatAction: возвращает расшифровку для типа сделки указанного в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты:

  • DEAL_TYPE_BUY – «buy» (покупка),
  • DEAL_TYPE_SELL – «sell» (продажа),
  • DEAL_TYPE_BALANCE – «balance» (баланс),
  • DEAL_TYPE_CREDIT – «credit» (кредит),
  • DEAL_TYPE_CHARGE – «charge» (дополнительные сборы),
  • DEAL_TYPE_CORRECTION – «correction» (коррекция),
  • DEAL_TYPE_BONUS – «bonus» (бонус),
  • DEAL_TYPE_COMMISSION – «commission» (комиссионные),
  • DEAL_TYPE_COMMISSION_DAILY – «daily commission» (ежедневные комиссионные),
  • DEAL_TYPE_COMMISSION_MONTHLY – «monthly commission» (ежемесячные комиссионные),
  • DEAL_TYPE_COMMISSION_AGENT_DAILY – «daily agent commission» (ежедневные агентские комиссионные),
  • DEAL_TYPE_COMMISSION_AGENT_MONTHLY – «monthly agent commission» (ежемесячные агентские комиссионные),
  • DEAL_TYPE_INTEREST – «interest rate» (проценты),
  • DEAL_TYPE_BUY_CANCELED – «canceled buy» (отмененная покупка),
  • DEAL_TYPE_SELL_CANCELED – «canceled sell» (отмененная продажа).

В остальных случаях функция возвращает строку «unknown deal type» (неизвестный тип сделки) с добавлением числового значения (второго параметра).

FormatDeal: возвращает строку с данными о сделке. Для сделок типа DEAL_TYPE_BUY и DEAL_TYPE_SELL в строку входит тикет сделки, расшифровка типа, возвращаемая методом FormatAction(), объем, символ, цена. Для остальных сделок в строку входит тикет, значение метода FormatAction(), сумма, комментарий.

Entry: вызов HistoryDealGetInteger() с идентификатором DEAL_ENTRY. Возвращает тип

ENUM_DEAL_ENTRY. Варианты значений:

  • DEAL_ENTRY_IN – вход,
  • DEAL_ENTRY_OUT – выход,
  • DEAL_ENTRY_INOUT – разворот,
  • DEAL_ENTRY_OUT_BY – встречное закрытие.

EntryDescription: расшифровка значения, возвращаемого методом Entry(). Варианты: «In entry» (вход), «Out entry» (выход), «InOut entry» (разворот), «Out By entry» (встречное закрытие),

«Unknown entry» (неизвестный тип).

FormatEntry: возвращает расшифровку для типа входа указанного в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты:

  • DEAL_ENTRY_IN – «in» (вход),
  • DEAL_ENTRY_OUT – «out» (выход),
  • DEAL_ENTRY_INOUT – «in/out» (разворот),
  • DEAL_ENTRY_OUT_BY – «out by» (встречное закрытие).

В остальных случаях функция возвращает строку «unknown deal entry» (неизвестный тип входа) с добавлением числового значения (второго параметра).

ExternalId: вызов HistoryDealGetString() с идентификатором DEAL_EXTERNAL_ID.

InfoDouble: вызов функции HistoryDealGetDouble(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoInteger: вызов функции HistoryDealGetInteger(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoString: вызов функции HistoryDealGetString(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

Load: наследован от класса CObject.

Magic: вызов HistoryDealGetInteger() с идентификатором DEAL_MAGIC.

Next: наследован от класса CObject.

Order: вызов HistoryDealGetInteger() с идентификатором DEAL_ORDER. PositionId: вызов HistoryDealGetInteger() с идентификатором DEAL_POSITION_ID. Prev: наследован от класса CObject.

Price: вызов HistoryDealGetDouble() с идентификатором DEAL_PRICE. Profit: вызов HistoryDealGetDouble() с идентификатором DEAL_PROFIT. Save: наследован от класса CObject.

SelectByIndex: выделяет сделку по индексу. Выделение выполняется вызовом функции HistoryDealGetTicket(). После выделения тикет позиции присваивается внутреннему полю класса, затем оно используются при вызове функций HistoryDealGetInteger(), HistoryDealGetDouble(), HistoryDealGetString(). Метод возвращает true или false в зависимости от успешности его работы.

Swap: вызов HistoryDealGetDouble() с идентификатором DEAL_SWAP.

Symbol: вызов HistoryDealGetString() с идентификатором DEAL_SYMBOL.

Ticket: есть два перегруженных метода. Метод без параметров возвращает значение тикета позиции, выделенной методом SelectByIndex(). Метод с параметром устанавливает новое значение тикета во внутренне поле, использующееся при вызове функций HistoryDealGetInteger(), HistoryDealGetDouble(), HistoryDealGetString().

Time: вызов HistoryDealGetInteger() с идентификатором DEAL_TIME.

TimeMsc: вызов HistoryDealGetInteger() с идентификатором DEAL_TIME_MSC.

Type: наследован от класса CObject.

Volume: вызов HistoryDealGetDouble() с идентификатором DEAL_VOLUME.

~CAccountInfo: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.
Примеры использования класса
Сначала необходимо выделить историю:

if(!HistorySelect(0,TimeCurrent())){ return;
}

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

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

double buyProfit=0; double sellProfit=0;
for(int i=HistoryDealsTotal()-1;i>=0;i--){ if(di.SelectByIndex(i)){
if(di.Entry()==DEAL_ENTRY_OUT || di.Entry()==DEAL_ENTRY_INOUT){ if(di.DealType()==DEAL_TYPE_BUY){
buyProfit+=di.Profit();
}
else if(di.DealType()==DEAL_TYPE_SELL){ sellProfit+=di.Profit();
}
}
}
else{
return;
}
}
Alert("buyProfit=",DoubleToString(buyProfit,2), ", sellProfit=",DoubleToString(sellProfit,2));

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

Если известен тикет сделки, то сначала необходимо выделить историю по времени или одну сделку по тикету, затем вызвать метод Ticket() для передачи объекту нового тикета, после этого можно получать свойства сделки:

long t=46890967; if(HistoryDealSelect(t)){
di.Ticket(t);
Alert(di.Profit());
}
else{
return;
}

HistoryOrderInfo

Файл: «Trade/HistoryOrderInfo.mqh».

Имя класса: CHistoryOrderInfo.

Назначение: работа с историей ордеров, вызов функций HistoryOrderGetInteger(), HistoryOrderGetDouble(), HistoryOrderGetString().

Методы класса: CHistoryOrderInfo, CObject, Comment, Compare, ExternalId, FormatOrder, FormatPrice, FormatStatus, FormatType, FormatTypeFilling, FormatTypeTime, InfoDouble, InfoInteger, InfoString, Load, Magic, Next, OrderType, PositionById, PositionId, Prev, PriceCurrent, PriceOpen, PriceStopLimit, Save, SelectByIndex, State, StateDescription, StopLoss, Symbol, TakeProfit, Ticket, TimeDone, TimeDoneMsc, TimeExpiration, TimeSetup, TimeSetupMsc, Type, TypeDescription, TypeFilling, TypeFillingDescription, TypeTime, TypeTimeDescription, VolumeCurrent, VolumeInitial, ~CHistoryOrderInfo, ~CObject.

Подключение файла и создание объекта:

#include <Trade/HistoryOrderInfo.mqh> CHistoryOrderInfo ho;Назначение методов CHistoryOrderInfo: конструктор класса. Не выполняет никаких действий. CObject: конструктор базового класса CObject.

Comment: вызов HistoryOrderGetString() с идентификатором ORDER_COMMENT.

Compare: наследован от класса CObject.

ExternalId: вызов HistoryOrderGetString() с идентификатором ORDER_EXTERNAL_ID.

OrderType: вызов HistoryOrderGetInteger() с идентификатором ORDER_TYPE. Метод возвращает значение типа ENUM_ORDER_TYPE. Варианты значений:

  • ORDER_TYPE_BUY – рыночный ордер на покупку,
  • ORDER_TYPE_SELL – рыночный ордер на продажу,
  • ORDER_TYPE_BUY_LIMIT – отложенный лимитный ордер на покупку,
  • ORDER_TYPE_SELL_LIMIT – отложенный лимитный ордер на продажу,
  • ORDER_TYPE_BUY_STOP – отложенный стоп ордер на покупку,
  • ORDER_TYPE_SELL_STOP – отложенный стоп ордер на продажу,
  • ORDER_TYPE_BUY_STOP_LIMIT – отложенный стоп-лимит ордер на покупку,
  • ORDER_TYPE_SELL_STOP_LIMIT – отложенный стоп-лимит ордер на продажу,
  • ORDER_TYPE_CLOSE_BY – запрос на встречное закрытие.

FormatType: возвращает расшифровку для типа ордера указанного в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «buy» (покупка), «sell» (продажа), «buy limit» (лимитный на покупку), «sell limit» (лимитный на продажу), «buy stop» (стоп на покупку), «sell stop» (стоп на продажу), «buy stop limit» (стоп-лимит на покупку), «sell stop limit» (стоп-лимит на продажу), «close by» (встречное закрытие). Для неизвестного типа возвращает строку «unknown order type» (неизвестный тип ордера) с добавлением числового значения этого типа (второго параметра).

TypeDescription: Вызов метода FormatType() для типа, возвращаемого методом OrderType(). Возвращает то же самое, что и метод FormatType().

PriceStopLimit: вызов HistoryOrderGetDouble() с идентификатором ORDER_PRICE_STOPLIMIT. Возвращает цену второго срабатывания стоп-лимит ордера (цены лимитного ордера).

FormatPrice: возвращает строку с ценой открытия ордера. Для ордеров типа стоп-лимит возвращает строку с двумя ценами – ценой первого срабатывания и ценой второго срабатывания (лимитного ордера).

FormatOrder: возвращает строку с данными об ордере. В строку входит тикет, расшифровка типа, возвращаемая методом OrderType(), а также объем, символ и цена, возвращаемая методом FormatPrice() (или две цены для ордеров типа стоп-лимит).

State: вызов HistoryOrderGetInteger() с идентификатором ORDER_STATE. Возвращает значение типа ENUM_ORDER_STATE. Варианты значений:

  • ORDER_STATE_STARTED – начата обработка ордера,
  • ORDER_STATE_PLACED – размещен,
  • ORDER_STATE_CANCELED – отменен,
  • ORDER_STATE_PARTIAL – исполнен частично,
  • ORDER_STATE_FILLED – исполнен полностью,
  • ORDER_STATE_REJECTED – отклонен,
  • ORDER_STATE_EXPIRED – время действия ордера истекло.

FormatStatus: возвращает расшифровку статуса ордера указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «started» (начата обработка), «placed» (размещен), «canceled» (отменен), «partial» (исполнен частично), «filled» (исполнен полностью), «rejected» (отклонен), «expired» (истекло время действия ордера). Для неизвестного типа возвращает строку «unknown order status» с добавлением числового значения этого типа (второго параметра).

StateDescription: вызов метода FormatStatus() для типа, возвращаемого методом State(). Возвращает то же самое, что и метод FormatStatus().

TypeFilling: вызов HistoryOrderGetInteger() с идентификатором ORDER_TYPE_FILLING.

Возвращает значение типа ENUM_ORDER_TYPE_FILLING. Варианты значений:

  • ORDER_FILLING_RETURN – исполнить с доступным объемом и ждать исполнения остатка,
  • ORDER_FILLING_IOC – исполнить с доступным объемом, остальное удалить,
  • ORDER_FILLING_FOK – исполнить или удалить.

FormatTypeFilling: возвращает расшифровку типа заполнения указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты:

  • ORDER_FILLING_RETURN – «return remainder» (исполнить с доступным объемом и ждать исполнения остатка),
  • ORDER_FILLING_IOC – «cancel remainder» (исполнить с доступным объемом, остальное удалить),
  • ORDER_FILLING_FOK – «fill or kill» (исполнить или удалить).

Для неизвестного типа возвращает строку «unknown type filling» с добавлением числового значения этого типа (второго параметра).

TypeFillingDescription: вызов метода FormatTypeFilling() для типа, возвращаемого методом TypeFilling(). Возвращает то же, что и метод FormatTypeFilling ().

TypeTime: вызов HistoryOrderGetInteger() с идентификатором ORDER_TYPE_TIME. Возвращает значение типа ENUM_ORDER_TYPE_TIME. Варианты значений:

  • ORDER_TIME_GTC – ордер существует до срабатывания или удаления,
  • ORDER_TIME_DAY – ордер удаляется в конце дня,
  • ORDER_TIME_SPECIFIED – ордер существует в течение указанного времени,
  • ORDER_TIME_SPECIFIED_DAY – ордер существует до конца указанного дня.

FormatTypeTime: возвращает расшифровку типа указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «gtc» (существует до срабатывания или удаления), «day» (существует до конца дня), «specified» (существует в течении указанного времени), «specified day» (существует до конца указанного дня).

Для неизвестного типа возвращает строку «unknown type time» с добавлением числового значения этого типа (второго параметра).

TypeTimeDescription: вызов метода FormatTypeTime() для типа, возвращаемого методом TypeTime(). Возвращает то же самое, что и метод FormatTypeTime().

InfoDouble: вызов функции HistoryOrderGetDouble(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoInteger: вызов функции HistoryOrderGetInteger(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoString: вызов функции HistoryOrderGetString(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

Load: наследован от класса CObject.

Magic: вызов HistoryOrderGetInteger() с идентификатором ORDER_MAGIC.

Next: наследован от класса CObject.

PositionById: вызов HistoryOrderGetInteger() с идентификатором ORDER_POSITION_BY_ID.

PositionId: вызов HistoryOrderGetInteger() с идентификатором ORDER_POSITION_ID.

Prev: наследован от класса CObject.

PriceCurrent: вызов HistoryOrderGetDouble() с идентификатором ORDER_PRICE_CURRENT.

PriceOpen: вызов HistoryOrderGetDouble() с идентификатором ORDER_PRICE_OPEN.

Save: наследован от класса CObject.

SelectByIndex: выделяет ордер по индексу. Выделение выполняется вызовом функции HistoryOrderGetTicket(). После выделения тикет позиции присваивается внутреннему полю класса, затем оно используются при вызове функций HistoryOrderGetInteger(), HistoryOrderGetDouble(), HistoryOrderGetString(). Метод возвращает true или false в зависимости от успешности его работы.

StopLoss: вызов HistoryOrderGetDouble() с идентификатором ORDER_SL. Symbol: вызов HistoryOrderGetString() с идентификатором ORDER_SYMBOL. TakeProfit: вызов HistoryOrderGetDouble() с идентификатором ORDER_TP.

Ticket: есть два перегруженных метода. Метод без параметров возвращает значение тикета ордера, выделенного методом SelectByIndex(). Метод с параметром устанавливает новое значение тикета во внутренне поле, использующееся при вызове функций HistoryOrderGetInteger(), HistoryOrderGetDouble(), HistoryOrderGetString().

TimeDone: вызов HistoryOrderGetInteger() с идентификатором ORDER_TIME_DONE.

TimeDoneMsc: вызов HistoryOrderGetInteger() с идентификатором ORDER_TIME_DONE_MSC.

TimeExpiration: вызов HistoryOrderGetInteger() с идентификатором ORDER_TIME_EXPIRATION.

TimeSetup: вызов HistoryOrderGetInteger() с идентификатором ORDER_TIME_SETUP. TimeSetupMsc: вызов HistoryOrderGetInteger() с идентификатором ORDER_TIME_SETUP_MSC. Type: наследован от класса CObject.

VolumeCurrent: вызов HistoryOrderGetDouble() с идентификатором ORDER_VOLUME_CURRENT.

VolumeInitial: вызов HistoryOrderGetDouble() с идентификатором ORDER_VOLUME_INITIAL.

~CHistoryOrderInfo: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.
Примеры использования класса
Сначала необходимо выделить историю:

if(!HistorySelect(0,TimeCurrent())) return;
}

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

string str;
int limit=MathMax(HistoryOrdersTotal()-10,0); for(int i=HistoryOrdersTotal()-1;i>=limit;i--){
if(ho.SelectByIndex(i)){ Alert(ho.FormatOrder(str));

}
else{
return;
}
}

Если известен тикет ордера, то сначала надо выделить историю по времени или один ордер по тикету, затем передать объекту тикет – вызвать метод Ticket() с параметром, после этого можно получать свойства ордера:

long t=62717950; if(HistoryOrderSelect(t)){
ho.Ticket(t); Alert(ho.PriceOpen());
}
else{
return;
}

OrderInfo

Файл: «Trade/OrderInfo.mqh».

Имя класса: COrderInfo.

Назначение: работа с отложенными ордерами, вызов функций OrderGetInteger(), OrderGetDouble(), OrderGetString().

Методы класса: CObject, COrderInfo, CheckState, Comment, Compare, ExternalId, FormatOrder, FormatPrice, FormatStatus, FormatType, FormatTypeFilling, FormatTypeTime, InfoDouble, InfoInteger, InfoString, Load, Magic, Next, OrderType, PositionById, PositionId, Prev, PriceCurrent, PriceOpen, PriceStopLimit, Save, Select, SelectByIndex, State, StateDescription, StopLoss, StoreState, Symbol, TakeProfit, Ticket, TimeDone, TimeDoneMsc, TimeExpiration, TimeSetup, TimeSetupMsc, Type, TypeDescription, TypeFilling, TypeFillingDescription, TypeTime, TypeTimeDescription, VolumeCurrent, VolumeInitial, ~CObject, ~COrderInfo.

Подключение файла и создание объекта:

#include <Trade/OrderInfo.mqh> COrderInfo o;
Назначение методов
COrderInfo: конструктор класса. Не выполняет никаких действий.

CObject: конструктор базового класса CObject.

Comment: соответствует OrderGetString() с идентификатором ORDER_COMMENT.

Compare: наследован от класса CObject.

ExternalId: соответствует OrderGetString() с идентификатором ORDER_EXTERNAL_ID.

OrderType: вызов OrderGetInteger() с идентификатором ORDER_TYPE. Метод возвращает значение типа ENUM_ORDER_TYPE. Варианты значений:

  • ORDER_TYPE_BUY – рыночный ордер на покупку,
  • ORDER_TYPE_SELL – рыночный ордер на продажу,
  • ORDER_TYPE_BUY_LIMIT – отложенный лимитный ордер на покупку,
  • ORDER_TYPE_SELL_LIMIT – отложенный лимитный ордер на продажу,
  • ORDER_TYPE_BUY_STOP – отложенный стоп ордер на покупку,
  • ORDER_TYPE_SELL_STOP – отложенный стоп ордер на продажу,
  • ORDER_TYPE_BUY_STOP_LIMIT – отложенный стоп-лимит ордер на покупку,
  • ORDER_TYPE_SELL_STOP_LIMIT – отложенный стоп-лимит ордер на продажу,
  • ORDER_TYPE_CLOSE_BY – запрос на встречное закрытие.

FormatType: возвращает расшифровку для типа ордера, указанного в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «buy» (покупка), «sell» (продажа), «buy limit» (лимитный на покупку), «sell limit» (лимитный на продажу), «buy stop» (стоп на покупку), «sell stop» (стоп на продажу), «buy stop limit» (стоп-лимит на покупку), «sell stop limit» (стоп-лимит на продажу), «close by» (встречное закрытие). Для неизвестного типа возвращает строку «unknown order type» (неизвестный тип ордера) с добавлением числового значения этого типа (второго параметра).

TypeDescription: Вызов метода FormatType() для типа, возвращаемого методом OrderType(). Возвращает то же самое, что и метод FormatType().

PriceStopLimit: соответствует OrderGetDouble() с идентификатором ORDER_PRICE_STOPLIMIT. Возвращает цену второго срабатывания стоп-лимит ордера (цену лимитного ордера).

FormatPrice: возвращает строку с ценой открытия ордера. Для ордеров типа стоп-лимит возвращает две цены – цену первого срабатывания и цену второго срабатывания (лимитного ордера).

FormatOrder: возвращает строку с данными об ордере. В строку входит тикет, расшифровка типа, возвращаемая методом OrderType(), а также объем, символ и цена, возвращаемая методом FormatPrice() (или две цены для ордеров типа стоп-лимит).

State: соответствует OrderGetInteger() с идентификатором ORDER_STATE. Возвращает значение типа ENUM_ORDER_STATE. Варианты значений:

  • ORDER_STATE_STARTED – начата обработка ордера,
  • ORDER_STATE_PLACED – размещен,
  • ORDER_STATE_CANCELED – отменен,
  • ORDER_STATE_PARTIAL – исполнен частично,
  • ORDER_STATE_FILLED – исполнен полностью,
  • ORDER_STATE_REJECTED – отклонен,
  • ORDER_STATE_EXPIRED – время действия ордера истекло.

FormatStatus: возвращает расшифровку статуса ордера, указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «started» (начата обработка), «placed» (размещен), «canceled» (отменен), «partial» (исполнен частично), «filled» (исполнен полностью), «rejected» (отклонен), «expired» (истекло время действия ордера). Для неизвестного типа возвращает строку «unknown order status » с добавлением числового значения этого типа (второго параметра).

StateDescription: вызов метода FormatStatus() для типа, возвращаемого методом State(). Возвращает то же, что и метод FormatStatus().

TypeFilling: соответствует OrderGetInteger() с идентификатором ORDER_TYPE_FILLING.

Возвращает значение типа ENUM_ORDER_TYPE_FILLING. Варианты значений:

  • ORDER_FILLING_RETURN – исполнить с доступным объемом и ждать исполнения остатка,
  • ORDER_FILLING_IOC – исполнить с доступным объемом, остальное удалить,
  • ORDER_FILLING_FOK – исполнить или удалить.

FormatTypeFilling: возвращает расшифровку типа заполнения, указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты:

  • ORDER_FILLING_RETURN – «return remainder» (исполнить с доступным объемом и ждать исполнения остатка),
  • ORDER_FILLING_IOC – «cancel remainder» (исполнить с доступным объемом, остальное удалить),
  • ORDER_FILLING_FOK – «fill or kill» (исполнить или удалить).

Для неизвестного типа возвращает строку «unknown type filling» с добавлением числового значения этого типа (второго параметра).

TypeFillingDescription: вызов метода FormatTypeFilling() для типа, возвращаемого методом TypeFilling(). Возвращает то же, что и метод FormatTypeFilling ().

TypeTime: соответствует OrderGetInteger() с идентификатором ORDER_TYPE_TIME. Возвращает значение типа ENUM_ORDER_TYPE_TIME. Варианты значений:

  • ORDER_TIME_GTC – ордер существует до срабатывания или удаления,
  • ORDER_TIME_DAY – ордер удаляется в конце дня,
  • ORDER_TIME_SPECIFIED – ордер существует в течение указанного времени,
  • ORDER_TIME_SPECIFIED_DAY – ордер существует до конца указанного дня.

FormatTypeTime: возвращает расшифровку типа, указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «gtc» (существует до срабатывания или удаления), «day» (существует до конца дня), «specified» (существует в течении указанного времени), «specified day» (существует до конца указанного дня).

Для неизвестного типа возвращает строку » unknown type time» с добавлением числового значения этого типа (второго параметра).

TypeTimeDescription: вызов метода FormatTypeTime() для типа, возвращаемого методом TypeTime(). Возвращает то же, что и метод FormatTypeTime().

InfoDouble: вызов функции OrderGetDouble(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoInteger: вызов функции OrderGetInteger(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoString: вызов функции OrderGetString(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

Load: наследован от класса CObject.

Magic: соответствует OrderGetInteger() с идентификатором ORDER_MAGIC.

Next: наследован от класса CObject.

PositionById: соответствует OrderGetInteger() с идентификатором ORDER_POSITION_BY_ID.

PositionId: соответствует OrderGetInteger() с идентификатором ORDER_POSITION_ID.

Prev: наследован от класса CObject.

PriceCurrent: соответствует OrderGetDouble() с идентификатором ORDER_PRICE_CURRENT.

PriceOpen: соответствует OrderGetDouble() с идентификатором ORDER_PRICE_OPEN.

Save: наследован от класса CObject.

Select: вызов функции OrderSelect() для выделения ордера по тикету. Существует два варианта метода. Метод без параметров выделяет ордер по тикету, установленному во внутреннем поле объекта. Второй вариант метода имеет один параметр – тикет выделяемого ордера. При удачном выделении ордера, значение тикета присваивается внутреннему полю объекта. Возвращает метод true или false в зависимости от успешности выделения.

SelectByIndex: выделяет ордер по индексу. Выделение выполняется вызовом функции OrderGetTicket(). После выделения тикет позиции присваивается внутреннему полю класса, значение которого можно получить методом Ticket(). Метод возвращает true или false в зависимости от успешности его работы.

StopLoss: соответствует OrderGetDouble() с идентификатором ORDER_SL. Symbol: соответствует OrderGetString() с идентификатором ORDER_SYMBOL. TakeProfit: соответствует OrderGetDouble() с идентификатором ORDER_TP. Ticket: возвращает значения тикета из внутреннего поля класса.

TimeDone: соответствует OrderGetInteger() с идентификатором ORDER_TIME_DONE.

TimeDoneMsc: соответствует OrderGetInteger() с идентификатором ORDER_TIME_DONE_MSK.

TimeExpiration: соответствует OrderGetInteger() с идентификатором ORDER_TIME_EXPIRATION.

TimeSetup: соответствует OrderGetInteger() с идентификатором ORDER_TIME_SETUP. TimeSetupMsc: соответствует OrderGetInteger() с идентификатором ORDER_TIME_SETUP_MSK. Type: наследован от класса CObject.

VolumeCurrent: соответствует OrderGetDouble() с идентификатором ORDER_VOLUME_CURRENT.

VolumeInitial: соответствует OrderGetDouble() с идентификатором ORDER_VOLUME_INITIAL.

StoreState: сохранение состояния ордера. Во внутренние поля объекта сохраняются следующие параметры ордера: тип ордера, статус, время экспирации, текущий объем, цена открытия, стоплосс, тейкпфроит.

CheckState: сравнивает текущие параметры ордера с параметрами, сохраненными методом StoreState(). Если параметры не изменились, возвращает false, иначе, при изменении хотя бы одного параметра, возвращает true.

~COrderInfo: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.
Примеры использования класса
Вывод в окно сообщений информации о всех активных отложенных ордерах:

string str;
int cnt=OrdersTotal(); for(int i=0;i<cnt;i++){
if(o.SelectByIndex(i)){ Alert(o.FormatOrder(str));
}
else{
return;
}
}

Выделение ордера по тикету и вывод его цены открытия:

int t=70808288;
if(o.Select(t)){ Alert(o.PriceOpen());
}
else{
return;
}

PositionInfo

Файл: «Trade/PositionInfo.mqh».

Имя класса: CPositionInfo.

Назначение: работа с позициями, вызов функций PositionGetInteger(), PositionGetDouble(), PositionGetString().

Методы класса: CObject, CPositionInfo, CheckState, Comment, Commission, Compare, FormatPosition, FormatType, Identifier, InfoDouble, InfoInteger, InfoString, Load, Magic, Next, PositionType, Prev, PriceCurrent, PriceOpen, Profit, Save, Select, SelectByIndex, SelectByMagic, SelectByTicket, StopLoss, StoreState, Swap, Symbol, TakeProfit, Ticket, Time, TimeMsc, TimeUpdate, TimeUpdateMsc, Type, TypeDescription, Volume, ~CObject, ~CPositionInfo.

Подключение файла и создание объекта:

#include <Trade/PositionInfo.mqh> CPositionInfo p;
Назначение методов
CPositionInfo: конструктор класса. Не выполняет никаких действий.

CObject: конструктор базового класса CObject.

Comment: соответствует PositionGetString() с идентификатором POSITION_COMMENT. Commission: соответствует PositionGetDouble() с идентификатором POSITION_COMMISSION. Compare: наследован от класса CObject.

PositionType: соответствует PositionGetInteger() с идентификатором POSITION_TYPE.

Возвращает значение типа ENUM_POSITION_TYPE. Варианты значений:

  • POSITION_TYPE_BUY – покупка,
  • POSITION_TYPE_SELL – продажа.

FormatType: возвращает расшифровку типа позиции, указанную в параметрах метода. Параметры: строковая переменная для возвращаемого по ссылке значения, числовое значение типа. Также функция возвращает расшифровку обычным образом. Варианты: «buy» (покупка), «sell» (продажа).

TypeDescription: вызов метода FormatType() для выделенной позиции.

FormatPosition: возвращает строку с данными о выделенной позиции. В строку входит тикет (только на неттинговом счете), расшифровка типа, возвращаемая методом FormatType(), а также объем, символ и цена, возвращаемая методом FormatPrice() (или две цены для ордеров типа стоп- лимит). Если у позиции есть стоплосса, то выводится его значение, так же с тейкпрфитом.

Identifier: соответствует PositionGetInteger() с идентификатором POSITION_IDENTIFIER.

InfoDouble: вызов функции PositionGetDouble(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoInteger: вызов функции PositionGetInteger(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoString: вызов функции PositionGetString(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

Load: наследован от класса CObject.

Magic: соответствует PositionGetInteger() с идентификатором POSITION_MAGIC.

Next: наследован от класса CObject.

Prev: наследован от класса CObject.

PriceCurrent: соответствует PositionGetDouble() с идентификатором

POSITION_PRICE_CURRENT.

PriceOpen: соответствует PositionGetDouble() с идентификатором POSITION_PRICE_OPEN.

Profit: соответствует PositionGetDouble() с идентификатором POSITION_PROFIT.

Save: наследован от класса CObject.

Select: вызов функции PositionSelect(). В метод передается один парамтер – символ позиции. Используется для неттингового счета.

SelectByIndex: выделение позиции по индексу. Выполняется вызовом функции PositionGetTicket(). В метод передается один параметр – индекс позиции. Возвращает метод true или false, в зависимости от успешности его работы.

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

SelectByTicket: вызов функции PositionSelectByTicket() для выделения позиции по тикету. В метод передается один параметр – тикет. Возвращает метод true или false, в зависимости от успешности его работы.

StopLoss: соответствует PositionGetDouble() с идентификатором POSITION_SL. Swap: соответствует PositionGetDouble() с идентификатором POSITION_SWAP. Symbol: соответствует PositionGetString() с идентификатором POSITION_SYMBOL. TakeProfit: соответствует PositionGetDouble() с идентификатором POSITION_TP. Ticket: соответствует PositionGetInteger() с идентификатором POSITION_TICKET. Time: соответствует PositionGetInteger() с идентификатором POSITION_TIME.

TimeMsc: соответствует PositionGetInteger() с идентификатором POSITION_TIME_MSC.

TimeUpdate: соответствует PositionGetInteger() с идентификатором POSITION_TIME_UPDATE.

TimeUpdateMsc: соответствует вызову функции PositionGetInteger() с идентификатором POSITION_TIME_UPDATE_MSC.

Type: наследован от класса CObject.

Volume: соответствует PositionGetDouble() с идентификатором POSITION_VOLUME.

StoreState: сохранение состояния позиции. Во внутренние поля объекта сохраняются следующие параметры ордера: тип позиции, объем, цена, стоплосс, тейкпфроит.

CheckState: сравнивает текущие параметры позиции с параметрами, сохраненными методом StoreState(). Если параметры не изменились, возвращает false, иначе, при изменении хотя бы одного параметра, возвращает true.

~CPositionInfo: деструктор класса. Не выполняет никаких действий.

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

int BuyCnt=0; int SellCnt=0;
if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING){
int total=PositionsTotal(); for(int i=0;i<total;i++){
if(p.SelectByIndex(i)){ if(p.PositionType()==POSITION_TYPE_BUY){
BuyCnt++;
}
else if(p.PositionType()==POSITION_TYPE_SELL){ SellCnt++;
}
}
else{
return;
}
}
}

Следующий пример определяет наличие позиции на покупки или продажу на неттинговом счете:

if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_NETTING){
if(p.Select(Symbol())){ if(p.PositionType()==POSITION_TYPE_BUY){
BuyCnt=1;
}
else if(p.PositionType()==POSITION_TYPE_SELL){ SellCnt=1;
}
}
}

Вывод результата подсчета:

Alert("BuyCnt=",BuyCnt,", SellCnt=",SellCnt);

SymbolInfo

Файл: «Trade/SymbolInfo.mqh».

Имя класса: CSymbolInfo.

Назначение: получения свойств символа, вызов функций SymbolInfoInteger(), SymbolInfoDouble(), SymbolInfoString().

Все методы класса: Ask, AskHigh, AskLow, Bank, Bid, BidHigh, BidLow, CObject, CSymbolInfo, CheckMarketWatch, Compare, ContractSize, CurrencyBase, CurrencyMargin, CurrencyProfit, Description, Digits, ExpirationTime, FreezeLevel, InfoDouble, InfoInteger, InfoString, IsSynchronized, Last, LastHigh, LastLow, Load, LotsLimit, LotsMax, LotsMin, LotsStep, MarginInitial, MarginLimit, MarginLong, MarginMaintenance, MarginShort, MarginStop, MarginStopLimit, Name, Next, NormalizePrice, OrderMode, Path, Point, Prev, Refresh, RefreshRates, Save, Select, SessionAW, SessionBuyOrders, SessionBuyOrdersVolume, SessionClose, SessionDeals, SessionInterest, SessionOpen, SessionPriceLimitMax, SessionPriceLimitMin, SessionPriceSettlement, SessionSellOrders, SessionSellOrdersVolume, SessionTurnover, Spread, SpreadFloat, StartTime, StopsLevel, SwapLong, SwapMode, SwapModeDescription, SwapRollover3days, SwapRollover3daysDescription, SwapShort, TickSize, TickValue, TickValueLoss, TickValueProfit, TicksBookDepth, Time, TradeCalcMode, TradeCalcModeDescription, TradeExecution, TradeExecutionDescription, TradeFillFlags, TradeMode, TradeModeDescription, TradeTimeFlags, Type, Volume, VolumeHigh, VolumeLow, ~CObject, ~CSymbolInfo.

Подключение файла и создание объекта:

#include <Trade/SymbolInfo.mqh> CSymbolInfo s;

Использование объекта класса CSymbolInfo начинается с установки ему символа, это выполняется вызовом метода Name(). Существует два метода Name() – метод с параметром и без параметров. Метод с параметром используется для установки символа, а метод без параметра для его получения. Однако после установки символа можно вызвать не все его методы. Перед вызовом некоторых методов необходимо произвести обновление данных посредством вызова метода Refresh(). А пред вызовом некоторых других методов необходимо вызвать метод RefreshRates().

Таким образом, можно выделить две особых группы методов: методы, требующие предварительного вызова метода Refresh() и методы, требующие предварительного вызова метода RefreshRates(). Остальные методы не требует предварительного обновления.

Методы, требующие предварительного вызова метода Refresh(): ContractSize, Digits, LotsLimit, LotsMax, LotsMin, LotsStep, MarginInitial, MarginLimit, MarginLong, MarginMaintenance, MarginShort, MarginStop, MarginStopLimit, OrderMode, Point, SwapLong, SwapMode, SwapModeDescription, SwapRollover3days, SwapRollover3daysDescription, SwapShort, TickSize, TickValue, TickValueLoss, TickValueProfit, TradeCalcMode, TradeCalcModeDescription, TradeExecution, TradeExecutionDescription, TradeFillFlags, TradeMode, TradeModeDescription, TradeTimeFlags.

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

Однако все обновляемые им данные можно отнести к постоянным свойствам символа, не меняющимся во времени, поэтому достаточно одного вызова метода Refresh() в начале работы программы. Исключение может составлять метод TickValue() – стоимость тика. На некоторых символах стоимость тика меняется в соответствии с изменениями курса другой валюты. В этом случае, для получения стоимости тика, рекомендуется непосредственно вызывать функцию SymbolInfoDouble() с идентификатором SYMBOL_TRADE_TICK_VALUE или написать для этого свою функцию с коротким именем.

Метод Refresh() возвращает true или false в зависимости от успешности его работы, возвращаемое значение необходимо проверять.

Методы, требующие предварительного вызова метода RefreshRates(): Ask, Bid, Last, Time, Volume.

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

Метод RefreshRates() возвращает true или false в зависимости от успешности его работы, возвращаемое значение необходимо проверять.

Назначение методов CSymbolInfo: конструктор класса. Не выполняет никаких действий. CObject: конструктор базового класса CObject.

Ask: возвращает значение поля ask cтруктуры MqlTick. Требует предварительного вызова метода RefreshRates().

AskHigh: соответствует SymbolInfoDouble() с идентификатором SYMBOL_ASKHIGH. AskLow: соответствует SymbolInfoDouble() с идентификатором SYMBOL_ASKLOW. Bank: соответствует SymbolInfoString() с идентификатором SYMBOL_BANK.

Bid: возвращает значение поля bid структуры MqlTick. Требует предварительного вызова метода RefreshRates().

BidHigh: соответствует SymbolInfoDouble() с идентификатором SYMBOL_BIDHIGH.

BidLow: соответствует SymbolInfoDouble() с идентификатором SYMBOL_BIDLOW.

CheckMarketWatch: проверяет наличие символа, установленного методом Name(), в окне обзора рынка. При отсутствии символа в окне обзора рынка выполняется попытка его добавления. Если проверка символа проходит успешно (символ уже существует в окне обзора рынка или успешно в него добавлен), метод возвращает true, иначе false.

Compare: наследован от класса CObject.

ContractSize: возвращает значение из внутреннего поля объекта. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_TRADE_CONTRACT_SIZE. Требует предварительного вызова метода Refresh().

CurrencyBase: соответствует SymbolInfoString() с идентификатором SYMBOL_CURRENCY_BASE.

CurrencyMargin: соответствует SymbolInfoString() с идентификатором SYMBOL_CURRENCY_MARGIN.

CurrencyProfit: соответствует SymbolInfoString() с идентификатором SYMBOL_CURRENCY_PROFIT.

Description: соответствует SymbolInfoString() с идентификатором SYMBOL_DESCRIPTION.

Digits: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_DIGITS. Требует предварительного вызова метода Refresh().

ExpirationTime: соответствует SymbolInfoInteger() с идентификатором

SYMBOL_EXPIRATION_TIME.

FreezeLevel: соответствует SymbolInfoInteger() с идентификатором

SYMBOL_TRADE_FREEZE_LEVEL).

InfoDouble: вызов функции SymbolInfoDouble(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoInteger: вызов функции SymbolInfoInteger(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

InfoString: вызов функции SymbolInfoString(). В метод передается два параметра: идентификатор и переменная для возвращаемого по ссылке значения. Сам метод возвращает true или false в зависимости от успешности его работы.

IsSynchronized: вызов функции SymbolIsSynchronized().

Last: возвращает значение поля last структуры MqlTick. Требует предварительного вызова метода RefreshRates().

LastHigh: соответствует SymbolInfoDouble() с идентификатором SYMBOL_LASTHIGH. LastLow: соответствует SymbolInfoDouble() с идентификатором SYMBOL_LASTLOW. Load: наследован от класса CObject.

LotsLimit: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_VOLUME_LIMIT. Требует предварительного вызова метода Refresh().

LotsMax: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_VOLUME_MAX. Требует предварительного вызова метода Refresh().

LotsMin: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_VOLUME_MIN. Требует предварительного вызова метода Refresh().

LotsStep: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_VOLUME_STEP. Требует предварительного вызова метода Refresh().

MarginInitial: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_INITIAL. Требует предварительного вызова метода Refresh().

MarginLimit: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_LIMIT. Требует предварительного вызова метода Refresh().

MarginLong: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_LONG. Требует предварительного вызова метода Refresh().

MarginMaintenance: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_MAINTENANCE. Требует предварительного вызова метода Refresh().

MarginShort: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_SHORT. Требует предварительного вызова метода Refresh().

MarginStop: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_STOP. Требует предварительного вызова метода Refresh().

MarginStopLimit: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_MARGIN_STOPLIMIT. Требует предварительного вызова метода Refresh().

Name: существует два метода Name() – метод с параметром и без параметров. Метод с параметром используется для установки символа, а метод без параметра для его получения.

Next: наследован от класса CObject.

NormalizePrice: метод выполняет нормализацию цены. Выполняется округление в соответствии с величиной тика, затем нормализация в соответствии с количеством знаков после запятой у котировок. Требует предварительного вызова метода Refresh().

OrderMode: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_TRADE_EXEMODE. Требует предварительного вызова метода Refresh().

Path: соответствует SymbolInfoString() с идентификатором SYMBOL_PATH.

Point: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_POINT. Требует предварительного вызова метода Refresh().

Prev: наследован от класса CObject.

Refresh: обновляет данные, возвращаемые методами ContractSize, Digits, LotsLimit, LotsMax, LotsMin, LotsStep, MarginInitial, MarginLimit, MarginLong, MarginMaintenance, MarginShort,

MarginStop, MarginStopLimit, OrderMode, Point, SwapLong, SwapMode, SwapModeDescription, SwapRollover3days, SwapRollover3daysDescription, SwapShort, TickSize, TickValue, TickValueLoss, TickValueProfit, TradeCalcMode, TradeCalcModeDescription, TradeExecution, TradeExecutionDescription, TradeFillFlags, TradeMode, TradeModeDescription, TradeTimeFlags.

Метод Refresh() достаточно вызвать один раз на запуске программы.

RefreshRates: обновляет данные, возвращаемые методами Ask, Bid, Last, Time, Volume.

Метод RefreshRates() необходимо вызывать перед каждым использованием обновляемых им методов.

Save: наследован от класса CObject.

Select: соответствует SymbolInfoInteger() с идентификатором SYMBOL_SELECT.

SessionAW: соответствует SymbolInfoDouble() с идентификатором SYMBOL_SESSION_AW.

SessionBuyOrders: соответствует вызову функции SymbolInfoInteger() с идентификатором

SYMBOL_SESSION_BUY_ORDERS.

SessionBuyOrdersVolume: соответствует вызову функции SymbolInfoDouble() с идентификатором

SYMBOL_SESSION_BUY_ORDERS_VOLUME.

SessionClose: соответствует SymbolInfoDouble() с идентификатором SYMBOL_SESSION_CLOSE.

SessionDeals: соответствует SymbolInfoInteger() с идентификатором SYMBOL_SESSION_DEALS.

SessionInterest: соответствует SymbolInfoDouble() с идентификатором

SYMBOL_SESSION_INTEREST.

SessionOpen: соответствует SymbolInfoDouble() с идентификатором SYMBOL_SESSION_OPEN.

SessionPriceLimitMax: соответствует вызову функции SymbolInfoDouble() с идентификатором SYMBOL_SESSION_PRICE_LIMIT_MAX.

SessionPriceLimitMin: соответствует вызову функции SymbolInfoDouble() с идентификатором SYMBOL_SESSION_PRICE_LIMIT_MIN.

SessionPriceSettlement: соответствует вызову функции SymbolInfoDouble() с идентификатором SYMBOL_SESSION_PRICE_SETTLEMENT.

SessionSellOrders: соответствует вызову функции SymbolInfoInteger() с идентификатором SYMBOL_SESSION_SELL_ORDERS.

SessionSellOrdersVolume: соответствует вызову функции SymbolInfoDouble() с идентификатором SYMBOL_SESSION_SELL_ORDERS_VOLUME.

SessionTurnover: соответствует вызову функции SymbolInfoDouble() с идентификатором SYMBOL_SESSION_TURNOVER.

Spread: соответствует SymbolInfoInteger() с идентификатором SYMBOL_SPREAD.

SpreadFloat: соответствует SymbolInfoInteger() с идентификатором SYMBOL_SPREAD_FLOAT.

StartTime: соответствует SymbolInfoInteger() с идентификатором SYMBOL_START_TIME.

StopsLevel: соответствует SymbolInfoInteger() с идентификатором SYMBOL_TRADE_STOPS_LEVEL.

SwapLong: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_SWAP_LONG. Требует предварительного вызова метода Refresh().

SwapMode: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором ENUM_SYMBOL_SWAP_MODE. Требует предварительного вызова метода Refresh(). Тип возвращаемого значения – SYMBOL_SWAP_MODE. Варианты значений:

  • SYMBOL_SWAP_MODE_DISABLED – без свопа,
  • SYMBOL_SWAP_MODE_POINTS – своп в пунктах,
  • SYMBOL_SWAP_MODE_CURRENCY_SYMBOL – своп в базовой валюте,
  • SYMBOL_SWAP_MODE_CURRENCY_MARGIN – своп в валюте маржи,
  • SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT – своп в валюте депозита,
  • SYMBOL_SWAP_MODE_INTEREST_CURRENT – своп рассчитывается как ежегодный процент на основе текущей цены,
  • SYMBOL_SWAP_MODE_INTEREST_OPEN – своп рассчитывается как ежегодный процент на основе цены открытия,
  • SYMBOL_SWAP_MODE_REOPEN_CURRENT – своп начисляется путем переоткрытия позиции по цене закрытия,
  • SYMBOL_SWAP_MODE_REOPEN_BID – своп начисляется путем переоткрытия позиции по цене bid.

SwapModeDescription: возвращает расшифровку режима, получаемого методом SwapMode(). Требует предварительного вызова метода Refresh(). Варианты: «No swaps» (без свопа), «Swaps are calculated in points» (своп в пунктах), «Swaps are calculated in base currency» (своп в базовой валюте), «Swaps are calculated in margin currency» (своп в валюте маржи), «Swaps are calculated in deposit currency» (своп в валюте депозита), «Swaps are calculated as annual interest using the current price» (своп рассчитывается как ежегодный процент на основе текущей цены), «Swaps are calculated as annual interest using the open price» (своп рассчитывается как ежегодный процент на основе цены открытия), «Swaps are charged by reopening positions at the close price» (своп начисляется путем переоткрытия позиции по цене закрытия), «Swaps are charged by reopening positions at the Bid price» (своп начисляется путем переоткрытия позиции по цене bid), «Unknown swap mode» (неизвестный метод).

SwapRollover3days: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_SWAP_ROLLOVER3DAYS. Требует предварительного вызова метода Refresh(). Тип возвращаемого значения – ENUM_DAY_OF_WEEK. Варианты значений:

  • SUNDAY – воскресенье,
  • MONDAY – понедельник,
  • TUESDAY – вторник,
  • WEDNESDAY – среда,
  • THURSDAY – четверг,
  • FRIDAY – пятница,
  • SATURDAY – суббота.

SwapRollover3daysDescription: возвращает расшифровку значения, получаемого методом SwapRollover3days(). Требует предварительного вызова метода Refresh(). Варианты: «Sunday» (воскресенье), «Monday» (понедельник), «Tuesday» (вторник), «Wednesday» (среда), «Thursday» (четверг), «Friday» (пятница), «Saturday» (суббота), «Unknown» (неизвестный вариант).

SwapShort: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_SWAP_SHORT. Требует предварительного вызова метода Refresh().

TickSize: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_TRADE_TICK_SIZE. Требует предварительного вызова метода Refresh().

TickValue: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_TRADE_TICK_VALUE. Требует предварительного вызова метода Refresh().

TickValueLoss: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_TRADE_TICK_VALUE_LOSS. Требует предварительного вызова метода Refresh().

TickValueProfit: возвращает значение из внутреннего поля. Соответствует SymbolInfoDouble() с идентификатором SYMBOL_TRADE_TICK_VALUE_PROFIT. Требует предварительного вызова метода Refresh().

TicksBookDepth: соответствует SymbolInfoInteger() с идентификатором SYMBOL_TICKS_BOOKDEPTH.

Time: возвращает значение поля time структуры MqlTick. Требует предварительного вызова метода RefreshRates().

TradeCalcMode: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_TRADE_MODE. Требует предварительного вызова метода Refresh(). Тип возвращаемого значения – ENUM_SYMBOL_CALC_MODE. Варианты значений:

  • SYMBOL_CALC_MODE_FOREX – для форекс,
  • SYMBOL_CALC_MODE_CFD – для CFD,
  • SYMBOL_CALC_MODE_FUTURES – для фьючерсов,
  • SYMBOL_CALC_MODE_CFDINDEX – CFD на индексы,
  • SYMBOL_CALC_MODE_CFDLEVERAGE – CFD с плечом,
  • SYMBOL_CALC_MODE_EXCH_STOCKS – для ценных бумаг на бирже,
  • SYMBOL_CALC_MODE_EXCH_FUTURES – для фьючерсов на бирже,
  • SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS – для фьючерсов на FORTS.

TradeCalcModeDescription: возвращает расшифровку значения, возвращаемого методом TradeCalcMode(). Требует предварительного вызова метода Refresh(). Варианты: «Calculation of profit and margin for Forex» (для форекс), «Calculation of collateral and earnings for CFD» (для CFD), «Calculation of collateral and profits for futures» (для фьючерсов), «Calculation of collateral and earnings for CFD on indices» (CFD на индексы), «Calculation of collateral and earnings for the CFD when trading with leverage» (CFD с плечом), «Calculation for exchange stocks» (для ценных бумаг на бирже), «Calculation for exchange futures» (для фьючерсов на бирже), «Calculation for FORTS futures» (для фьючерсов на FORTS), «Unknown calculation mode» (неизвестный вариант).

TradeExecution: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_TRADE_CALC_MODE. Требует предварительного вызова метода Refresh(). Тип возвращаемого значения – ENUM_SYMBOL_CALC_MODE. Варианты значений:

  • SYMBOL_TRADE_EXECUTION_REQUEST – исполнение по запросу,
  • SYMBOL_TRADE_EXECUTION_INSTANT – исполнение по потоковым ценам,
  • SYMBOL_TRADE_EXECUTION_MARKET – исполнение по рыночным ценам,
  • SYMBOL_TRADE_EXECUTION_EXCHANGE – биржевое исполнение.

TradeExecutionDescription: возвращает расшифровку значения, возвращаемого методом TradeExecution(). Требует предварительного вызова метода Refresh(). Варианты: «Trading on request» (исполнение по запросу), «Trading on live streaming prices» (исполнение по потоковым ценам), «Execution of orders on the market» (исполнение по рыночным ценам), «Exchange execution» (биржевое исполнение), «Unknown trade execution» (неизвестный вариант).

TradeFillFlags: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_FILLING_MODE. Требует предварительного вызова метода Refresh().

TradeMode: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_TRADE_MODE. Требует предварительного вызова метода Refresh(). Тип возвращаемого значения – ENUM_SYMBOL_TRADE_MODE. Варианты значений:

  • SYMBOL_TRADE_MODE_DISABLED – торговля запрещена,
  • SYMBOL_TRADE_MODE_LONGONLY – разрешается только покупка,
  • SYMBOL_TRADE_MODE_SHORTONLY – разрешается только продажа,
  • SYMBOL_TRADE_MODE_CLOSEONLY – разрешается только закрытие,
  • SYMBOL_TRADE_MODE_FULL – все разрешено.

TradeModeDescription: возвращает расшифровку значения, возвращаемого методом TradeMode().

Требует предварительного вызова метода Refresh(). Варианты: «Disabled» (торговля запрещена), «Long only» (разрешается только покупка), «Short only» (разрешается только продажа), «Close only» (разрешается только закрытие), «Full access» (все разрешено), «Unknown trade mode» (неизвестный вариант).

TradeTimeFlags: возвращает значение из внутреннего поля. Соответствует SymbolInfoInteger() с идентификатором SYMBOL_EXPIRATION_MODE. Требует предварительного вызова метода Refresh().

Type: наследован от класса CObject.

Volume: возвращает значение поля volume структуры MqlTick. Требует предварительного вызова метода RefreshRates().

VolumeHigh: соответствует SymbolInfoInteger() с идентификатором SYMBOL_VOLUMEHIGH.

VolumeLow: соответствует SymbolInfoInteger() с идентификатором SYMBOL_VOLUMELOW.

~CSymbolInfo: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.
Примеры использования класса
Установка символа: s.Name(Symbol()); Получение спреда:

Alert("Spread=",s.Spread());

Обновление свойств символа и получение величины минимального стопуровня:

if(s.Refresh()){ Alert("StopLevel=",s.StopsLevel());
}

Обновление рыночных данных и получение текущих цен:

if(s.RefreshRates()){ Alert("Ask=",s.Ask(),", Bid=",s.Bid());
}

TerminalInfo

Файл: «Trade/TerminalInfo.mqh».

Имя класса: CTerminalInfo.

Назначение: получение данных о терминале и компьютере, вызов функций TerminalInfoInteger(), TerminalInfoString().

Методы класса: Build, CObject, CPUCores, CTerminalInfo, CodePage, CommonDataPath, Company, Compare, DataPath, DiskSpace, InfoInteger, InfoString, IsConnected, IsDLLsAllowed, IsEmailEnabled, IsFtpEnabled, IsTradeAllowed, IsX64, Language, Load, MaxBars, MemoryAvailable, MemoryPhysical, MemoryTotal, MemoryUsed, Name, Next, OpenCLSupport, Path, Prev, Save, Type, ~CObject, ~CTerminalInfo.

Подключение файла и создание объекта:

#include <Trade/TerminalInfo.mqh> CTerminalInfo ti;
Назначение методов
CTerminalInfo: конструктор класса. Не выполняет никаких действий.

CObject: конструктор базового класса CObject.

Build: соответствует TerminalInfoInteger() с идентификатором TERMINAL_BUILD. CPUCores: соответствует TerminalInfoInteger() с идентификатором TERMINAL_CPU_CORES. CodePage: соответствует TerminalInfoInteger() с идентификатором TERMINAL_CODEPAGE.

CommonDataPath: соответствует вызову функции TerminalInfoString() с идентификатором

TERMINAL_COMMONDATA_PATH.

Company: соответствует TerminalInfoString() с идентификатором TERMINAL_COMPANY.

Compare: наследован от класса CObject.

DataPath: соответствует TerminalInfoString() с идентификатором TERMINAL_DATA_PATH. DiskSpace: соответствует TerminalInfoInteger() с идентификатором TERMINAL_DISK_SPACE. InfoInteger: вызов функции TerminalInfoInteger(). Метод имеет один параметр – идентификатор. InfoString: вызов функции TerminalInfoString(). Метод имеет один параметр – идентификатор. IsConnected: соответствует TerminalInfoInteger() с идентификатором TERMINAL_CONNECTED.

IsDLLsAllowed: соответствует TerminalInfoInteger() с идентификатором TERMINAL_DLLS_ALLOWED.

IsEmailEnabled: соответствует TerminalInfoInteger() с идентификатором TERMINAL_EMAIL_ENABLED.

IsFtpEnabled: соответствует TERMINAL_FTP_ENABLED. TerminalInfoInteger() с идентификатором
IsTradeAllowed: соответствует вызову TERMINAL_TRADE_ALLOWED. функции TerminalInfoInteger() с идентификатором

IsX64: соответствует TerminalInfoInteger() с идентификатором TERMINAL_X64.

Language: соответствует TerminalInfoString() с идентификатором TERMINAL_LANGUAGE.

Load: наследован от класса CObject.

MaxBars: соответствует TerminalInfoInteger() с идентификатором TERMINAL_MAXBARS.

MemoryAvailable: соответствует вызову функции TerminalInfoInteger() с идентификатором TERMINAL_MEMORY_AVAILABLE.

MemoryPhysical: соответствует вызову функции TerminalInfoInteger() с идентификатором TERMINAL_MEMORY_PHYSICAL.

MemoryTotal: соответствует TerminalInfoInteger() с идентификатором TERMINAL_MEMORY_TOTAL.

MemoryUsed: соответствует TerminalInfoInteger() с идентификатором TERMINAL_MEMORY_USED.

Name: соответствует TerminalInfoString() с идентификатором TERMINAL_NAME.

Next: наследован от класса CObject.

OpenCLSupport: соответствует вызову функции TerminalInfoInteger() с идентификатором TERMINAL_OPENCL_SUPPORT.

Path: соответствует TerminalInfoString() с идентификатором TERMINAL_PATH.

Prev: наследован от класса CObject. Save: наследован от класса CObject. Type: наследован от класса CObject.

~CTerminalInfo: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.
Примеры использования класса
Проверка соединения:

if(ti.IsConnected()){ Alert("Есть соединение");
}
else{
Alert("Нет соединения");
}

Проверка разрешения использовать DLL:

if(ti.IsDLLsAllowed()){ Alert("Использование DLL разрешено");
}
else{
Alert("Использование DLL запрещено");
}

Получение пути к терминалу и папке данных:

Alert("Путь к терминалу: ",ti.Path()); Alert("Путь к папке данных: ",ti.DataPath());

Trade

Файл: «Trade/Trade.mqh».

Имя класса: CTrade.

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

Методы класса: Buy, BuyLimit, BuyStop, CObject, CTrade, CheckResult, CheckResultBalance, CheckResultComment, CheckResultEquity, CheckResultMargin, CheckResultMarginFree, CheckResultMarginLevel, CheckResultProfit, CheckResultRetcode, CheckResultRetcodeDescription, CheckVolume, Compare, FormatOrderPrice, FormatOrderStatus, FormatOrderType, FormatOrderTypeFilling, FormatOrderTypeTime, FormatPositionType, FormatRequest, FormatRequestResult, Load, LogLevel, Next, OrderCheck, OrderDelete, OrderModify, OrderOpen, OrderSend, PositionClose, PositionCloseBy, PositionClosePartial, PositionModify, PositionOpen, Prev, PrintRequest, PrintResult, Request, RequestAction, RequestActionDescription, RequestComment, RequestDeviation, RequestExpiration, RequestMagic, RequestOrder, RequestPosition,

RequestPositionBy, RequestPrice, RequestSL, RequestStopLimit, RequestSymbol, RequestTP, RequestType, RequestTypeDescription, RequestTypeFilling, RequestTypeFillingDescription, RequestTypeTime, RequestTypeTimeDescription, RequestVolume, Result, ResultAsk, ResultBid, ResultComment, ResultDeal, ResultOrder, ResultPrice, ResultRetcode, ResultRetcodeDescription, ResultRetcodeExternal, ResultVolume, Save, Sell, SellLimit, SellStop, SetAsyncMode, SetDeviationInPoints, SetExpertMagicNumber, SetMarginMode, SetTypeFilling, SetTypeFillingBySymbol, Type, ~CObject, ~CTrade.

Подключение файла и создание объекта:

#include <Trade/Trade.mqh> CTradeInfo t;
Назначение методов
CTrade: конструктор класса. Не выполняет никаких действий.

CObject: конструктор базового класса CObject.

Buy, Sell: Buy() – метод для открытия позиций на покупку, Sell() – на продажу. Если точнее, то отправка рыночного ордера на выполнение сделки на покупку. Метод имеет один обязательный параметр – лот, остальные параметры являются дополнительными: символ, цена открытия, цена стоплосса, цена тейкпрофита, комментарий.

BuyLimit, SellLimit, BuyStop, SellStop: BuyLimit() – установка отложенного лимитного ордера на покупку, SellLimit() – на продажу. BuyStop() – установка отложенного стоп-ордера на покупку, SellStop() – на продажу. Метод имеет два обязательных параметра: лот и цену установки, остальные параметры являются дополнительными: символ, стоплосс, тейкпрофит, тип по времени существования ордера, время истечения, комментарий.

CheckVolume: метод проверяет наличие свободных средств на счете и вызывает функцию OrderCheck(). В метод передаются параметры: символ, лот, цена, тип ордера (ORDER_TYPE_BUY или ORDER_TYPE_SELL). Метод возвращает величину лота, которую можно открыть в данных условиях. Однако в справочном руководстве к языку MQL5 данный метод отсутствует, это может означать, что метод является устаревшим или работа над ним не завершена, а потому он может работать неправильно.

CheckResult: метод для получения копии структуры MqlTradeCheckResult, заполняемой в результате выполнения метода CheckVolume(). В метод по ссылке передается один параметр – переменная типа MqlTradeCheckResult.

CheckResultBalance, CheckResultComment, CheckResultEquity, CheckResultMargin, CheckResultMarginFree, CheckResultMarginLevel, CheckResultProfit, CheckResultRetcode: методы возвращают значения отдельных полей структуры MqlTradeCheckResult, заполняемой в результате выполнения метода CheckVolume(). Методы возвращают следующие поля:

  • CheckResultBalance – balance (баланс счета после выполнения сделки),
  • CheckResultComment – comment (текстовая расшифровка кода возврата retcode),
  • CheckResultEquity – equity (эквити после выполнения сделки),
  • CheckResultMargin – margin (объем средств, необходимых для открытия позиции),
  • CheckResultMarginFree – margin_free (объем свободных средства счета),
  • CheckResultLevel – margin_level (уровень средств счета),
  • CheckResultProfit – profit – текущую прибыль на счете,
  • CheckResultRetcode – retcode (код возврата торгового сервера).

CheckResultRetcodeDescription: возвращает расшифровку кода ошибки из структуры MqlTradeCheckResult, заполняемой при вызове метода CheckVolume(). Работает с использованием метод FormatRequestResult().

FormatRequestResult: возвращает текстовую расшифровку поля retcode структуры MqlTradeResult, передаваемой в метод. Всего в метод передается три параметра: строковая переменная для возвращаемого значения (также эта строка возвращается из метода обычным образом), структура MqlTradeRequest с данными запроса, структура MqlTradeResult с результатами выполнения запроса. Структура MqlTradeRequest нужна для определения символа, на котором выполняется запрос, чтобы узнать количество знаков после запятой у котировок и отформатировать ценовые данные, добавляемые в расшифровку.

Compare: наследован от класса CObject.

FormatOrderPrice: возвращает отформатированную строку с ценой открытия, передаваемой в метод (или с двумя ценами для ордеров типа стоп-лимит). Параметры: строковая переменная для возвращаемого по ссылке результата (кроме того результат возвращается обычным образом), цена первого срабатывания, цена второго срабатывания, количество знаков для форматирования. Метод используется в методе FormatRequest().

FormatOrderStatus: нереализованный метод.

FormatOrderType: возвращает расшифровку типа ордера, передаваемого в метод. Параметры: строковая переменная для возвращаемого по ссылке результата (кроме того результат возвращается обычным образом), тип. Возвращаемые варианты: «buy» (рыночный на покупку), «sell» (рыночный на продажу), «buy limit» (лимитный на покупку), «sell limit» (лимитный на продажу), «buy stop» (стоп на покупку), «sell stop» (стоп на продажу), «buy stop limit» (стоп-лимит на покупку), «sell stop limit» (стоп-лимит на продажу). Метод используется в методе FormatRequest().

FormatOrderTypeFilling: возвращает расшифровку типа заполнения, передаваемого в метод. Параметры: строковая переменная для возвращаемого по ссылке результата (кроме того результат возвращается обычным образом), тип. Возвращаемые варианты: «return remainder» (для типа ORDER_FILLING_RETURN), «cancel remainder» (для типа ORDER_FILLING_IOC), «fill or kill» (для типа ORDER_FILLING_FOK). Метод используется в методе RequestTypeFillingDescription().

FormatOrderTypeTime: возвращает расшифровку типа ордера по времени существования, передаваемого в метод. Параметры: строковая переменная для возвращаемого по ссылке результата (кроме того результат возвращается обычным образом), тип. Возвращаемые варианты: «gtc» (для типа ORDER_TIME_GTC), «day» (для типа ORDER_TIME_DAY), «specified» (для типа ORDER_TIME_SPECIFIED), «specified day» (для типа ORDER_TIME_SPECIFIED_DAY). Метод используется в методе RequestTypeTimeDescription().

FormatPositionType: возвращает расшифровку типа позиции, передаваемого в метод. Параметры: строковая переменная для возвращаемого по ссылке результата (кроме того результат возвращается обычным образом), тип. Возвращаемые варианты: «buy» (покупка), «sell» (продажа).

FormatRequest: возвращает подробную текстовую расшифровку всех полей структуры MqlTradeRequest, передаваемой в метод. Всего в метод передается два параметра: строковая переменная для возвращаемого значения (также эта строка возвращается из метода обычным образом), структура MqlTradeRequest.

Load: наследован от класса CObject.

LogLevel: установка варианта вывода логов (сообщений, выводимых функцией Print() или

PrintFormat()). В метод передается один параметр. Варианты параметра:

  • LOG_LEVEL_NO – не выводить логи,
  • LOG_LEVEL_ERRORS – выводить только логи об ошибках
  • LOG_LEVEL_ALL – выводить все логи.

По умолчанию используется вариант LOG_LEVEL_ERRORS.

Next: наследован от класса CObject.

OrderCheck: вызывает функцию OrderCheck(), возвращает результат ее выполнения (true или false). Параметры: структура MqlTradeRequest, структура MqlTradeCheckResult. При работе этого метода заполнения каких-либо внутренних полей объекта не выполняется, используются только структуры, переданные в метод.

OrderDelete: удаление отложенного ордера по указанному тикету. В метод предается один параметр – тикет. При успешном удалении возвращает true, при ошибке – false.

OrderModify: модификация отложенного ордера. Параметры: тикет, цена открытия, цена стоплосса, цена тейкпрофита, тип по времени существования, время истечения, цена стоп-лимита. При успешном выполнении модификации возвращает true, при ошибке – false.

OrderOpen: установка отложенного ордера. Параметры: символ, тип ордера, лот, цена первого срабатывания стоп-лимита, цена открытия, цена стоплосса, цена тейкпрофита, тип по времени, время истечения, комментарий. Метод рекомендуется использовать для установки ордеров типа стоп-лимит. Для установки остальных отложенных ордеров существует соответствующие методы. При успешной установке ордера метод возвращает true, при ошибке – false.

OrderSend: вызывает функцию OrderSend() или OrderSendAsync(). По умолчанию вызывается функция OrderSend(). Для того чтобы вызывалась функция OrderSendAsync() необходимо включить асинхронный режим, это выполняется вызовом метода SetAsyncMode(). В асинхронном режиме не происходит ожидания ответа от сервера с результатом выполнения запроса. Сразу после выполнения запроса программа переходит к выполнению следующих действий. В метод передаются следующие параметры: структура MqlTradeRequest, структура MqlTradeResult. Метод возвращает true или false в зависимости от успешности его работы. Метод вызывается из других методов, вызывать его самостоятельно обычно нет необходимости.

PositionClose: выполняет закрытие позиции. Существует два варианты метода: для закрытия по символу и для закрытия по тикету. Параметры: символ или тикет, величина допустимого отклонения от запрошенной цены в пунктах (по умолчанию -1, что соответствует ULONG_MAX, то есть не ограничено). Метод возвращает true или false в зависимости от успешности его работы. Вариант закрытия по тикету используется на хеджинговых счетах. Вариант закрытия по символу является универсальным. На неттинговых счетах он закрывает позицию полностью, причем, если объем позиции превышает максимальный объем сделки, закрытие выполняется в несколько приемов. На хеджинговом счете выполняется закрытие первой по порядку позиции, заданного символа и магика.

PositionCloseBy: выполняет встречное закрытие позиции. Может применяться только на хеджинговых счетах. Параметры: тикет позции, тикет встречной позиции. Метод возвращает true или false в зависимости от успешности его работы.

PositionClosePartial: выполняет частичное закрытия позиции. Существует два варианты метода: для закрытия по символу и для закрытия по тикету. Оба метода работают только на хеджинговых счетах. Параметры: символ или тикет, закрываемый объем, величина допустимого отклонения от запрошенной цены в пунктах пунктах (по умолчанию -1, что соответствует ULONG_MAX, то есть не ограничено). Метод возвращает true или false в зависимости от успешности его работы. Вариант с закрытием по символу работает с первой по порядку позицией заданного символа и магика.

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

PositionOpen: выполняет открытие позиции. Параметры: символ, тип позиции), лот, цена открытия, цена стоплосса, цена тейкпрофита, комментарий.

Prev: наследован от класса CObject.

Request: получение копии структуры MqlTradeRequest, заполняемой при выполнении любого торгового запроса или при вызове метода CheckVolume(). В метод по ссылке передается один параметр – структура MqlTradeRequest.

RequestAction, RequestComment, RequestDeviation, RequestExpiration, RequestMagic, RequestOrder, RequestPosition, RequestPositionBy, RequestPrice, RequestSL, RequestStopLimit, RequestSymbol, RequestTP, RequestType, RequestTypeFilling, RequestTypeTime, RequestVolume: методы возвращают отдельные поля структуры MqlTradeRequest. Возвращаются следующие поля:

  • RequestAction – action,
  • RequestComment – comment,
  • RequestDeviation – deviation,
  • RequestExpiration – expiration,
  • RequestMagic – magic,
  • RequestOrder – order,
  • RequestPosition – position,
  • RequestPositionBy – position_by,
  • RequestPrice – price,
  • RequestSL – sl,
  • RequestStopLimit – stoplimit,
  • RequestSymbol,
  • RequestTP – tp,
  • RequestType – symbol,
  • RequestTypeFilling – type_filling,
  • RequestTypeTime – type_time,
  • RequestVolume – volume.

RequestActionDescription, RequestTypeDescription, RequestTypeFillingDescription, RequestTypeTimeDescription: методы возвращают результаты работы методов FormatRequest(), FormatOrderType(), FormatOrderTypeFilling(), FormatOrderTypeTime() (соответственно) для структуры MqlTradeRequest, заполненной при выполнении торгового запроса или вызове метода CheckVolume().

PrintRequest: при вызове этого метода выполняется форматирование данных структуры MqlTradeRequest методом FormatRequest(). Работает только в том случае, если методом LogLevel() установлен вывод всех логов:

Result: возвращает копию структуры MqlTradeResult, заполняемой при выполнении торгового запроса. В метод по ссылке передается один параметр – структура MqlTradeResult.

ResultAsk, ResultBid, ResultComment, ResultDeal, ResultOrder, ResultPrice, ResultRetcode, ResultRetcodeExternal, ResultVolume: методы возвращают отдельные поля структуры MqlTradeResult. Возвращаются следующие поля:

  • ResultAsk – ask,
  • ResultBid – bid,
  • ResultComment – comment,
  • ResultDeal – deal,
  • ResultOrder – order,
  • ResultPrice – price,
  • ResultRetcode – retcode,
  • ResultRetcodeExternal – retcode_external,
  • ResultVolume – volume.

ResultRetcodeDescription: возвращает результат работы метода FormatRequestResult для структур

MqlTradeRequest и MqlTradeResult, заполненных после последнего торгового запроса.

PrintResult: при вызове этого метода выполняется форматирование данных структуры MqlTradeResult методом FormatRequestResult() и вывод полученной строки по функцией PrintFormat().

Save: наследован от класса CObject.

SetAsyncMode: включение асинхронного режима. В метод предается один параметр: true – включение асинхронного режима, false – выключение.

SetDeviationInPoints: установка допустимого отклонения от запрошенной цены. В метод передается один параметр – величина допустимого отклонения в пунктах.

SetExpertMagicNumber: установка значения идентификатора «мэджик», которым будут помечаться все торговые действия.

SetMarginMode: установка во внутреннее поле объекта результата работы функции AccountInfoInteger() с идентификатором ACCOUNT_MARGIN_MODE. Данный метод автоматически вызывается из конструктора класса при создании объекта. Это необходимо для правильной работы следующих методов: PositionClose() – вариант с символом, PositionCloseBy(), PositionClosePartial() – оба варианта, FormatRequest().

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

SetTypeFillingBySymbol: установка тип заполнения соответственно символу, указываемому в параметрах метода.

Type: наследован от класса CObject.

~CTrade: деструктор класса. Не выполняет никаких действий.

~CObject: деструктор базового класса CObject.

Примечание

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

На первый взгляд данный класс может показаться очень сложным из-за обилия методов различного назначения. На самом деле пользоваться им достаточно просто. В первую очередь необходимо выделить специализированные методы для выполнения торговых действий: Buy(), Sell(), BuyLimit(), SellLimit(), BuyStop(), SellStop(), PositionClose(), PositionModify(), OrderDelete(), OrderModify(). Если возникнет необходимость работы с ордерами типа стоп-лимит, то используется метод OrderOpen(), в этом случае придется заполнять структуру запроса самостоятельно. В случае ошибки выполнения торгового действия, узнать подробности можно при помощи двух методов: ResultRetcode() – возвращает код ошибки и ResultRetcodeDescription() – возвращает расшифровку ошибки. Если открытие позиции (или установка ордера) выполнено успешно, бывает нужно узнать ее тикет, для этого используется метод ResultOrder().

Примеры использования класса Установка магика, выполняется один раз на запуске: t.SetExpertMagicNumber(123);Открытие позиции на покупку:

if(t.Buy(0.1)){
Alert("Открыта позиция ",t.RequestTypeDescription()," ",t.ResultVolume());
}
else{
Alert(" Ошибка ",t.ResultRetcode()," (",t.ResultRetcodeDescription(),")");
}

Закрытие позиции:

if(t.PositionClose(Symbol())){ Alert("Позиция закрыта");
}
else{
Alert("Ошибка закрытия позиции");
}

ArrayObj

Файл: «Arrays/ArrayObj.mqh».

Имя класса: CArrayObj.

Назначение: работа с массивом объектов: добавление и удаление элементов в массив, сортировка массива, поиск заданного элемента, добавление элемента в отсортированный массив и пр. Объекты, добавляемые в массив, могут относиться к разным классам, но все они должны быть производными от класса CObject. Если выражаться более точно, в массив добавляются не объекты, а ссылки на объекты.

Методы класса: Add, AddArray, AssignArray, At, Available, CArray, CArrayObj, CObject, Clear, Compare, CompareArray, CreateElement, Delete, DeleteRange, Detach, FreeMode, Insert, InsertArray, InsertSort, IsSorted, Load, Max, Maximum, Minimum, Next, Prev, Reserve, Resize, Save, Search, SearchFirst, SearchGreat, SearchGreatOrEqual, SearchLast, SearchLess, SearchLessOrEqual, Shift, Shutdown, Sort, SortMode, Step, Total, Type, Update, ~CArray, ~CArrayObj, ~CObject.

Подключение файла и создание объекта:

#include <Arrays/ArrayObj.mqh> CArrayObj a;
Назначение методов
Add: добавление нового элемента в массив. Метод имеет один параметр – ссылку на объект класса CObject. Добавление выполняется в конец массива.

AddArray: добавление в массив всех элементов другого объекта CArrayObj. Метод имеет один параметр – ссылку на объект класса CArrayObj. Добавление выполняется в конец массива.

AssignArray: копирования массива из другого объекта CArrayObj. Метод имеет один параметр – ссылку на объект класса CArrayObj.

At: возвращает указанный элемент массив, то есть ссылку на объект из указанного элемента массива. Метод имеет один параметр – индекс элемента.

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

CArray: конструктор базового класса CArray. Класс CArrayObj является производным от класса CArray, а класс CArray производным от класса CObject. В конструкторе CArray выполняется

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

CArrayObj: конструктор класса. При инициализации объекта в конструкторе выполняется включение режима освобождения массива. В дальнейшем управлять режимом освобождения можно посредством метода FreeMode(). Подробнее режим освобождения смотрите в описании методов Clear() и FreeMode().

CObject: конструктор базового класса CObject.

Clear: освобождение массива. При освобождении массива его реальный размер не меняется, а только меняется значение внутреннего поля, используемого для хранения размера, что положительно влияет на скорость работы объекта CArrayObj. Если включен режим освобождения, то дополнительно выполняется удаление объектов из «удаленных» элементов массива.

Compare: наследован от класса CObject.

CompareArray: метод для сравнения двух массивов. В метод передается один параметр – указатель на объект CArrayObj. Если оба массива идентичны, метода возвращает true. Чтобы этот метод работал, у класса объектов, добавляемых в массив, должен быть определен метод Compare().

CreateElement: виртуальный метод, не выполняет никаких действий.

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

DeleteRange: удаление заданного диапазона элементов из массива. Метод имеет два параметра: индекс первого элемента удаляемого диапазона и индекс последнего удаляемого элемента.

Detach: удаляет из массива указанный элемент. Удаляется только элемент массива со ссылкой на объект, сам объект не удаляется ни при каком режиме освобождения массива.

FreeMode: существует два перегруженных метода FreeMode(). Метод с параметром используется для включения или выключения режима освобождения. Если режим освобождения включен, то, при удалении элемента из массива, дополнительно выполняется удаление соответствующего объекта.

Insert: вставка элемента в массив в заданную позицию. Метод имеет два параметра: указатель на объект CObject и индекс элемента.

InsertArray: вставка другого массива объектов с заданной позиции. Метод имеет два параметра: указатель на объект CArrayObj и индекс, с которого должны располагаться элементы вставленного массива.

InsertSort: вставка нового элемента в отсортированный массив с учетом порядка сортировки. Чтобы метод работал, у класса добавляемого объекта должен быть определен метод Compare().

IsSorted: возвращает режим последней сортировки массива или -1, если массив не отсортирован.

Load: наследован от класса CObject.

Max: возвращает полный размер массива (количество занятых и зарезервированных элементов).

Maximum: наследован от класса CArray. К массиву объектов метод не применяется. Minimum: наследован от класса CArray. К массиву объектов метод не применяется. Next: наследован от класса CObject.

Prev: наследован от класса CObject.

Reserve: увеличивает размер массива так, чтобы было зарезервировано указанное количество элементов. Метод имеет один параметр – количество зарезервированных элементов.

Resize: изменяет размер массива. Метод имеет один параметр – размер массива. При увеличении массива происходит увеличение количества только зарезервированных элементов, количество занятых элементов не меняется. При уменьшении размера массива, могут быть удалены занятые элементы массива, при этом количество занятых элементов массива будет уменьшено. Если режим освобождения включен, то соответствующе объекты будут удалены.

Save: наследован от класса CObject.

Search, SearchFirst, SearchGreat, SearchGreatOrEqual, SearchLast, SearchLess, SearchLessOrEqual: методы для поиска в массиве заданных элементов. Чтобы эти метод работали, у класса добавляемого объекта должен быть определен метод Compare(), а массив должен быть отсортирован. Методы выполняют поиск со следующими особенностями:

Search – требуется точное совпадение условий сравнения,

SearchFirst – если в массиве есть несколько одинаковых элементов, то возвращается индекс первого элемента.

SearchGreat – поиск первого элемента, значение которого выше чем у искомого элемента,

SearchGreatOrEqual – поиск элемента, значение которого равно или выше чем у искомого элемента,

SearchLast – если в массиве есть несколько одинаковых элементов, то возвращается индекс последнего элемента.

SearchLess – поиск ближайшего элемента, значение которого нижем чем у искомого элемента,

SearchLessOrEqual – поиск элемента, значение которого равно или меньше чем у искомого элемента.

Shift: перемещение элемента по массиву. Метод имеет два параметра: индекс перемещаемого элемента, величина смещения. Например, если параметры равны 1, 1, то элемент с индексом 1 переместится на одну позиции, то есть займет элемент с индексом 2, а элемент с позиции 2 переместится на позицию 1. Значение второго параметра может быть отрицательным.

Shutdown: полная очистка массива. В отличие от метода Clear(), выполняется установка массиву нулевой длины. Если включен режим освобождения, все объекты, на которые указывали элементы массива, удаляются.

Sort: сортировка массива. Чтобы этот метод работал, у класса объектов, добавляемых в массив, должен быть определен метод Compare(). В метод передается один параметр, определяющий тип сортировки.

SortMode: возвращает режим с которым выполнялась последняя сортировка.

Step: существует два перегруженных метода Step(). Метод с параметром используется для установки шага масштабирования массива. По умолчанию масштабирование происходит с шагом 16. Метод без параметра возвращает величину шага.

Total: количество занятых элементов массива.

Type: наследован от класса CObject.

Update: присваивает заданному элементы массива новое значение (указатель на другой объект). Если включен режим освобождения, то выполняется удаление объекта, на который указывал изменяемый элемент.

~CArray: деструктор класса CArray. Ничего не выполняет.

~CArrayObj: деструктор класса. Из него выполняется вызов метода Shutdown().

~CObject: деструктор класса CObject. Ничего не выполняет.
Примеры использования класса ArrayObj
Допустим, есть некоторый класс:

class CX{
public:
int A; int B;
};

Необходимо обеспечить ему возможность работы с классом CArrayObj. Для этого надо указать, что класс является производным от класса CObject и определить в нем метод Compare():

class CX: public CObject{ public:
int A; int B;
int Compare(const CObject *node,const int mode=0) const { switch(mode){
case 1:
return (A-((CX*)node).A); break;
case 2:
return (((CX*)node).A-A); break;
case 3:
return(B-((CX*)node).B); break;
case 4:
return(((CX*)node).B-B); break;
}
return(0);

}
};

Сигнатура метода Compare() должна полностью соответствовать сигнатуре виртуального метода Compare() класса CObject, то есть он должен иметь два параметра: константный указатель на объект типа CObject и константная переменная типа int. Сам метод возвращает значение типа int и тоже является константным. Внутри метода выполняется сравнение значения какого-нибудь собственного поля со значением этого же поля в объекте, который передан в метод через параметры. В вышеприведенном участке кода выполняется не сравнение, а вычисляется разница значений, а по этой разнице функция сортировки будет определять, какой элемент больше, а какой меньше. В данном примере значение переменной mode определяет вариант сортировки: 1 – по полю A по возрастанию, 2 – по полю A по убыванию, 3 – по полю B по возрастанию, 4 – по полю B по убыванию.

Если объект класса CArrayObj уже использовался, очистим его:

a.Clear();

Добавляем в массив объекты, создавая их непосредственно при добавлении:

a.Add(new CX);
a.Add(new CX);
a.Add(new CX);

Установим значения полей всех объектов:

((CX*)a.At(0)).A=1;
((CX*)a.At(0)).B=6;

((CX*)a.At(1)).A=3;
((CX*)a.At(1)).B=5;

((CX*)a.At(2)).A=2;
((CX*)a.At(2)).B=4;

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

Alert(((CX*)a.At(0)).A," ",((CX*)a.At(0)).B);

Результат: «1 6».

Чтобы иметь возможность полностью проконтролировать содержимое массива, напишем функцию, преобразующую его содержимое в строку:

string CXArToStr(CArrayObj & ar){ string str="";
for(int i=0;i<ar.Total();i++){
str=str+(string)i+": "+(string)((CX*)ar.At(i)).A;
str=str+"-"+(string)((CX*)ar.At(i)).B+"; ";
}
return(str);
}

Посмотрим содержимое массива:

Alert(CXArToStr(a));

Результат: «0: 1-6; 1: 3-5; 2: 2-4;».

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

a.Sort(1);
Alert(CXArToStr(a));

Результат: «0: 1-6; 1: 2-4; 2: 3-5;» – элементы отсортированы по полю А по возрастанию. Используем второй вариант сортировки:

a.Sort(2);
Alert(CXArToStr(a));

Результат: «0: 3-5; 1: 2-4; 2: 1-6;» – элементы отсортированы по полю А по убыванию. Третий вариант сортировки:

a.Sort(3);
Alert(CXArToStr(a));

Результат: «0: 2-4; 1: 3-5; 2: 1-6;» – элементы отсортированы по полю B по возрастанию. Четвертый вариант сортировки:

a.Sort(4);

Alert(CXArToStr(a));

Результат: «0: 1-6; 1: 3-5; 2: 2-4;» – элементы отсортированы по полю B по убыванию.

Создадим еще один элемент класс CX и присвоим его полям значения:

CX * b = new CX(); b.A=2;
b.B=5;

Вставим его в массив так, чтобы массив оставался отсортированным:

a.InsertSort(b);

Alert(CXArToStr(a));

Результат: «0: 1-6; 1: 3-5; 2: 2-5; 3: 2-4;» – массив остается отсортированным по полю B по

убыванию.

Удалим второй элемент:

a.Delete(2);

Alert(CXArToStr(a));

Результат: «0: 1-6; 1: 3-5; 2: 2-4;» результат тот же, что и до вставки элемента b.

По завершению работы скрипта во вкладке «Эксперты» нет сообщений об утечке памяти – объекты, ссылки на которых располагались в массиве, были удалены при срабатывании деструктора объекта a. Объект b был удален при удалении одного элемента методом Delete().

Сортировка массива структур

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

Допустим, есть структура с двумя полями:

struct SMyStruct{ double A; double B;
};

Массив этих структур:

SMyStruct a[];

В функции OnStrat() изменим размер массива и присвоим полям значения:

ArrayResize(a,3); a[0].A=1;
a[0].B=6;

a[1].A=3;
a[1].B=5;

a[2].A=2;
a[2].B=4;

Для выполнения сортировки потребуется двухмерный массив, имеющий два элемента во втором измерении (массив объявлен на глобальном уровне):

double sia[][2];

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

int size=ArraySize(a);
ArrayResize(sia,size);

Заполним вспомогательный массив. Элементу с индексом 0 присваивается значения поля структуры, по которому выполняется сортировка, а элементу с индексом 1 присваивается значение индекса элемента в массиве структур:

for(int i=0;i<size;i++){ sia[i][0]=a[i].A; sia[i][1]=i;
}

Теперь остается воспользоваться функцией ArraySort():

ArraySort(sia);

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

Код сортировки расположим в функции:

void SortA(){
int size=ArraySize(a); ArrayResize(sia,size); for(int i=0;i<size;i++){
sia[i][0]=a[i].A; sia[i][1]=i;
}
ArraySort(sia);
}

В функции OnStart() вызываем функцию сортировки:

SortA();

Выведем массив структур в соответствии с порядком сортировки:

Alert("== A sorted ==="); for(int i=0;i<ArraySize(a);i++){
Alert(i,": ",a[(int)sia[i][1]].A,", ",a[(int)sia[i][1]].B);
}

Конечно, обращение к отсортированным таким образом данным несколько усложняется – вместо индекса i приходится подставлять вспомогательный массив (int)sia[i][1]. Но преимущество, получаемое за счет очень высокой скорости сортировки более значительно, чем данное неудобство. К тому же такой подход дает возможность одновременной сортировки по разным критериям.

Добавим сортировку по полю B. Объявляем вспомогательный массив:

double sib[][2];

Пишем еще одну функцию сортировки:

void SortB(){
int size=ArraySize(a); ArrayResize(sib,size); for(int i=0;i<size;i++){
sib[i][0]=a[i].B; sib[i][1]=i;
}
ArraySort(sib);
}

В функции OnStart() вызываем функцию сортировки и выводим результат.

SortB();

Alert("== B sorted ==="); for(int i=0;i<ArraySize(a);i++){
Alert(i,": ",a[(int)sib[i][1]].A,", ",a[(int)sib[i][1]].B);
}

Кроме функции ArraySort() к вспомогательным массивам можно применять функции

ArrayBsearch(), ArrayMaximum(), ArayMinimum().