
Создание Python-классов для торговли в MetaTrader 5, аналогичных представленным в MQL5
Содержание
- Введение
- Класс CAccountInfo
- Класс CSymbolInfo
- Класс COrderInfo
- Класс CHistoryOrderInfo
- Класс CPositionInfo
- Класс CDealInfo
- Класс CTerminalInfo
- Класс CTrade
- Заключение
Введение
Создание систем алгоритмической торговли на языке программирования 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





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Создание Python-классов для торговли в MetaTrader 5, аналогичных представленным в MQL5:
Автор: Omega J Msigwa
спасибо Вам большое! у вас очень полезная статья под будущие проекты...