English
preview
Создание Python-классов для торговли в MetaTrader 5, аналогичных представленным в MQL5

Создание Python-классов для торговли в MetaTrader 5, аналогичных представленным в MQL5

MetaTrader 5Торговые системы |
397 2
Omega J Msigwa
Omega J Msigwa

Содержание


Введение

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

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

Без класса CTrade

void OnStart()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   
   MqlTick ticks;
   SymbolInfoTick(Symbol(), ticks);
   
//--- setting a trade request
   
   ZeroMemory(request);
   request.action   =TRADE_ACTION_DEAL;
   request.symbol   =Symbol();
   request.magic    =2025;
   request.volume   =0.01;
   request.type     =ORDER_TYPE_BUY;
   request.price    =ticks.ask;
   request.sl       =0;
   request.tp       =0;
   request.deviation   = 10;  // Max price slippage in points
   request.magic       = 2025;
   request.comment     = "Buy Order";
   request.type_filling= ORDER_FILLING_IOC;   // or ORDER_FILLING_IOC, ORDER_FILLING_RETURN
   request.type_time   = ORDER_TIME_GTC;      // Good till canceled
   
//--- action and return the result

   if(!OrderSend(request, result))
    {
      Print("OrderSend failed retcode: ", result.retcode);
    }
  }

С классом CTrade

#include <Trade\Trade.mqh>
CTrade m_trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    MqlTick ticks;
    SymbolInfoTick(Symbol(), ticks);
    
    m_trade.SetTypeFillingBySymbol(Symbol());
    m_trade.SetExpertMagicNumber(2025);
    m_trade.SetDeviationInPoints(10); //Slippage 
    
    m_trade.Buy(0.01, Symbol(), ticks.ask,0,0,"Buy Order");
  }

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

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

Существует Python-пакет, известный как Metatrader 5, который предоставляет Python-разработчикам доступ к платформе, возможность получать почти всю информацию от платформы (символы, открытые позиции и т.д.), а также отправлять некоторые команды на открытие, изменение, удаление сделок и т.д. Он предлагает функционал, аналогичный представленному в языке программирования MQL5.

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

По аналогии с кодом из первого примера, чтобы написать простую программу на языке Python, вам потребуется написать больше строчек кода, и что еще хуже, данный пакет MetaTrader5 Python не очень хорошо взаимодействует с большинством интегрированных сред разработки (IDE), таких как Visual Studio Code, а следовательно вы не сможете воспользоваться функцией автодополнения кода Intellisense, которая может быть крайне полезной.

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

В данной статье мы реализуем торговые классы на языке Python поверх пакета MetaTrader 5, которые помогут нам писать программы на Python столь же эффективно, сколь и на MQL5.


Класс CAccountInfo

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


Торговый класс CAccountInfo на Python

Торговый класс CAccountInfo, встроенный в MQL5 Описание

Свойства типов Integer и String
 
   
login()
 Login Получает номер счета.
trade_mode()
 TradeMode Получает режим торговли.
trade_mode_description()
 TradeModeDescription Получает режим торговли в виде строки.
leverage()
 Leverage Получает размер заданного плеча.
stopout_mode()
 StopoutMode Получает режим настройки Stop Out.
stopout_mode_description()
 StopoutModeDescription Получает режим настройки Stop Out в виде строки.
margin_mode()
 MarginMode Получает режим расчета маржи.
margin_mode_description()
 MarginModeDescription Получает режим расчета маржи в виде строки.
trade_allowed()
 TradeAllowed Получает флаг разрешения торговли.
trade_expert()
 TradeExpert Получает флаг автоматического разрешения торговли.
limit_orders()
 LimitOrders Получает максимально разрешенное количество отложенных ордеров.

Свойства типа Double

   
balance()
 Balance Получает баланс счета MetaTrader 5.
credit()
 Credit Получает сумму предоставленного кредита.
profit()
 Profit Получает текущую сумму прибыли на счете.
equity()
 Equity Получает текущую сумму собственных средств на счете.
margin()
 Margin Получает сумму зарезервированной маржи. 
free_margin()
 FreeMargin Получает сумму свободной маржи. 
margin_level()
 MarginLevel Получает уровень маржи. 
margin_call()
 MarginCall Получает уровень маржи для депозита.
margin_stopout()
 MarginStopOut Получает уровень маржи, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out).

Свойства типа Text 

   
name()
 Name Получает имя счета.
server()
 Server Получает имя торгового сервера.
company()
 Company Получает наименование компании, которая обслуживает счет.
currency() 
 Currency Получает название валюты депозита.

Дополнительные методы 

   
margin_check(self, symbol, order_type, volume, price) 
 MarginCheck Получает сумму маржи, требуемой для проведения торговой операции.
free_margin_check(self, symbol, order_type, volume, price)
 FreeMarginCheck Получает сумму свободной маржи, оставшейся после проведения торговой операции.
order_profit_check(self, symbol, order_type, volume, price_open, price_close)
 OrderProfitCheck Получает оцененную прибыль на основе переданных параметров.
max_lot_check(self, symbol, order_type, price, percent=100
 MaxLotCheck Получает максимально возможный объем торговой операции.

Пример использования

import MetaTrader5 as mt5
from Trade.AccountInfo import CAccountInfo

if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()

acc = CAccountInfo()

print(f"""
Account Information
-------------------
Login: {acc.login()}
Name: {acc.name()}
Server: {acc.server()}
Company: {acc.company()}
Currency: {acc.currency()}
Trade Mode: {acc.trade_mode()} ({acc.trade_mode_description()})
Leverage: {acc.leverage()}
Stopout Mode: {acc.stopout_mode()} ({acc.stopout_mode_description()})
Margin Mode: {acc.margin_mode()} ({acc.margin_mode_description()})
Trade Allowed: {acc.trade_allowed()}
Trade Expert: {acc.trade_expert()}
Limit Orders: {acc.limit_orders()}
-------------------
Balance: {acc.balance()}
Credit: {acc.credit()}
Profit: {acc.profit()}
Equity: {acc.equity()}
Margin: {acc.margin()}
Free Margin: {acc.free_margin()}
Margin Level: {acc.margin_level()}
Margin Call: {acc.margin_call()}
Margin StopOut: {acc.margin_stopout()}
-------------------
""")

mt5.shutdown()

Вывод

Account Information
-------------------
Login: 61346344
Name: John Doe      
Server: MetaQuotes-Demo
Company: MetaQuotes Software Corp
Currency: USD
Trade Mode: 0 (Demo)
Leverage: 400
Stopout Mode: 0 (Percent)
Margin Mode: 2 (Retail Hedging)   
Trade Allowed: True
Trade Expert: True
Limit Orders: 500
-------------------
Balance: 928.42
Credit: 0.0
Profit: -2.21
Equity: 926.21
Margin: 2.81
Free Margin: 923.4
Margin Level: 32961.20996441281
Margin Call: 90.0
Margin StopOut: 20.0
-------------------


Класс CSymbolInfo

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


Класс CSymbolInfo на Python

Класс CSymbolInfo, встроенный в MQL5  Описание

Управление
 
   
refresh()
 Refresh Обновляет данные символа.
refresh_rates()
 RefreshRates Обновляет котировки символа. 

Свойства
 
   
name() 
 Name Получает имя символа. 
select(self, select=True)
 Select Добавляет символ в окно "Обзор рынка" или удаляет из него.
is_synchronized()
 IsSynchronized Проверяет, синхронизирован ли символ с сервером.
 
Объемы

   
volume()
 Volume Получает объем последней сделки.
volume_high()
 VolumeHigh Получает максимальный объем за день.
volume_low()
 VolumeLow Получает минимальный объем за день.

Прочие 

   
time()
 Time Получает время последней котировки.
spread()
 Spread Получает размер спреда (в пунктах).
spread_float()
 SpreadFloat Получает флаг плавающего спреда.
ticks_book_depth()
 TicksBookDepth Получает глубину хранения тиков.

Уровни 

   
stops_level()
 StopsLevel Получает минимальный отступ для ордеров (в пунктах).
freeze_level()
 FreezeLevel Получает расстояние заморозки торговых операций (в пунктах).

Цены спроса (Bid) 

   
bid()
 Bid Получает текущую цену Bid.
bid_high()
 BidHigh Получает максимальную цену Bid за день.
bid_low()
 BidLow Получает минимальную цену Bid за день.

Цены предложения (Ask)

   
ask()
 Ask Получает текущую цену Ask. 
ask_high()
 AskHigh Получает максимальную цену Ask за день. 
ask_low()
 AskLow Получает минимальную цену Ask за день. 

Цены
 

   
last()
 Last Возвращает текущую последнюю цену. 
last_high() 
 LastHigh Возвращает максимальную последнюю цену за день. 
last_low()
 LastLow Возвращает минимальную последнюю цену за день. 
 
Режимы торговли

   
trade_calc_mode()
 TradeCalcMode Получает режим расчета стоимости контрактов в целочисленном формате. 
trade_calc_mode_description()
 TradeCalcModeDescription Получает режим расчета стоимости контрактов в строковом формате. 
trade_mode()
 TradeMode Получает тип исполнения ордеров в целочисленном формате. 
trade_mode_description() 
 TradeModeDescription Получает тип исполнения ордеров в строковом формате. 
trade_execution()
 TradeExecution Получает режим заключения сделок в целочисленном формате. 
trade_execution_description()
 TradeExecutionDescription Получает режим заключения сделок в строковом формате. 

Свопы 

   
swap_mode() 
 SwapMode Получает режим расчета свопа в целочисленном формате.
swap_mode_description()
 SwapModeDescription Получает режим расчета свопа в строковом формате.
swap_rollover_3days()
 SwapRollover3days Получает день начисления тройного свопа в виде целого числа.
swap_rollover_3days_description()
 SwapRollover3daysDescription Получает день начисления тройного свопа в виде строки. 

Маржа

   
margin_initial()
 MarginInitial Получает уровень начальной маржи. 
margin_maintenance()
 MarginMaintenance Получает значение поддерживающей маржи. 
margin_hedged()
  Возвращает значение хеджированной маржи для указанного символа. 
margin_hedged_use_leg()
  Возвращает булево значение, которое сообщает, применяется ли хеджированная маржа к каждой стороне позиции по отдельности.

Информация о тиках 

   
digits() 
 Digits Получает количество цифр после точки. 
point()
 Point Получает значение одного пункта. 
tick_value()
 TickValue Получает значение тика (минимального изменения цены). 
tick_value_profit()
 TickValueProfit Получает рассчитанную стоимость тика для прибыльной позиции. 
tick_value_loss()
 TickValueLoss Получает рассчитанную стоимость тика для убыточной позиции. 
tick_size()
 TickSize Получает минимальное изменение цены.

Размеры контрактов 

   
contract_size()
 ContractSize Получает сумму торгового контракта. 
lots_min()
 LotsMin Получает минимальный объем для закрытия сделки. 
lots_max()
 LotsMax Получает максимальный объем для закрытия сделки. 
lots_step()
 LotsStep Получает минимальный шаг изменения объема для закрытия сделки. 
lots_limit()
 LotsLimit Получает максимально допустимый объем открытой позиции и отложенных ордеров в любом направлении на одном символе. 

Размеры свопов 

   
swap_long()
 SwapLong Получает значение свопа по длинной позиции. 
swap_short()
 SwapShort Получает значение свопа по короткой позиции. 

Информация о символе/валюте
 

   
currency_base()
 CurrencyBase Получает имя базовой валюты символа. 
currency_profit() 
 CurrencyProfit Получает имя валюты прибыли.
currency_margin()
 CurrencyMargin Получает имя валюты маржи. 
bank()
 Bank Получает имя текущего источника котировок. 
description()
 Description Получает строковое описание символа. 
path()
 Path Получает путь в дереве символов. 
page()
  Адрес веб-страницы, содержащей информацию о символе. 

Информация о сессии 

   
session_deals()
 SessionDeals Получает количество сделок в текущей сессии.
session_buy_orders() 
 SessionBuyOrders Получает количество ордеров на покупку на текущий момент.
session_sell_orders()
 SessionSellOrders Получает количество ордеров на продажу на текущий момент.
session_turnover() 
 SessionTurnover Получает суммарный оборот за текущую сессию.
session_interest()
 SessionInterest Получает суммарный объём открытых позиций за текущую сессию.
session_buy_orders_volume()
 SessionBuyOrdersVolume Получает объём ордеров на покупку.
session_sell_orders_volume()
 SessionSellOrdersVolume Получает объём ордеров на продажу.
session_open()
 SessionOpen Получает цену открытия текущей сессии.
session_close()
 SessionClose Получает цену закрытия текущей сессии.
session_aw()
 SessionAW Получает средневзвешенную цену за текущую сессию.
session_price_settlement() 
 SessionPriceSettlement Получает цену поставки за текущую сессию.
session_price_limit_min() 
 SessionPriceLimitMin Получает минимальную цену за текущую сессию.
session_price_limit_max()
 SessionPriceLimitMax Получает максимальную цену за текущую сессию.

Это лишь некоторые из методов данного Python-класса (см. полный перечень в файле SymbolInfo.py).

Пример использования

import MetaTrader5 as mt5
from Trade.SymbolInfo import CSymbolInfo


if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()
      
m_symbol = CSymbolInfo("EURUSD")

print(f"""
Symbol Information
---------------------
Name: {m_symbol.name()}
Selected: {m_symbol.select()}
Synchronized: {m_symbol.is_synchronized()}

--- Volumes ---
Volume: {m_symbol.volume()}
Volume High: {m_symbol.volume_high()}
Volume Low: {m_symbol.volume_low()}

--- Time & Spread ---
Time: {m_symbol.time()}
Spread: {m_symbol.spread()}
Spread Float: {m_symbol.spread_float()}
Ticks Book Depth: {m_symbol.ticks_book_depth()}

--- Trade Levels ---
Stops Level: {m_symbol.stops_level()}
Freeze Level: {m_symbol.freeze_level()}

--- Bid Parameters ---
Bid: {m_symbol.bid()}
Bid High: {m_symbol.bid_high()}
Bid Low: {m_symbol.bid_low()}

--- Ask Parameters ---
Ask: {m_symbol.ask()}
Ask High: {m_symbol.ask_high()}
Ask Low: {m_symbol.ask_low()}

--- Last Parameters ---
Last: {m_symbol.last()}
Last High: {m_symbol.last_high()}
Last Low: {m_symbol.last_low()}

--- Order & Trade Modes ---
Trade Calc Mode: {m_symbol.trade_calc_mode()} ({m_symbol.trade_calc_mode_description()})
Trade Mode: {m_symbol.trade_mode()} ({m_symbol.trade_mode_description()})
Trade Execution Mode: {m_symbol.trade_execution()}  ({m_symbol.trade_execution_description()})

--- Swap Terms ---
Swap Mode: {m_symbol.swap_mode()} ({m_symbol.swap_mode_description()})
Swap Rollover 3 Days: {m_symbol.swap_rollover_3days()} ({m_symbol.swap_rollover_3days_description()})

--- Futures Dates ---
Start Time: {m_symbol.start_time()}
Expiration Time: {m_symbol.expiration_time()}

--- Margin Parameters ---
Initial Margin: {m_symbol.margin_initial()}
Maintenance Margin: {m_symbol.margin_maintenance()}
Hedged Margin: {m_symbol.margin_hedged()}
Hedged Margin Use Leg: {m_symbol.margin_hedged_use_leg()}

--- Tick Info ---

Digits: {m_symbol.digits()}
Point: {m_symbol.point()}
Tick Value: {m_symbol.tick_value()}
Tick Value Profit: {m_symbol.tick_value_profit()}
Tick Value Loss: {m_symbol.tick_value_loss()}
Tick Size: {m_symbol.tick_size()}

--- Contracts sizes---
Contract Size: {m_symbol.contract_size()}
Lots Min: {m_symbol.lots_min()}
Lots Max: {m_symbol.lots_max()}
Lots Step: {m_symbol.lots_step()}
Lots Limit: {m_symbol.lots_limit()}

--- Swap sizes 

Swap Long: {m_symbol.swap_long()}
Swap Short: {m_symbol.swap_short()}

--- Currency Info ---
Currency Base: {m_symbol.currency_base()}
Currency Profit: {m_symbol.currency_profit()}
Currency Margin: {m_symbol.currency_margin()}
Bank: {m_symbol.bank()}
Description: {m_symbol.description()}
Path: {m_symbol.path()}
Page: {m_symbol.page()}

--- Session Info ---
Session Deals: {m_symbol.session_deals()}
Session Buy Orders: {m_symbol.session_buy_orders()}
Session Sell Orders: {m_symbol.session_sell_orders()}
Session Turnover: {m_symbol.session_turnover()}
Session Interest: {m_symbol.session_interest()}
Session Buy Volume: {m_symbol.session_buy_orders_volume()}
Session Sell Volume: {m_symbol.session_sell_orders_volume()}
Session Open: {m_symbol.session_open()}
Session Close: {m_symbol.session_close()}
Session AW: {m_symbol.session_aw()}
Session Price Settlement: {m_symbol.session_price_settlement()}
Session Price Limit Min: {m_symbol.session_price_limit_min()}
Session Price Limit Max: {m_symbol.session_price_limit_max()}
---------------------
""")

mt5.shutdown()

Вывод

Symbol Information       
---------------------    
Name: EURUSD
Selected: True
Synchronized: True       

--- Volumes ---
Volume: 0
Volume High: 0
Volume Low: 0

--- Time & Spread ---    
Time: 2025-05-21 20:30:36
Spread: 0
Spread Float: True       
Ticks Book Depth: 0      

--- Trade Levels ---     
Stops Level: 0
Freeze Level: 0

--- Bid Parameters ---
Bid: 1.1335600000000001
Bid High: 1.13623
Bid Low: 1.12784

--- Ask Parameters ---
Ask: 1.1335600000000001
Ask High: 1.13623
Ask Low: 1.12805

--- Last Parameters ---
Last: 0.0
Last High: 0.0
Last Low: 0.0

--- Order & Trade Modes ---
Trade Calc Mode: 0 (Calculation of profit and margin for Forex)
Trade Mode: 4 (No trade restrictions)
Trade Execution Mode: 2  (Market execution)

--- Swap Terms ---
Swap Mode: 1 (Swaps are calculated in points)
Swap Rollover 3 Days: 3 (Wednesday)

--- Futures Dates ---
Start Time: 0
Expiration Time: 0

--- Margin Parameters ---
Initial Margin: 100000.0
Maintenance Margin: 0.0
Hedged Margin: 0.0
Hedged Margin Use Leg: False

--- Tick Info ---

Digits: 5
Point: 1e-05
Tick Value: 1.0
Tick Value Profit: 1.0
Tick Value Loss: 1.0
Tick Size: 1e-05

--- Contracts sizes---
Contract Size: 100000.0
Lots Min: 0.01
Lots Max: 100.0
Lots Step: 0.01
Lots Limit: 0.0

--- Swap sizes

Swap Long: -8.99
Swap Short: 4.5

--- Currency Info ---
Currency Base: EUR
Currency Profit: USD
Currency Margin: EUR
Bank: Pepperstone
Description: Euro vs US Dollar
Path: Markets\Forex\Majors\EURUSD
Page:

--- Session Info ---
Session Deals: 1
Session Buy Orders: 647
Session Sell Orders: 2
Session Turnover: 10.0
Session Interest: 0.0
Session Buy Volume: 3.0
Session Sell Volume: 13.0
Session Open: 1.12817
Session Close: 1.12842
Session AW: 0.0
Session Price Settlement: 0.0
Session Price Limit Min: 0.0
Session Price Limit Max: 0.0
---------------------


Класс COrderInfo

Данный класс предоставляет доступ к свойствам отложенных ордеров.


Класс COrderInfo на Python

Класс COrderInfo, встроенный в MQL5  Описание

Свойства типов Integer и Datetime

 
   
ticket()
 Ticket Получает тикет ордера, предварительно выбранного для доступа.
type_time()
 TypeTime Получает тип ордера на момент истечения.
type_time_description()
 TypeTimeDescription Получает тип ордера на момент истечения в виде строки. 
time_setup()
 TimeSetup Получает время размещения ордера.
time_setup_msc()
 TimeSetupMsc Получает время размещения ордера в миллисекундах с 01.01.1970.
order_type()
 OrderType Получает тип ордера в целочисленном формате.
order_type_description()
 OrderTypeDescription Получает тип ордера в виде строки. 
state()
 State Получает состояние ордера в виде целого числа.
state_description()
 StateDescription Получает состояние ордера в виде строки.
magic()
 Magic Получает идентификатор эксперта, разместившего ордер.
position_id()
 PositionId Получает идентификатор позиции.
type_filling()
 TypeFilling Получает тип исполнения ордера по остатку в виде целого числа. 
type_filling_description()
 TypeFillingDescription Получает тип исполнения ордера по остатку в виде строки.
time_done() 
 TimeDone Получает время исполнения или отмены ордера. 
time_done_msc()
 TimeDoneMsc Получает время исполнения или отмены ордера в миллисекундах с 01.01.1970. 
time_expiration()
 TimeExpiration Получает время истечения ордера. 

   Свойства типа Double 

   
volume_initial()
 VolumeInitial Получает начальный объем ордера. 
volume_current()
 VolumeCurrent Получает неисполненный объем ордера. 
price_open()
 PriceOpen Получает цену ордера. 
price_current()
 PriceCurrent Получает текущую цену по символу ордера. 
stop_loss()
 StopLoss Получает уровень Stop Loss ордера. 
take_profit()
 TakeProfit Получает уровень Take Profit ордера. 
price_stop_limit()
 PriceStopLimit Получает цену лимитного ордера. 

   Доступ к текстовым свойствам
 
   
comment()
 Symbol Получает комментарий ордера. 
symbol()
 Comment Получает имя символа ордера. 

  Выбор 

   
select_order(self, order) -> bool
  Выбирает ордер по его объекту (словарю) из списка ордеров, возвращаемого функцией MetaTrader5.orders_get().

Пример использования

import MetaTrader5 as mt5
from Trade.OrderInfo import COrderInfo

if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()
      
# Get all orders from MT5
orders = mt5.orders_get()

# Loop and print info
m_order = COrderInfo()

for i, order in enumerate(orders):
    if m_order.select_order(order=order):
        print(f"""
Order #{i}

--- Integer & datetime type properties ---

Ticket: {m_order.ticket()}
Type Time: {m_order.type_time()} ({m_order.type_time_description()})
Time Setup: {m_order.time_setup()}
Time Setup (ms): {m_order.time_setup_msc()}
State: {m_order.state()} ({m_order.state_description()})
Order Type: {m_order.order_type()} ({m_order.order_type_description()})
Magic Number: {m_order.magic()}
Position ID: {m_order.position_id()}
Type Filling: {m_order.type_filling()} ({m_order.type_filling_description()})
Time Done: {m_order.time_done()}
Time Done (ms): {m_order.time_done_msc()}
Time Expiration: {m_order.time_expiration()}
External ID: {m_order.external_id()}

--- Double type properties ---

Volume Initial: {m_order.volume_initial()}
Volume Current: {m_order.volume_current()}
Price Open: {m_order.price_open()}
Price Current: {m_order.price_current()}
Stop Loss: {m_order.stop_loss()}
Take Profit: {m_order.take_profit()}
Price StopLimit: {m_order.price_stop_limit()}

--- Text type properties ---

Comment: {m_order.comment()}
Symbol: {m_order.symbol()}

""")

mt5.shutdown()

Вывод

Order #0

--- Integer & datetime type properties --- 

Ticket: 153201235
Type Time: 2 (ORDER_TIME_SPECIFIED)        
Time Setup: 2025-05-21 23:56:16
Time Setup (ms): 1747860976672
State: 1 (Order accepted)
Order Type: 3 (Sell Limit pending order)   
Magic Number: 1001
Position ID: 0
Type Filling: 2 (IOC (Immediate or Cancel))
Time Done: 1970-01-01 03:00:00
Time Done (ms): 0
Time Expiration: 2025-05-21 23:57:14.940000
External ID:

--- Double type properties ---

Volume Initial: 0.01
Volume Current: 0.01
Price Open: 1.13594
Price Current: 1.1324
Stop Loss: 0.0
Take Profit: 0.0
Price StopLimit: 0.0

--- Text type properties ---

Comment: Sell Limit Order
Symbol: EURUSD


Класс CHistoryOrderInfo

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


Класс CHistoryOrderInfo на Python

Класс CHistoryOrderInfo, встроенный в MQL5  Описание

Свойства типов Integer, Datetime и String

 
   
time_setup()
 TimeSetup Получает время размещения ордера.
time_setup_msc()
 TimeSetupMsc Возвращает время размещения ордера в миллисекундах с 01.01.1970.
time_done()
 TimeDone Получает время исполнения или отмены ордера.
time_done_msc()
 TimeDoneMsc Возвращает время исполнения или отмены ордера в миллисекундах с 01.01.1970.
magic()
 Magic Получает идентификатор советника, разместившего выбранный ордер.
ticket()
  Возвращает тикет выбранного ордера.
order_type()
 OrderType Возвращает тип выбранного ордера.
order_type_description()
 OrderTypeDescription Возвращает тип выбранного ордера в виде строки.
state()
 State Возвращает состояние ордера в виде целого числа.
state_description()
 StateDescription Возвращает состояние ордера в виде строки.
time_expiration()
 TimeExpiration Получает время истечения выбранного ордера.
type_filling()
 TypeFilling Получает тип исполнения ордера по остатку в целочисленном формате.
type_filling_description()
 TypeFillingDescription Получает тип исполнения ордера по остатку в виде строки.
type_time()
 TypeTime Получает тип выбранного ордера на момент истечения в виде целого числа.
type_time_description()
 TypeTimeDescription Получает тип выбранного ордера на момент истечения в виде строки.
position_id()
 PositionId Получает идентификатор позиции. 

Свойства типа Double 

   
volume_initial()
 VolumeInitial Получает начальный объем выбранного ордера. 
volume_current()
 VolumeCurrent Получает неисполненный объем выбранного ордера. 
price_open()
 PriceOpen Получает цену выбранного ордера.
price_current() 
 PriceCurrent Получает текущую цену по символу ордера. 
stop_loss() 
 StopLoss Получает уровень Stop Loss выбранного ордера. 
take_profit()
 TakeProfit Получает уровень Take Profit выбранного ордера. 
price_stop_limit() 
 PriceStopLimit Получает цену выбранного лимитного ордера. 
 
Текстовые свойства

   
symbol() 
 Symbol Возвращает символ выбранного ордера. 
comment()
 Comment Возвращает комментарий выбранного ордера. 

Выбор

   
select_order(self, order) -> bool
  Выбирает ордер по его объекту из списка объектов (словарей), возвращаемого функцией MetaTrader5.history_orders_get.

Пример использования

import MetaTrader5 as mt5
from Trade.HistoryOrderInfo import CHistoryOrderInfo
from datetime import datetime, timedelta

if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()

# The date range

from_date = datetime.now() - timedelta(hours=5)
to_date = datetime.now()

# Get history orders

history_orders = mt5.history_orders_get(from_date, to_date)

if history_orders == None:
    print(f"No deals, error code={mt5.last_error()}")
    exit()
    
# m_order instance
m_order = CHistoryOrderInfo()

# Loop and print each order
for i, order in enumerate(history_orders):
    if m_order.select_order(order):
        print(f"""
History Order #{i}

--- Integer, Datetime & String type properties ---

Time Setup: {m_order.time_setup()}
Time Setup (ms): {m_order.time_setup_msc()}
Time Done: {m_order.time_done()}
Time Done (ms): {m_order.time_done_msc()}
Magic Number: {m_order.magic()}
Ticket: {m_order.ticket()}
Order Type: {m_order.order_type()} ({m_order.type_description()})
Order State: {m_order.state()} ({m_order.state_description()})
Expiration Time: {m_order.time_expiration()}
Filling Type: {m_order.type_filling()} ({m_order.type_filling_description()})
Time Type: {m_order.type_time()} ({m_order.type_time_description()})
Position ID: {m_order.position_id()}
Position By ID: {m_order.position_by_id()}

--- Double type properties ---

Volume Initial: {m_order.volume_initial()}
Volume Current: {m_order.volume_current()}
Price Open: {m_order.price_open()}
Price Current: {m_order.price_current()}
Stop Loss: {m_order.stop_loss()}
Take Profit: {m_order.take_profit()}
Price Stop Limit: {m_order.price_stop_limit()}

--- Access to text properties ---

Symbol: {m_order.symbol()}
Comment: {m_order.comment()}
""")

mt5.shutdown()

Вывод

History Order #79

--- Integer, Datetime & String type properties ---

Time Setup: 2025-05-21 23:56:17
Time Setup (ms): 1747860977335
Time Done: 2025-05-22 01:57:47
Time Done (ms): 1747868267618
Magic Number: 1001
Ticket: 153201241
Order Type: 5 (Sell Stop pending order)
Order State: 4 (Order fully executed)
Expiration Time: 2025-05-21 23:57:14.940000
Filling Type: 1 (FOK (Fill or Kill))
Time Type: 2 (ORDER_TIME_SPECIFIED)
Position ID: 153201241
Position By ID: 0

--- Double type properties ---

Volume Initial: 0.01
Volume Current: 0.0
Price Open: 1.13194
Price Current: 1.13194
Stop Loss: 0.0
Take Profit: 0.0
Price Stop Limit: 0.0

--- Access to text properties ---

Symbol: EURUSD
Comment: Sell Stop Order


Класс CPositionInfo

Данный класс предоставляет простой доступ к свойствам открытых позиций.


Класс CPositionInfo на Python

Класс CPositionInfo, встроенный в MQL5  Описание

   Свойства типов Integer и Datetime

 
   
ticket()
  Получает тикет позиции, предварительно выбранной для доступа.
time()
 Time  Получает время открытия позиции.
time_msc()
 TimeMsc Получает время открытия позиции в миллисекундах с 01.01.1970.
time_update()
 TimeUpdate Получает время изменения позиции в секундах с 01.01.1970.
time_update_msc()
 TimeUpdateMsc Получает время изменения позиции в миллисекундах с 01.01.1970.
position_type()
 PositionType Получает тип позиции в виде целого числа.
position_type_description()
 TypeDescription Получает тип позиции в виде строки.
magic()
 Magic Получает идентификатор эксперта, открывшего позицию.
position_id()
 Identifier Получает идентификатор позиции.

   Свойства типа Double 

   
volume()
 Volume Получает объем позиции. 
price_open()
 PriceOpen Получает цену открытия позиции. 
stop_loss()
 StopLoss Получает цену Stop Loss позиции. 
take_profit()
 TakeProfit Получает цену Take Profit позиции. 
price_current()
 PriceCurrent Получает текущую цену по символу позиции. 
profit()
 Profit Получает текущую сумму прибыли по позиции. 
swap() 
 Swap Получает сумму свопа по позиции. 

   Доступ к текстовым свойствам
 
   
comment()
 Comment Получает комментарий позиции. 
symbol()
 Symbol Получает имя символа позиции. 

  Выбор 

   
select_position(self, position) -> bool
  Выбирает объект (словарь) позиции из списка позиций, возвращаемого функцией MetaTrader5.positions_get().

Пример использования

import MetaTrader5 as mt5
from Trade.PositionInfo import CPositionInfo

if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()
      
positions = mt5.positions_get()
m_position = CPositionInfo()

# Loop and print each position
for i, position in enumerate(positions):
    if m_position.select_position(position):
        print(f"""
Position #{i}

--- Integer type properties ---

Time Open: {m_position.time()}
Time Open (ms): {m_position.time_msc()}
Time Update: {m_position.time_update()}
Time Update (ms): {m_position.time_update_msc()}
Magic Number: {m_position.magic()}
Ticket: {m_position.ticket()}
Position Type: {m_position.position_type()} ({m_position.position_type_description()})

--- Double type properties ---

Volume: {m_position.volume()}
Price Open: {m_position.price_open()}
Price Current: {m_position.price_current()}
Stop Loss: {m_position.stop_loss()}
Take Profit: {m_position.take_profit()}
Profit: {m_position.profit()}
Swap: {m_position.swap()}

--- Access to text properties ---

Symbol: {m_position.symbol()}
Comment: {m_position.comment()}

""")

mt5.shutdown()

Вывод

Position #1

--- Integer type properties ---

Time Open: 2025-05-22 15:02:06
Time Open (ms): 1747915326225
Time Update: 2025-05-22 15:02:06
Time Update (ms): 1747915326225
Magic Number: 0
Ticket: 153362497
Position Type: 1 (Sell)

--- Double type properties ---

Volume: 0.1
Price Open: 1.12961
Price Current: 1.1296
Stop Loss: 0.0
Take Profit: 0.0
Profit: 0.1
Swap: 0.0

--- Access to text properties ---

Symbol: EURUSD
Comment:


Класс CDealInfo

Данный класс предоставляет доступ к свойствам сделки из программы MetaTrader 5.


Класс CDealInfo на Python

Класс CDealInfo, встроенный в MQL5  Описание

Свойства типов Integer и Datetime
 

   
ticket()
  Предоставляет тикет выбранной сделки.
time()
 Time Получает время заключения сделки.
time_msc()
 TimeMsc Получает время заключения сделки в миллисекундах с 01.01.1970.
deal_type()
 DealType Получает тип сделки.
type_description()
 TypeDescription Получает тип сделки в виде строки.
entry()
 Entry Получает направление сделки.
entry_description()
 EntryDescription Получает направление сделки в виде строки.
magic()
 Magic Получает идентификатор эксперта, который заключил сделку.
position_id()
 PositionId Получает идентификатор позиции, в которой участвовала сделка.

Свойства типа Double

 
volume()
 Volume Получает объем (размер лота) по сделке.
price()
 Price Получает цену сделки.
commission()
 Commision Получает комиссию по сделке.
swap()
 Swap Получает сумму свопа на момент закрытия позиции.
profit() 
 Profit Получает финансовый результат (прибыль) по сделке. 

Свойства типа String 

   
symbol() 
 Symbol Получает имя символа выбранной сделки. 
comment()
 Comment Получает комментарий выбранной сделки.

Выбор 

   
select_by_index(self, index)
  Выбирает сделку по индексу.
select_deal(self, deal) -> bool
  Выбирает сделку по ее объекту (словарю) из списка сделок, возвращаемого функцией MetaTrader5.history_deals_get.

Пример использования

import MetaTrader5 as mt5
from datetime import datetime, timedelta
from Trade.DealInfo import CDealInfo

# The date range
from_date = datetime.now() - timedelta(hours=24)
to_date = datetime.now()

if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()
      
m_deal = CDealInfo()

# Get all deals from MT5 history
deals = mt5.history_deals_get(from_date, to_date)
    
for i, deal in enumerate(deals):
    
    if (m_deal.select_deal(deal=deal)):
        print(f"""
Deal #{i}

--- integer and dateteime properties ---

Ticket: {m_deal.ticket()}
Time: {m_deal.time()}
Time (ms): {m_deal.time_msc()}
Deal Type: {m_deal.deal_type()} ({m_deal.type_description()})
Entry Type: {m_deal.entry()} ({m_deal.entry_description()})
Order: {m_deal.order()}
Magic Number: {m_deal.magic()}
Position ID: {m_deal.position_id()}

--- double type properties ---

Volume: {m_deal.volume()}
Price: {m_deal.price()}
Commission: {m_deal.commission()}
Swap: {m_deal.swap()}
Profit: {m_deal.profit()}

--- string type properties --- 

Comment: {m_deal.comment()}
Symbol: {m_deal.symbol()}

External ID: {m_deal.external_id()}
""")

mt5.shutdown()

Вывод

Deal #53

--- integer and dateteime properties ---

Ticket: 0
Time: 2025-05-22 01:57:47
Time (ms): 1747868267618
Deal Type: 1 (SELL)
Entry Type: 0 (IN)
Order: 153201241
Magic Number: 1001
Position ID: 153201241

--- double type properties ---

Volume: 0.01
Price: 1.13194
Commission: -0.04
Swap: 0.0
Profit: 0.0

--- string type properties ---

Comment: Sell Stop Order
Symbol: EURUSD

External ID:


Класс CTerminalInfo

Данный класс предоставляет доступ к программной среды MetaTrader 5.


Класс CTerminalInfo на Python

Класс CTerminalInfo, встроенный в MQL5  Описание

Свойства типа String
 

   
name()
 Name Получает имя клиентского терминала.
company()
 Company Получает наименование компании клиентского терминала.
language()
 Language Получает язык клиентского терминала.
path()
 Path Получает директорию клиентского терминала.
data_path()
 DataPath Получает папку с данными для клиентского терминала.
common_data_path()
 CommonDataPath Получает папку с общими данными для всех клиентских терминалов (всех приложений MetaTrader5, установленных на компьютере).

Свойства типа Integer

 
build()
 Build Получает номер сборки клиентского терминала.
is_connected()
 IsConnected Получает информацию о подключении к торговому серверу.
is_dlls_allowed()
 IsDLLsAllowed Получает информацию о разрешении на использование DLL.
is_trade_allowed()
 IsTradeAllowed Получает информацию о разрешении на торговлю.
is_email_enabled()
 IsEmailEnabled Получает информацию о разрешении на отправку электронных писем на SMTP-сервер для логина, указанного в настройках терминала.
is_ftp_enabled()
 IsFtpEnabled Получает информацию о разрешении на отправку торговых отчетов на FTP-сервер для логина, указанного в настройках терминала.
are_notifications_enabled()
  Проверяет, включены ли пуш-уведомления в настройках терминала MetaTrader 5.
is_community_account()
  Проверяет, произведен ли вход от имени текущего терминала в сообщество MetaTrader на сайте mql5.com.
is_community_connection()
  Проверяет, имеется ли у терминала активное подключение к сервисам сообщества MQL5.
is_mqid()
  Проверяет, осуществил ли пользователь вход с помощью своего MQID (MetaQuotes ID).
is_tradeapi_disabled()
  Проверяет, отключен ли Trade API в настройках MetaTrader 5.
max_bars()
 MaxBars Получает информацию о максимальном количестве баров на графике. 
code_page()
  Возвращает целочисленное значение, представляющее текущую страницу кода (символьная кодировка), используемую терминалом MetaTrader 5. 
ping_last()
  Возвращает последнее зарегистрированное время пинга (в микросекундах) между терминалом MetaTrader и сервером брокера. 
community_balance()
  Возвращает текущий баланс счета пользователя в сообществе MQL5. 
retransmission()
  Возвращает скорость ретрансляции данных от сервера к терминалу. 

Пример использования

import MetaTrader5 as mt5
from Trade.TerminalInfo import CTerminalInfo


if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()
      
terminal = CTerminalInfo()

print(f"""
Terminal Information

--- String type ---

Name: {terminal.name()}
Company: {terminal.company()}
Language: {terminal.language()}
Terminal Path: {terminal.path()}
Data Path: {terminal.data_path()}
Common Data Path: {terminal.common_data_path()}

--- Integers type ---

Build: {terminal.build()}
Connected: {terminal.is_connected()}
DLLs Allowed: {terminal.is_dlls_allowed()}
Trade Allowed: {terminal.is_trade_allowed()}
Email Enabled: {terminal.is_email_enabled()}
FTP Enabled: {terminal.is_ftp_enabled()}
Notifications Enabled: {terminal.are_notifications_enabled()}
Community Account: {terminal.is_community_account()}
Community Connected: {terminal.is_community_connection()}
MQID: {terminal.is_mqid()}
Trade API Disabled: {terminal.is_tradeapi_disabled()}
Max Bars: {terminal.max_bars()}
Code Page: {terminal.code_page()}
Ping Last (μs): {terminal.ping_last()}
Community Balance: {terminal.community_balance()}
Retransmission Rate: {terminal.retransmission()}
""")
    
mt5.shutdown()

Вывод

Terminal Information

--- String type ---

Name: Pepperstone MetaTrader 5
Company: Pepperstone Group Limited
Language: English
Terminal Path: c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5
Data Path: C:\Users\Omega Joctan\AppData\Roaming\MetaQuotes\Terminal\F4F6C6D7A7155578A6DEA66D12B1D40D
Common Data Path: C:\Users\Omega Joctan\AppData\Roaming\MetaQuotes\Terminal\Common

--- Integers type ---

Build: 4755
Connected: True
DLLs Allowed: True
Trade Allowed: True
Email Enabled: True
FTP Enabled: False
Notifications Enabled: False
Community Account: True
Community Connected: True
MQID: False
Trade API Disabled: False
Max Bars: 100000000
Code Page: 0
Ping Last (μs): 251410
Community Balance: 900.026643
Retransmission Rate: 0.535847326494355


Класс CTrade

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

Установка параметров

Вместо задания параметров, таких как магик, тип исполнения и значение отклонения в пунктах, с помощью отдельных функций, как это делается в классе CTrade на MQL5, давайте в нашем Python-классе настроим все эти параметры в конструкторе классов.

class CTrade:
    
    def __init__(self, magic_number: int, filling_type_symbol: str, deviation_points: int):

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


Класс CTrade на Python

Класс CTrade, встроенный в MQL5 

Операции с ордерами

 
   
order_open(self, symbol: str, volume: float, order_type: int, price: float,
	   sl: float = 0.0, tp: float = 0.0, type_time: int = mt5.ORDER_TIME_GTC, 
	   expiration: datetime = None, comment: str = "") -> bool
 OrderOpen Размещает отложенный ордер с указанными параметрами.
order_modify(self, ticket: int, price: float, sl: float, tp: float,
	     type_time: int = mt5.ORDER_TIME_GTC, 
             expiration: datetime = None, stoplimit: float = 0.0) -> bool:
 OrderModify Меняет параметры отложенного ордера на указанные.
order_delete(self, ticket: int) -> bool
 OrderDelete Удаляет отложенный ордер.

Операции с позициями

 
position_open(self, symbol: str, volume: float, order_type: int, 
	      price: float, sl: float, tp: float, comment: str="") -> bool
 PositionOpen Открывает позицию с указанными параметрами.
position_modify(self, ticket: int, sl: float, tp: float) -> bool
 PositionModify Изменяет параметры позиции по указанному тикету.
position_close(self, ticket: int, deviation: float=float("nan")) -> bool
 PositionClose Закрывает позицию для указанного символа.

Дополнительные методы

 
buy(self, volume: float, symbol: str, price: float, 
    sl: float=0.0, tp: float=0.0, comment: str="") -> bool
 Buy Открывает длинную позицию с указанными параметрами.
sell(self, volume: float, symbol: str, price: float, 
     sl: float=0.0, tp: float=0.0, comment: str="") -> bool
 Sell Открывает короткую позицию с указанными параметрами.
buy_limit(self, volume: float, price: float, symbol: str, 
	  sl: float=0.0, tp: float=0.0, type_time: float=mt5.ORDER_TIME_GTC, 
	  expiration: datetime=None, comment: str="") -> bool
 BuyLimit Открывает отложенный ордер типа Buy Limit с указанными параметрами.
sell_limit(self, volume: float, price: float, symbol: str, 
	   sl: float=0.0, tp: float=0.0, type_time: float=mt5.ORDER_TIME_GTC, 
	   expiration: datetime=None, comment: str="") -> bool
 BuyStop Открывает отложенный ордер типа Sell Limit с указанными параметрами.
buy_stop(self, volume: float, price: float, symbol: str, 
	 sl: float=0.0, tp: float=0.0, type_time: float=mt5.ORDER_TIME_GTC, 
	 expiration: datetime=None, comment: str="") -> bool
 SellLimit Размещает отложенный ордер типа Buy Stop с указанными параметрами.
sell_stop(self, volume: float, price: float, symbol: str, 
	  sl: float=0.0, tp: float=0.0, type_time: float=mt5.ORDER_TIME_GTC, 
	  expiration: datetime=None, comment: str="") -> bool
 SellStop Размещает отложенный ордер типа Sell Stop с указанными параметрами.
buy_stop_limit(self, volume: float, price: float, symbol: str, 
		sl: float=0.0, tp: float=0.0, type_time: float=mt5.ORDER_TIME_GTC, 
		expiration: datetime=None, comment: str="") -> bool
  Размещает отложенный ордер Buy Stop Limit с указанными параметрами.
sell_stop_limit(self, volume: float, price: float, symbol: str, 
		sl: float=0.0, tp: float=0.0, type_time: float=mt5.ORDER_TIME_GTC, 
		expiration: datetime=None, comment: str="") -> bool
  Размещает отложенный ордер Buy Stop Limit с указанными параметрами.

Теперь откроем пару позиции и отложенных ордеров с помощью класса CTrade на Python.

import MetaTrader5 as mt5
from Trade.Trade import CTrade
from Trade.SymbolInfo import CSymbolInfo
from datetime import datetime, timedelta

if not mt5.initialize(r"c:\Users\Omega Joctan\AppData\Roaming\Pepperstone MetaTrader 5\terminal64.exe"):
    print("Failed to initialize Metatrader5 Error = ",mt5.last_error())
    quit()      
    
symbol = "EURUSD"

m_symbol = CSymbolInfo(symbol=symbol)
m_trade = CTrade(magic_number=1001,
                 deviation_points=100,
                 filling_type_symbol=symbol)

m_symbol.refresh_rates()

ask = m_symbol.ask()
bid = m_symbol.bid()

lotsize = m_symbol.lots_min()

# === Market Orders ===

m_trade.buy(volume=lotsize, symbol=symbol, price=ask, sl=0.0, tp=0.0, comment="Market Buy Pos")
m_trade.sell(volume=lotsize, symbol=symbol, price=bid, sl=0.0, tp=0.0, comment="Market Sell Pos")

# expiration time for pending orders
expiration_time = datetime.now() + timedelta(minutes=1)

# === Pending Orders ===

# Buy Limit - price below current ask
m_trade.buy_limit(volume=lotsize, symbol=symbol, price=ask - 0.0020, sl=0.0, tp=0.0, type_time=mt5.ORDER_TIME_SPECIFIED, expiration=expiration_time,
                comment="Buy Limit Order")

# Sell Limit - price above current bid
m_trade.sell_limit(volume=lotsize, symbol=symbol, price=bid + 0.0020, sl=0.0, tp=0.0, type_time=mt5.ORDER_TIME_SPECIFIED, expiration=expiration_time,
                   comment="Sell Limit Order")

# Buy Stop - price above current ask
m_trade.buy_stop(volume=lotsize, symbol=symbol, price=ask + 0.0020, sl=0.0, tp=0.0, type_time=mt5.ORDER_TIME_SPECIFIED, expiration=expiration_time,
                 comment="Buy Stop Order")

# Sell Stop - price below current bid
m_trade.sell_stop(volume=lotsize, symbol=symbol, price=bid - 0.0020, sl=0.0, tp=0.0, type_time=mt5.ORDER_TIME_SPECIFIED, expiration=expiration_time,
                  comment="Sell Stop Order")

# Buy Stop Limit - stop price above ask, limit price slightly lower (near it)
m_trade.buy_stop_limit(volume=lotsize, symbol=symbol, price=ask + 0.0020, sl=0.0, tp=0.0, type_time=mt5.ORDER_TIME_SPECIFIED, expiration=expiration_time,
                       comment="Buy Stop Limit Order")

# Sell Stop Limit - stop price below bid, limit price slightly higher (near it)
m_trade.sell_stop_limit(volume=lotsize, symbol=symbol, price=bid - 0.0020, sl=0.0, tp=0.0, type_time=mt5.ORDER_TIME_SPECIFIED, expiration=expiration_time,
                        comment="Sell Stop Limit Order")

mt5.shutdown()

Результат


Заключение

Торговые классы  это одно из полезных новшеств MQL5. Раньше нам приходилось писать все с нуля, что очень утомительно и заканчивалось множеством ошибок, как я уже объяснял ранее. В результате дополнения Python-пакета MetaTrader 5 библиотеками (модулями) на языке Python, которые очень схожи по синтаксису с используемыми в MQL5, разработчики получили возможность максимально эффективно применять те знания, которые они получили в процессе работы с MQL5, для работы с приложениями на Python.

Эти пользовательские Python-библиотеки помогают минимизировать проблему с отсутствием поддержки Intellisense: после добавления "Docstrings" в ваши функции и классы на Python текстовые редакторы смогут помочь документировать ваш код и подсвечивать параметры, что сделает процесс написания кода гораздо приятнее и легче. К примеру, внутри метода buy в классе CTrade представлено короткое описание функции.

class CTrade:
# ....

    def buy(self, volume: float, symbol: str, price: float, sl: float=0.0, tp: float=0.0, comment: str="") -> bool:
        
        """
        Opens a buy (market) position.
        
        Args:
            volume: Trade volume (lot size)
            symbol: Trading symbol (e.g., "EURUSD")
            price: Execution price
            sl: Stop loss price (optional, default=0.0)
            tp: Take profit price (optional, default=0.0)
            comment: Position comment (optional, default="")
        
        Returns:
            bool: True if order was sent successfully, False otherwise
        """

Эта функция теперь будет описана в VS Code.


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

Всего наилучшего!


Таблица приложений


Имя и путь до файла

Описание и использование

Модули (библиотеки)
 
 
Trade\AccountInfo.py Содержит класс CAccountInfo.
Trade\DealInfo.py Содержит класс CDealInfo.
Trade\HistoryOrderInfo.py Содержит класс CHistoryOrderInfo.
Trade\OrderInfo.py Содержит класс COrderInfo.
Trade\PositionInfo.py Содержит класс CPositionInfo.
Trade\SymbolInfo.py Содержит класс CSymbolInfo.
Trade\TerminalInfo.py  Содержит класс CTerminalInfo.
Trade\Trade.py Содержит класс CTrade.

Тестовые файлы


 accountinfo_test.py Скрипт для тестирования методов, предложенных в классе CAccountInfo. 
 dealinfo_test.py Скрипт для тестирования методов, предложенных в классе CDealInfo. 
 error_description.py Содержит функцию для описания ошибок и возвращения их кодов в виде человекочитаемых строк. 
 historyorderinfo_test.py Скрипт для тестирования методов, предложенных в классе CHistoryOrderInfo. 
 orderinfo_test.py Скрипт для тестирования методов, предложенных в классе COrderInfo. 
 positioninfo_test.py Скрипт для тестирования методов, предложенных в классе CPositionInfo. 
 symbolinfo_test.py Скрипт для тестирования методов, предложенных в классе CHistoryOrderInfo. 
 terminalinfo_test.py Скрипт для тестирования методов, предложенных в классе CTerminal.  
 main.py Скрипт для тестирования класса CTrade (можно считать это конечной версией торгового робота на Python). 

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

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
Yevgeniy Koshtenko
Yevgeniy Koshtenko | 12 июн. 2025 в 14:30
Огромное спасибо. У вас отличная статья
Roman Shiredchenko
Roman Shiredchenko | 12 июн. 2025 в 18:21

спасибо Вам большое! у вас очень полезная статья под будущие проекты... 

Разработка системы репликации (Часть 75): Новый Chart Trade (II) Разработка системы репликации (Часть 75): Новый Chart Trade (II)
В этой статье мы расскажем о классе C_ChartFloatingRAD. Это то, что позволяет Chart Trade работать. Однако на этом объяснение не закончится. Мы завершим его в следующей статье, так как содержание данной статьи довольно объемное и требует глубокого понимания. Представленные здесь материалы предназначены только для обучения. Ни в коем случае не рассматривайте его как окончательное приложение, целью которого не является изучение представленных концепций.
Переосмысливаем классические стратегии (Часть XI): Пересечение скользящих средних (II) Переосмысливаем классические стратегии (Часть XI): Пересечение скользящих средних (II)
Скользящие средние и стохастический осциллятор можно использовать для генерации торговых сигналов, следующих за трендом. Однако эти сигналы будут наблюдаться только после того, как произойдет ценовое движение. Мы можем эффективно преодолеть этот неизбежный лаг в технических индикаторах с помощью искусственного интеллекта. В настоящей статье мы расскажем, как создать полностью автономный советник на базе ИИ таким образом, чтобы улучшить любую из ваших существующих торговых стратегий. Даже самая старая торговая стратегия может быть улучшена.
Инженерия признаков с Python и MQL5 (Часть I): AI-модели для долгосрочного прогнозирования по скользящим средним Инженерия признаков с Python и MQL5 (Часть I): AI-модели для долгосрочного прогнозирования по скользящим средним
Скользящие средние являются, безусловно, самыми эффективными индикаторами для прогнозирования моделями ИИ. Однако точность результатов можно еще больше повысить, если перед этим соответственным образом преобразовать данные. В этой статье мы поговорим о создании AI-моделей, которые могут прогнозировать в более отдаленное будущее без существенного снижения уровня точности. В очередной раз мы с вами убедимся, насколько полезны скользящие средние.
Нейросети в трейдинге: Фреймворк кросс-доменного прогнозирования временных рядов (Окончание) Нейросети в трейдинге: Фреймворк кросс-доменного прогнозирования временных рядов (Окончание)
Статья посвящена практическому построению модели TimeFound для прогнозирования временных рядов. Рассматриваются ключевые этапы реализации основных подходов фреймворка средствами MQL5.