//+------------------------------------------------------------------+
//|                                                       ToMQL4.mqh |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                         https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://www.mql5.com/ru/users/artmedia70"
#property strict
#ifdef __MQL4__
//+------------------------------------------------------------------+
//| Коды ошибок                                                      |
//+------------------------------------------------------------------+
#define ERR_SUCCESS                       (ERR_NO_ERROR)
#define ERR_MARKET_UNKNOWN_SYMBOL         (ERR_UNKNOWN_SYMBOL)
#define ERR_ZEROSIZE_ARRAY                (ERR_ARRAY_INVALID)
#define ERR_MAIL_SEND_FAILED              (ERR_SEND_MAIL_ERROR)
#define ERR_NOTIFICATION_SEND_FAILED      (ERR_NOTIFICATION_ERROR)
#define ERR_FTP_SEND_FAILED               (ERR_FTP_ERROR)
//+------------------------------------------------------------------+
//| Типы ордеров, политика исполнения, срок действия, причины        |
//+------------------------------------------------------------------+
#define ORDER_TYPE_CLOSE_BY               (8)
#define ORDER_TYPE_BUY_STOP_LIMIT         (9)
#define ORDER_TYPE_SELL_STOP_LIMIT        (10)
#define ORDER_REASON_EXPERT               (3)
#define ORDER_REASON_SL                   (4)
#define ORDER_REASON_TP                   (5)
#define ORDER_REASON_BALANCE              (6)
#define ORDER_REASON_CREDIT               (7)
//+------------------------------------------------------------------+
//| Флаги разрешенных режимов истечения ордера                       |
//+------------------------------------------------------------------+
#define SYMBOL_EXPIRATION_GTC             (1)
#define SYMBOL_EXPIRATION_DAY             (2)
#define SYMBOL_EXPIRATION_SPECIFIED       (4)
#define SYMBOL_EXPIRATION_SPECIFIED_DAY   (8)
//+------------------------------------------------------------------+
//| Флаги разрешенных режимов заливки ордера                         |
//+------------------------------------------------------------------+
#define SYMBOL_FILLING_FOK                (1)
#define SYMBOL_FILLING_IOC                (2)
//+------------------------------------------------------------------+
//| Флаги разрешенных типов ордера                                   |
//+------------------------------------------------------------------+
#define SYMBOL_ORDER_MARKET               (1)
#define SYMBOL_ORDER_LIMIT                (2)
#define SYMBOL_ORDER_STOP                 (4)
#define SYMBOL_ORDER_STOP_LIMIT           (8)
#define SYMBOL_ORDER_SL                   (16)
#define SYMBOL_ORDER_TP                   (32)
#define SYMBOL_ORDER_CLOSEBY              (64)
//+------------------------------------------------------------------+
//| Типы сделок MQL5                                                 |
//+------------------------------------------------------------------+
enum 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_SELL_CANCELED,
   DEAL_DIVIDEND,
   DEAL_DIVIDEND_FRANKED,
   DEAL_TAX
  };
//+------------------------------------------------------------------+
//| Способ изменения позиции                                         |
//+------------------------------------------------------------------+
enum ENUM_DEAL_ENTRY
  {
   DEAL_ENTRY_IN,
   DEAL_ENTRY_OUT,
   DEAL_ENTRY_INOUT,
   DEAL_ENTRY_OUT_BY
  };
//+------------------------------------------------------------------+
//| Направление открытой позиции                                     |
//+------------------------------------------------------------------+
enum ENUM_POSITION_TYPE
  {
   POSITION_TYPE_BUY,
   POSITION_TYPE_SELL
  };
//+------------------------------------------------------------------+
//| Состояние ордера                                                 |
//+------------------------------------------------------------------+
enum ENUM_ORDER_STATE
  {
   ORDER_STATE_STARTED,
   ORDER_STATE_PLACED,
   ORDER_STATE_CANCELED,
   ORDER_STATE_PARTIAL,
   ORDER_STATE_FILLED,
   ORDER_STATE_REJECTED,
   ORDER_STATE_EXPIRED,
   ORDER_STATE_REQUEST_ADD,
   ORDER_STATE_REQUEST_MODIFY,
   ORDER_STATE_REQUEST_CANCEL
  };
//+------------------------------------------------------------------+
//| Режим расчета маржи                                              |
//+------------------------------------------------------------------+
enum ENUM_ACCOUNT_MARGIN_MODE
  {
   ACCOUNT_MARGIN_MODE_RETAIL_NETTING,
   ACCOUNT_MARGIN_MODE_EXCHANGE,
   ACCOUNT_MARGIN_MODE_RETAIL_HEDGING
  };
//+------------------------------------------------------------------+
//| Цены, на основе которых строится график по символу               |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL_CHART_MODE
  {
   SYMBOL_CHART_MODE_BID,                          // Бары строятся по ценам Bid
   SYMBOL_CHART_MODE_LAST                          // Бары строятся по ценам Last
  };
//+------------------------------------------------------------------+
//| Срок действия отложенных ордеров и                               |
//| установленных уровней StopLoss/TakeProfit                        |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL_ORDER_GTC_MODE
  {
   SYMBOL_ORDERS_GTC,                              // Отложенные ордеры и уровни Stop Loss/Take Profit действительны неограниченно по времени до явной отмены
   SYMBOL_ORDERS_DAILY,                            // При смене торгового дня отложенные ордеры и все уровни StopLoss и TakeProfit удаляются
   SYMBOL_ORDERS_DAILY_EXCLUDING_STOPS             // При смене торгового дня удаляются только отложенные ордеры, уровни StopLoss и TakeProfit сохраняются
  };
//+------------------------------------------------------------------+
//| Типы опционов                                                    |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL_OPTION_MODE
  {
   SYMBOL_OPTION_MODE_EUROPEAN,                    // Европейский тип опциона – может быть погашен только в указанную дату
   SYMBOL_OPTION_MODE_AMERICAN                     // Американский тип опциона – может быть погашен в любой день до истечения срока опциона
  };
#define SYMBOL_OPTION_MODE_NONE     (2)            // Отсутствующий тип опциона - в MQL4 их нет
//+------------------------------------------------------------------+
//| Право, предоставляемое опционом                                  |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL_OPTION_RIGHT
  {
   SYMBOL_OPTION_RIGHT_CALL,                       // Опцион, дающий право купить актив по фиксированной цене
   SYMBOL_OPTION_RIGHT_PUT                         // Опцион, дающий право продать актив по фиксированной цене
  };
#define SYMBOL_OPTION_RIGHT_NONE    (2)            // Нет опциона - нет и права
//+------------------------------------------------------------------+
//| Способ вычисления величины залоговых средств по инструменту      |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL_CALC_MODE
  {
   SYMBOL_CALC_MODE_FOREX,                         // (MQL5 - 0, MQL4 - 0) Forex mode – расчет прибыли и маржи для Форекс
   SYMBOL_CALC_MODE_CFD,                           // (MQL5 - 3, MQL4 - 1) CFD mode – расчет залога и прибыли для CFD (контракт на разницу цен)
   SYMBOL_CALC_MODE_FUTURES,                       // (MQL5 - 2, MQL4 - 2) Futures mode – расчет залога и прибыли для фьючерсов
   SYMBOL_CALC_MODE_CFDINDEX,                      // (MQL5 - 4, MQL4 - 3) CFD index mode – расчет залога и прибыли для CFD на индексы
   SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE,             // (MQL5 - 1, MQL4 - N) Forex No Leverage mode – расчет прибыли и маржи для Форекс без учета плеча
   SYMBOL_CALC_MODE_CFDLEVERAGE,                   // CFD Leverage mode – расчет залога и прибыли для CFD при торговле с плечом
   SYMBOL_CALC_MODE_EXCH_STOCKS,                   // Exchange mode – расчет залога и прибыли для торговли ценными бумагами на бирже
   SYMBOL_CALC_MODE_EXCH_FUTURES,                  // Futures mode – расчет залога и прибыли для торговли фьючерсными контрактами на бирже
   SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS,            // FORTS Futures mode –  расчет залога и прибыли для торговли фьючерсными контрактами на FORTS
   SYMBOL_CALC_MODE_EXCH_BONDS,                    // Расчет прибыли и маржи по торговым облигациям на бирже
   SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX,              // Расчет прибыли и маржи при торговле ценными бумагами на MOEX
   SYMBOL_CALC_MODE_EXCH_BONDS_MOEX,               // Расчет прибыли и маржи по торговым облигациям на MOEX
   SYMBOL_CALC_MODE_SERV_COLLATERAL,               // Collateral mode - инструмент используется в качестве неторгуемого актива на торговом счете
   SYMBOL_CALC_MODE_EXCH_OPTIONS_MARGIN            // Опцион
  };  
//+------------------------------------------------------------------+
//| Способы начисления свопов при переносе позиции                   |
//+------------------------------------------------------------------+
enum ENUM_SYMBOL_SWAP_MODE
  {
   SYMBOL_SWAP_MODE_POINTS,                        // (MQL5 - 1, MQL4 - 0) Свопы начисляются в пунктах
   SYMBOL_SWAP_MODE_CURRENCY_SYMBOL,               // (MQL5 - 2, MQL4 - 1) Свопы начисляются в деньгах в базовой валюте символа
   SYMBOL_SWAP_MODE_INTEREST_OPEN,                 // (MQL5 - 6, MQL4 - 2) Свопы начисляются в годовых процентах от цены открытия позиции по символу
   SYMBOL_SWAP_MODE_CURRENCY_MARGIN,               // (MQL5 - 3, MQL4 - 3) Свопы начисляются в деньгах в маржинальной валюте символа
   SYMBOL_SWAP_MODE_DISABLED,                      // (MQL5 - 0, MQL4 - N) Нет свопов
   SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT,              // Свопы начисляются в деньгах в валюте депозита клиента
   SYMBOL_SWAP_MODE_INTEREST_CURRENT,              // Свопы начисляются в годовых процентах от цены инструмента на момент расчета свопа
   SYMBOL_SWAP_MODE_REOPEN_CURRENT,                // Свопы начисляются переоткрытием позиции по цене закрытия
   SYMBOL_SWAP_MODE_REOPEN_BID                     // Свопы начисляются переоткрытием позиции по текущей цене Bid
  };
//+------------------------------------------------------------------+
//| Типы торговых операций                                           |
//+------------------------------------------------------------------+
enum ENUM_TRADE_REQUEST_ACTIONS
  {
   TRADE_ACTION_DEAL,                              // Установить торговый ордер на немедленное совершение сделки с указанными параметрами (поставить рыночный ордер)
   TRADE_ACTION_PENDING,                           // Установить торговый ордер на совершение сделки при указанных условиях (отложенный ордер)
   TRADE_ACTION_SLTP,                              // Изменить значения Stop Loss и Take Profit у открытой позиции
   TRADE_ACTION_MODIFY,                            // Изменить параметры ранее установленного торгового ордера
   TRADE_ACTION_REMOVE,                            // Удалить ранее выставленный отложенный торговый ордер
   TRADE_ACTION_CLOSE_BY,                          // Закрыть позицию встречной 
  };
//+------------------------------------------------------------------+
//| Политики исполнения ордеров                                      |
//+------------------------------------------------------------------+
enum ENUM_ORDER_TYPE_FILLING
  {
   ORDER_FILLING_FOK,                              // Всё или ничего
   ORDER_FILLING_IOC,                              // Всё или частично (остаток удаляется)
   ORDER_FILLING_RETURN                            //  Всё или частично (остаток не удаляется) 
  };
//+------------------------------------------------------------------+
//| Срок действия ордера                                             |
//+------------------------------------------------------------------+
enum ENUM_ORDER_TYPE_TIME
  {
   ORDER_TIME_GTC,                                 // Ордер будет находится в очереди до тех пор, пока не будет снят
   ORDER_TIME_DAY,                                 // Ордер будет действовать только в течение текущего торгового дня
   ORDER_TIME_SPECIFIED,                           // Ордер будет действовать до даты истечения
   ORDER_TIME_SPECIFIED_DAY,                       // Ордер будет действовать до 23:59:59 указанного дня
  };
//+------------------------------------------------------------------+
//| Целочисленные свойства выбранной позиции                         |
//+------------------------------------------------------------------+
enum ENUM_POSITION_PROPERTY_INTEGER
  {
   POSITION_TICKET,                                // Тикет позиции
   POSITION_TIME,                                  // Время открытия позиции
   POSITION_TIME_MSC,                              // Время открытия позиции в миллисекундах с 01.01.1970 
   POSITION_TIME_UPDATE,                           // Время изменения позиции в секундах с 01.01.1970
   POSITION_TIME_UPDATE_MSC,                       // Время изменения позиции в миллисекундах с 01.01.1970
   POSITION_TYPE,                                  // Тип позиции
   POSITION_MAGIC,                                 // Magic number для позиции 
   POSITION_IDENTIFIER,                            // Идентификатор позиции 
   POSITION_REASON,                                // Причина открытия позиции
  };
//+------------------------------------------------------------------+
//| Вещественные свойства выбранной позиции                          |
//+------------------------------------------------------------------+
enum ENUM_POSITION_PROPERTY_DOUBLE
  {
   POSITION_VOLUME,                                // Объем позиции
   POSITION_PRICE_OPEN,                            // Цена позиции
   POSITION_SL,                                    // Уровень Stop Loss для открытой позиции
   POSITION_TP,                                    // Уровень Take Profit для открытой позиции
   POSITION_PRICE_CURRENT,                         // Текущая цена по символу
   POSITION_SWAP,                                  // Накопленный своп
   POSITION_PROFIT,                                // Текущая прибыль
  };
//+------------------------------------------------------------------+
//| Строковые свойства выбранной позиции                             |
//+------------------------------------------------------------------+
enum ENUM_POSITION_PROPERTY_STRING
  {
   POSITION_SYMBOL,                                // Символ, по которому открыта позиция
   POSITION_COMMENT,                               // Комментарий к позиции
   POSITION_EXTERNAL_ID,                           // Идентификатор позиции во внешней системе (на бирже)
  };
//+------------------------------------------------------------------+
//| Структура торгового запроса                                      |
//+------------------------------------------------------------------+
struct MqlTradeRequest 
  { 
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия 
   ulong                         magic;            // Штамп эксперта (идентификатор magic number) 
   ulong                         order;            // Тикет ордера 
   string                        symbol;           // Имя торгового инструмента 
   double                        volume;           // Запрашиваемый объем сделки в лотах 
   double                        price;            // Цена  
   double                        stoplimit;        // Уровень StopLimit ордера 
   double                        sl;               // Уровень Stop Loss ордера 
   double                        tp;               // Уровень Take Profit ордера 
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены 
   ENUM_ORDER_TYPE               type;             // Тип ордера 
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению 
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия 
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) 
   string                        comment;          // Комментарий к ордеру 
   ulong                         position;         // Тикет позиции 
   ulong                         position_by;      // Тикет встречной позиции 
  };
//+------------------------------------------------------------------+
//| Структура результата торгового запроса                           |
//+------------------------------------------------------------------+
struct MqlTradeResult 
  { 
   uint     retcode;                               // Код результата операции 
   ulong    deal;                                  // Тикет сделки, если она совершена 
   ulong    order;                                 // Тикет ордера, если он выставлен 
   double   volume;                                // Объем сделки, подтверждённый брокером 
   double   price;                                 // Цена в сделке, подтверждённая брокером 
   double   bid;                                   // Текущая рыночная цена предложения (цены реквота) 
   double   ask;                                   // Текущая рыночная цена спроса (цены реквота) 
   string   comment;                               // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера) 
   uint     request_id;                            // Идентификатор запроса, устанавливается терминалом при отправке  
   uint     retcode_external;                      // Код ответа внешней торговой системы 
  };
//+------------------------------------------------------------------+
//| Выбор позиции по тикету                                          |
//+------------------------------------------------------------------+
bool PositionSelectByTicket(ulong ticket)
  {
   return ::OrderSelect((int)ticket,SELECT_BY_TICKET);
  }
//+------------------------------------------------------------------+
//| Возвращает запрошенное целочисленное свойство выбранной позиции  |
//+------------------------------------------------------------------+
long PositionGetInteger(ENUM_POSITION_PROPERTY_INTEGER property)
  {
   return
     (
      property==POSITION_TICKET           ?  ::OrderTicket()      :  // Тикет позиции
      property==POSITION_TIME             ?  ::OrderOpenTime()    :  // Время открытия позиции
      property==POSITION_TIME_MSC         ?  ::OrderOpenTime()    :  // Время открытия позиции в миллисекундах с 01.01.1970  (аналог - время открытия)
      property==POSITION_TIME_UPDATE      ?  ::OrderOpenTime()    :  // Время изменения позиции в секундах с 01.01.1970      (аналог с большой натяжкой - время открытия)
      property==POSITION_TIME_UPDATE_MSC  ?  ::OrderOpenTime()    :  // Время изменения позиции в миллисекундах с 01.01.1970 (аналог с большой натяжкой - время открытия)
      property==POSITION_TYPE             ?  ::OrderType()        :  // Тип позиции
      property==POSITION_MAGIC            ?  ::OrderMagicNumber() :  // Magic number для позиции 
      property==POSITION_IDENTIFIER       ?  ::OrderTicket()      :  // Идентификатор позиции (аналог - тикет)
      WRONG_VALUE                                                    // POSITION_REASON Причина открытия позиции (аналогов нет в MQL4)
     );
  }
//+------------------------------------------------------------------+
//| Возвращает запрошенное вещественное свойство выбранной позиции   |
//+------------------------------------------------------------------+
double PositionGetDouble(ENUM_POSITION_PROPERTY_DOUBLE property)
  {
   return
     (
      property==POSITION_VOLUME           ?  ::OrderLots()        :  // Объем позиции
      property==POSITION_PRICE_OPEN       ?  ::OrderOpenPrice()   :  // Цена позиции
      property==POSITION_SL               ?  ::OrderStopLoss()    :  // Уровень Stop Loss для открытой позиции
      property==POSITION_TP               ?  ::OrderTakeProfit()  :  // Уровень Take Profit для открытой позиции
      property==POSITION_SWAP             ?  ::OrderSwap()        :  // Накопленный своп
      property==POSITION_PROFIT           ?  ::OrderProfit()      :  // Текущая прибыль
      WRONG_VALUE                                                    // POSITION_PRICE_CURRENT Текущая цена по символу (аналогов нет в MQL4)
     );
  }
//+------------------------------------------------------------------+
//| Возвращает запрошенное строковое свойство выбранной позиции      |
//+------------------------------------------------------------------+
string PositionGetString(ENUM_POSITION_PROPERTY_STRING property)
  {
   return
     (
      property==POSITION_SYMBOL           ?  OrderSymbol()        :  // Символ, по которому открыта позиция
      property==POSITION_COMMENT          ?  OrderComment()       :  // Комментарий к позиции
      NULL                                                           // POSITION_EXTERNAL_ID Идентификатор позиции во внешней системе (на бирже) (аналогов нет в MQL4)
     );
  }
//+------------------------------------------------------------------+
#endif 
