Группа пользователей MetaTrader 5 Python - краткое содержание - страница 6

 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Ренат Фатхуллин, 02/20/2012 00:17

Наши среды легко поддерживаются. Посмотрите настройки компилятора в редакторе, пожалуйста.

...

Завтра мы выпустим новую бету терминала и новую полноценную библиотеку python. Все старые методы и примеры не работают, так как мы переписали api и библиотеку с нуля.

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

Теперь вы можете писать полноценных роботов для Metatrader прямо на Python.


 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Ренат Фатхуллин, 02/20/2013 17:21

Новая версия MetaTrader 5 для Python 5.0.18 и бета-версия MetaTrader 5 build 2319:

  • бета-версия MT5 загружается через Help -> Check beta version
  • библиотека python:
    pip install --upgrade metatrader5
    

Поскольку все api изменились, старые примеры больше не работают.

Вот новый набор функций:

initialize(path=None)                              Establish connection with the MetaTrader 5 Terminal
wait()                                             Wait for the MetaTrader 5 Terminal to connect to a broker's server
shutdown()                                         Disconnect from the MetaTrader 5 Terminal

version ()                                          Get the MetaTrader 5 Terminal version
terminal_info()                                    Get the parameters of the MetaTrader 5 terminal
account_info()                                     Returns information of current account

copy_ticks_from(symbol, from, count, flags)                Get ticks starting from the specific date
copy_ticks_range(symbol, from, to, flags)                  Get ticks from the specified period
copy_rates_from(symbol, timeframe, from, count)            Get bars starting from the specific date
copy_rates_from_pos(symbol, timeframe, start_pos, count)   Get bars starting from the specified position
copy_rates_range(symbol, timeframe, date_from, date_to)    Get bars from the specified period

positions_total()                                          Returns the number of open positions
positions_get([symbol=\"SYMBOL\"],[ticket=TICKET])         Returns all open positions, can be filtered by symbol or ticket

orders_total()                                             Returns the number of orders
orders_get([symbol=\"SYMBOL\"],[ticket=TICKET])            Returns all orders, can be filtered by symbol or ticket

history_orders_total(from, to)                             Returns the number of orders in selected range from the history
history_orders_get(from, to)                               Returns orders in selected range from the history or filtered by position id, ticket

history_deals_total(from, to)                              Returns the number of deals in selected range from the history
history_deals_get(from, to)                                Returns deals in selected range from the history or filtered by position id, ticket

order_check(request)                                                Checks if there are enough funds to execute the required trade operation
order_send(request)                                                 Sends trade requests to a server
order_calc_margin(action, symbol, volume, price)                    Calculates the margin required for the specified order
order_calc_profit(action, symbol, volume, price_open, price_close)  Calculates the profit for the current account, in the current market conditions, based on the parameters passed

symbol_info(symbol)                                        Returns full information for a specified symbol
symbol_info_tick(symbol)                                   Returns current prices of a specified symbol
symbol_select(symbol,[enable])                             Selects a symbol in the Market Watch window or removes a symbol from the window

Пример:

import MetaTrader5 as mt5
import time

mt5.initialize()
mt5.wait()

dev = 0.00010 ;
symbol = "EURUSD"
buy_price = 0

mt5.symbol_select(symbol)

time.sleep( 1 )
p = mt5.symbol_info_tick(symbol)
prev_price = p.ask

while True:
    p = mt5.symbol_info_tick(symbol)
    print(p.bid, '/' ,p.ask)
    
     if p.ask > prev_price and buy_price == 0 :
            print( "Buy " , p.ask)
            r = mt5.Buy(symbol, 0.01 )
             if r.retcode == mt5. TRADE_RETCODE_DONE :
                buy_price = p.ask;
    elif buy_price > 0 and p.ask + dev < buy_price:
        print( "Buy(close) " , p.bid)
        mt5.Close(symbol)
        buy_price = 0

    prev_price = p.ask
    time.sleep( 1 )

mt5.shutdown()

 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Ренат Фатхуллин, 02/20/2013 6:09 PM

Программы на python будут запускаться в терминале только в виде скриптов и никак не будут участвовать в тестере торговых стратегий.

Это решение для тех, кто занимается глубоким изучением python и хочет:

  1. доступ к рыночной информации из MT5
  2. доступ к истории сделок и открытым позициям
  3. торговать

Тестер стратегий предназначен только для программ на MQL5.

Позже мы расширим библиотеку и предоставим возможность доступа к встроенным и пользовательским индикаторам из терминала.


 
Sergey Golubev:

Вы получили от меня значок супергероя! Спасибо!
 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Ренат Фатхуллин, 02/20/14 13:49

Библиотека для связки MT5 <-> Python с упором на получение данных.

Из Python-программ в терминал идут только запросы и торговые заявки. Передавать массовые данные из python нет смысла, так как он не имеет доступа к изменяемому окружению MQL5, а строго ограничен узким интерфейсом запросов к терминалу.


Интеграция с Python имеет следующие возможности:

  1. получать рыночные данные о графиках, позициях и истории сделок
  2. отправлять и контролировать торговые операции
  3. запускать файлы * .py непосредственно из навигатора
  4. привлечь Python-разработчиков в экосистему Metatrader за счет простоты доступа к данным и полноценной торговли
  5. привлечь узкие группы, профессиональные группы, квантовых разработчиков из хедж-фондов, инвестиционных компаний и банков, предложив им удобную замену своей среды.
  6. предоставить доступ к разнообразным математическим библиотекам и библиотекам искусственного интеллекта, доступным в Python

Библиотека Python не является заменой MQL5, и мы не принимаем запросы на расширение функциональности.

 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Almaz, 2020/02/14 17:18

Готовых функций нет, но в __init__.py можно посмотреть как делаются простые ордера, отложенные ордера делаются аналогично:

 #  internal order send
def _RawOrder(order_type, symbol, volume, price, comment=None, ticket=None):
    order = {
       "action" :     TRADE_ACTION_DEAL ,
       "symbol" :    symbol,
       "volume" :    volume,
       "type" :      order_type,
       "price" :     price,
       "deviation" : 10 ,
    }
     if comment != None:
        order[ "comment" ] = comment
     if ticket != None:
        order[ "position" ] = ticket
    r = order_send(order)
     return r

#  Buy order                
def Buy(symbol, volume, price=None, *, comment=None, ticket=None):
     #  with direct call
     if price != None:
         return _RawOrder( ORDER_TYPE_BUY , symbol, volume, price, comment, ticket)
     #  no price, we try several times with current price
     for tries in range( 10 ):
        info = symbol_info_tick(symbol)
        r = _RawOrder( ORDER_TYPE_BUY , symbol, volume, info.ask, comment, ticket)
         if r.retcode != TRADE_RETCODE_REQUOTE and r.retcode != TRADE_RETCODE_PRICE_OFF :
             break
     return r

#  Sell order
def Sell(symbol, volume, price=None, *, comment=None, ticket=None):
     #  with direct call
     if price != None:
         return _RawOrder( ORDER_TYPE_SELL , symbol, volume, price, comment, ticket)
     #  no price, we try several times with current price
     for tries in range( 10 ):
        info = symbol_info_tick(symbol)
        r = _RawOrder( ORDER_TYPE_SELL , symbol, volume, info.bid, comment, ticket)
         if r.retcode != TRADE_RETCODE_REQUOTE and r.retcode != TRADE_RETCODE_PRICE_OFF :
             break
     return r

поля передаются в order_send:

action, magic, order, symbol, volume, price, stoplimit, sl, tp, deviation, type, type_filling, type_time, expiration, comment, position, position_by

, они похожи: https://www.mql5.com/en/docs/trading/ordersend


 
Sergey Golubev:

2020.02.15 11:42:13.717 LiveUpdate доступна новая версия build 2321 (IDE: 2321, Tester: 2321)


Здравствуйте, я проверяю бета-версию, и программа отражает этот массаж, но нет "опции" или "автоматизации" для обновления.

Надеюсь на ваш ответ.


 
a378910115:
2020.02.15 11:42:13.717 LiveUpdate доступна новая версия build 2321 (IDE: 2321, Tester: 2321).


Здравствуйте, я проверяю бета-версию, и программа отражает этот массаж, но нет "опции" или "автоматизации" для обновления.

Надеюсь на ваш ответ.


Если вы работаете, например, на Windows 10 64-bit (посмотрите эту тему, если ваша Windows 32-bit: Поддержка 32-битных версий заканчивается со следующим обновлением MetaTrader 5), то подключитесь к серверу MetaQuotes-Demo (откройте демо-счет в MetaQuotes-Demo), перейдите в раздел Помощь - Проверить обновления рабочего стола - Последняя бета-версия и подождите. MT5 будет обновлен до последней бета-версии.


Если вам не нужна бета-версия (если вы хотите использовать последнюю стабильную версию), то не подключайтесь к MetaQuotes-Demo.

Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
, then each symbol positions will be closed in the same order, in which they are opened, starting with the oldest one. In case of an attempt to close positions in a different order, the trader will receive an appropriate error. There are several types of accounts that can be opened on a trade server. The type of account on which an...
 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Ренат Фатхуллин, 02/20/16 10:46 a.m.

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

Также мы отредактируем описания старых интерфейсов на форуме.


По умолчанию запускается терминал, который последним был запущен под учетной записью пользователя. Каталог C: \ Users \% username% \ AppData \ Roaming \ MetaQuotes \ Terminal просматривается и выбирается самый последний экземпляр.

Коды ответов обернуты в кортеж и похожи на коды ответов в MQL5.

Мы опишем их позже в документации.


 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

MetaTrader 5 Python User Group - как использовать Python в Metatrader

Almaz, 2020/02/17 11:10

да, префикс констант MT5_ убран, вот пример использования:

from datetime import datetime
import MetaTrader5 as mt5

mt5.initialize()
mt5.wait()

print(mt5.terminal_info())
print(mt5. version ())

ticks1 = mt5.copy_ticks_from("EURAUD", datetime ( 2020 , 1 , 28 , 13 ), 10000 , mt5. COPY_TICKS_ALL )
ticks2 = mt5.copy_ticks_range("AUDUSD", datetime ( 2020 , 1 , 27 , 13 ), datetime ( 2020 , 1 , 28 , 13 , 1 ), mt5. COPY_TICKS_ALL )

rates1 = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_M1, datetime ( 2020 , 1 , 28 , 13 ), 1000 )
rates2 = mt5.copy_rates_from_pos("EURGBP", mt5.TIMEFRAME_M1, 0 , 1000 )
rates3 = mt5.copy_rates_range("EURCAD", mt5.TIMEFRAME_M1, datetime ( 2020 , 1 , 27 , 13 ), datetime ( 2020 , 1 , 28 , 13 ))

mt5.shutdown()

print('ticks1(', len(ticks1), ')')
print('ticks2(', len(ticks2), ')')
print('rates1(', len(rates1), ')')
print('rates2(', len(rates2), ')')
print('rates3(', len(rates3), ')')

import matplotlib.pyplot as plt

plt.plot(rates2['time'], rates2['low'], 'g-')
plt.plot(rates2['time'], rates2['high'], 'r-')

plt.show()

более сложный пример - эксперт с торговлей по двум скользящим средним без использования истории:

import MetaTrader5 as mt5
import time

mt5.initialize()
mt5.wait()

info = mt5.terminal_info()
if info.trade_allowed == False:
    print( "Auto-trading disabled in Terminal, enable it" )
    quit()

symbol = "EURUSD" #  currency
lot = 0.01 ;       #  buy lot
interval = 5        #  price requesting interval in sec
long_len = 11      #  long moving average length
short_len = 7      #  short moving average length
long_ma = []       #  long ma list
short_ma = []     #  short ma list
ticket = 0          #  ticket for sell

mt5.symbol_select(symbol)

#  wait some time
time.sleep( 1 )

print( "\nPreparing..." )
for i in range(long_len):
    p = mt5.symbol_info_tick(symbol)
    print(p.bid, '/' ,p.ask)
    avg = (p.ask + p.bid) / 2

    long_ma.append(avg)
     if i >= long_len - short_len:
        short_ma.append(avg)
    time.sleep(interval)

print( "\nWorking..." )
while True:
    p = mt5.symbol_info_tick(symbol)
    print(p.bid, '/' ,p.ask)
    avg = (p.ask + p.bid) / 2
    
     #  short values
    prev_short = sum(short_ma) / short_len
    short_ma.pop( 0 )
    short_ma.append(avg)
     short = sum(short_ma) / short_len
    
     #  long values
    prev_long = sum(long_ma) / long_len
    long_ma.pop( 0 )
    long_ma.append(avg)
     long = sum(long_ma) / long_len

     #  buy signal
     if prev_short < prev_long and short > long :
        print( "BUY: ([-1]:" ,prev_short, "/" ,prev_long, ", [0]:" , short , "/" , long , ")" )
        r = mt5.Buy(symbol, lot)
         if r.retcode != mt5. TRADE_RETCODE_DONE :
            print( "Buy failed: " , r)
         else :
            ticket = r.order
    elif prev_short > prev_long and short < long and ticket> 0 :
        print( "CLOSE: ([-1]:" ,prev_short, "/" ,prev_long, ", [0]:" , short , "/" , long , ")" )
        r = mt5.Sell(symbol, lot, ticket=ticket)
         if r.retcode != mt5. TRADE_RETCODE_DONE :
            print( "Sell failed: " , r)
         else :
            ticket = 0
           
    time.sleep(interval)

mt5.shutdown()