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

 
Дмитрий Прокопьев:

Это последствия вчерашнего рыночного шторма? ;)

Нет :) Я давно не использовал python, поэтому решил перевести один из своих популярных скриптов close-all на python, используя питонические абстракции.


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

import MetaTrader5 as mt5
from datetime import datetime
from itertools import permutations
from contextlib import contextmanager

class MetatraderConnectionError(Exception):
    pass

@contextmanager
def metatrader_connection():
    try:
        if not mt5.initialize():
            print("Failed to initialize python MT5")
            raise MetatraderConnectionError
        yield
    finally:
        mt5.shutdown()


def get_pair_symbols():
    base_currencies = "USD JPY GBP AUD EUR CHF NZD".split()
    possibles = map(''.join, permutations(base_currencies, 2))
    infos = [(s, mt5.symbol_info(s)) for s in possibles]
    symbol_map = {s: si for s, si in infos if si is not None}
    return symbol_map


def get_prev_traded_symbols():
    begin = datetime(2018, 1, 1)
    end = datetime.now()
    deal_symbols = set(d.symbol for d in mt5.history_deals_get(begin, end))
    order_symbols = set(d.symbol for d in mt5.history_orders_get(begin, end))
    pos_symbols = set(d.symbol for d in mt5.positions_get())
    symbols = deal_symbols | order_symbols | pos_symbols
    symbol_map = {s: mt5.symbol_info(s) for s in symbols if s}
    return symbol_map


def get_symbols():
    return {**get_pair_symbols(), **get_prev_traded_symbols()}


def main():
    for symbol, info in get_symbols().items():
        print(symbol, info)


if __name__ == "__main__":
    with metatrader_connection():
        main()
Current Account - economic indicator from the United Kingdom
Current Account - economic indicator from the United Kingdom
  • www.mql5.com
The Current Account reflects the balance of transactions between UK residents and the rest of the world. It is the sum of net trade balance (the difference between exported and imported goods and services), the net factor income of UK residents (such as interest, dividends, etc.) and net transfer payments (e.g. foreign donations) to UK...
 
nicholi shen:

Нет :) Я давно не использовал python, поэтому решил переделать один из своих популярных скриптов для close-all на python, используя питонические абстракции.


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

В соседней теме это обсуждается ... на русском (URL: https: //www.mql5.com/ru/forum/306688/page56)

Небольшой перевод :) от меня

Symbols_total (), symbols_get ([group = "EURUSD, "USDGBP", * RU *"]) добавлены в релизе 5.0.29.

Требуется установить последнюю бета-версию терминала.

Также во всех функциях orders_get (), positions_get (), history_orders_get (), history_deals_get () добавлена возможность фильтрации по группе - group = "EURUSD," USDGBP ", * RU *".
Методы order_check (), order_send () - возвращают исходный запрос в поле request.


Посмотрите на threading, там много примеров и т.д., только на русском... + google translate ^)

MetaTrader 5 Python User Group - как использовать Python в Метатрейдере
MetaTrader 5 Python User Group - как использовать Python в Метатрейдере
  • 2020.03.23
  • www.mql5.com
Мы готовим модуль MetaTrader 5 для Python...
 
Дмитрий Прокопьев:

В соседнем потоке обсуждается ... на русском языке (URL: https: //www.mql5.com/ru/forum/306688/page56)

Небольшой перевод :) от меня

Symbols_total (), symbols_get ([group = "EURUSD," USDGBP ", * RU *"]) добавлены в релизе 5.0.29.

Требуется установить последнюю бета-версию терминала.

Также во всех функциях orders_get (), positions_get (), history_orders_get (), history_deals_get () добавлена возможность фильтрации по группе - group = "EURUSD," USDGBP ", * RU *".
Методы order_check (), order_send () - возвращают исходный запрос в поле request.


Посмотрите на threading, там много примеров и т.д., только на русском... + google translate ^)

Я не говорю по-русски, поэтому не могли бы вы от моего имени передать в этот поток следующее?


Функция symbols_get должна возвращать генератор SymbolInfo с именем tuples. Вызов symbols_get без args должен возвращать все символы, доступные в терминале. Функция должна принимать обратный вызов, который будет передан в именованный кортеж SymbolInfo для обработки функцией фильтра. Вот несколько примеров.

import MetaTrader5 as mt5
from contextlib import contextmanager
import re


@contextmanager
def metatrader_connection(**kw):
    try:
        if not mt5.initialize(**kw):
            print("Failed to initialize python MT5")
            raise Exception
        yield
    finally:
        mt5.shutdown()


def symbols_get(function=None):
    """
    No function passed in will result in all symbols returned to the caller.
    If a callable function is passed in then the function is passed a SymbolInfo tuple for filtering
    :param function: callback function to filter the symbols
    """
    all_symbols_in_terminal_info = map(
        mt5.symbol_info,
        ['EURUSD', 'USDJPY', 'GBPJPY', 'EURGBP'] # *example only* this would represent all symbols available to the terminal
    )
    if function is not None:
        return filter(function, all_symbols_in_terminal_info)
    return all_symbols_in_terminal_info


if __name__ == "__main__":
    with metatrader_connection():
        all_terminal_symbols = symbols_get()
        jpy_symbols = symbols_get(lambda s: "JPY" in s.name)
        jpy_symbols_using_re = symbols_get(lambda s: re.match(r'\w*JPY\w*', s.name))
        visible_symbols = symbols_get(lambda s: s.visible)
        selected_symbols = symbols_get(lambda s: s.select)


        def my_criteria(symbol_info):
            return 'USD' in symbol_info.name and symbol_info.session_deals > 0


        usd_symbols_with_session_deals = symbols_get(my_criteria)
 
nicholi shen:

Я не говорю по-русски, поэтому не могли бы вы передать следующее в эту тему от моего имени?


Хорошо, без проблем...

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

 
nicholi shen:

Нет :) Я давно не использовал python, поэтому решил переделать один из своих популярных скриптов для close-all на python, используя питонические абстракции.


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

В версии 5.0.29 и последней бета-версии Terminal вы можете использовать метод symbols_get() для получения всех доступных символов.

 

Прошу прощения за задержку с ответом. Я запускаю MT5 на linux (Fedora) с установкой wine. Я получаю следующую ошибку:

ERROR: Не удалось найти версию, удовлетворяющую требованию MetaTrader5 (из версий: нет)
ERROR: Не найдено подходящего дистрибутива для MetaTrader5


jaffer wilson:

Какую ошибку вы получаете?

 
alkam_ai:

Прошу прощения за задержку с ответом. Я запускаю MT5 на linux (Fedora) с установкой wine. Я получаю следующую ошибку:

ERROR: Не удалось найти версию, удовлетворяющую требованию MetaTrader5 (из версий: нет)
ERROR: Не найдено подходящего дистрибутива для MetaTrader5


Уххх... вы используете MT5 (Wine) + python (Wine)?!

Круто... У меня не получилось сделать такую конфигурацию :(

 

Можно ли отправить запрос на установку стоп-лосса по существующему ордеру?

У меня есть код, который работает в моей python ea, которая может устанавливать и открывать сделки. однако мне нужно знать синтаксис для mt5.Buy(), mt5.Sell(), и какие значения они принимают. например, как я могу установить стоп-лосс и значение тейк-профита при отправке покупки? или продажи?

и как я могу обновить ордер? (я не могу отправить запрос на обновление стоплосса) я получаю ошибку invalid request 10016


моя ea действительно работает для подключения покупки и продажи, но я не вижу никаких примеров или документации для покупки и продажи.

import MetaTrader5 as mt5
import time

#  connect to MetaTrader 5
if not mt5.initialize():
    print("initialize() failed")
    mt5.shutdown()
 
#  request connection status and parameters
print(mt5.terminal_info())
#  get data on MetaTrader 5 version
print(mt5.version())

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

symbol = "XAUUSD"       # set  to whatever symbol or currency
lot = 0.01              #  buy/sell lot
slminprofit = 20 * lot  #  number pips * lotsize


positions=mt5.positions_get(symbol=symbol)
    if positions==None:
        print("No positions, error code={}".format(mt5.last_error()))
    if len(positions)>0:
        print("Total positions on", symbol,":",len(positions))
        #  display all active orders
        for position in positions:
            if position.type == 0:
                ptype = "Buy"
            elif position.type == 1:
                ptype = "Sell"
            print("id:", position.identifier, ptype, position.profit, position.ORDER_VOLUME_CURRENT)

            
            #stoploss
             position_id=position.identifier
            if position.type == 1 and position.profit > slminprofit: #if  ordertype sell 
                request={
                    "action": mt5.TRADE_ACTION_SLTP,
                    "position": position_id,
                    "sl": v_ask - 100 * lot,
                    "comment": "python trailing sl",
                    "deviation": 20,
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_RETURN,
                    "volume": position.ORDER_VOLUME_CURRENT
                }
                #  send a trading request
                result=mt5.order_send(request)
                #  check the execution result
                print("3. SL SELL update sent on position #{}: {} {} lots".format(position_id,symbol,lot));
                if result.retcode != mt5.TRADE_RETCODE_DONE:
                    print("4. order_send failed, retcode={}".format(result.retcode))
                    print("   result",result)
                else:
                    print("4. position #{} SL Updated, {}".format(position_id,result))
            elif position.type == 0 and position.profit > slminprofit: #if  ordertype buy 
                request={
                    "action": mt5.TRADE_ACTION_SLTP,
                    "position": position_id,
                    "sl": v_bid + 100 * lot,
                    "comment": "python trailing sl",
                    "deviation": 20,
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_RETURN,
                    "volume": position.ORDER_VOLUME_CURRENT
                }
                #  send a trading request
                result=mt5.order_send(request)
                #  check the execution result
                print("3. SL BUY update sent on position #{}: {} {} lots".format(position_id,symbol,lot));
                if result.retcode != mt5.TRADE_RETCODE_DONE:
                    print("4. order_send failed, retcode={}".format(result.retcode))
                    print("   result",result)
                else:
                    print("4. position #{} SL Updated, {}".format(position_id,result))
            
    else:
        print("Positions on", symbol,"not found.")

мой код покупки (я сохраняю номер ордера в переменную под названием "ticket", чтобы потом использовать его для проверки успешности ордера)
r = mt5.Buy(symbol, lot)

        time.sleep( 1 )
        if r.retcode != mt5. TRADE_RETCODE_DONE :
            print( "Buy failed: " , r)
        else :
            ticket = r.order
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Requests to execute trade operations are formalized as orders. Each order has a variety of properties for reading. Information on them can be obtained using functions Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The...
 
Azeem Hussein:

Можно ли отправить запрос на установку стоп-лосса по существующему ордеру?

У меня есть код, который работает в моей python ea, которая может устанавливать и открывать сделки. однако мне нужно знать синтаксис для mt5.Buy(), mt5.Sell(), и какие значения они принимают. например, как я могу установить стоп-лосс и значение тейк-профита при отправке покупки? или продажи?

и как я могу обновить ордер? (я не могу отправить запрос на обновление стоплосса) я получаю ошибку invalid request 10016


моя ea действительно работает для подключения покупки и продажи, но я не вижу никаких примеров или документации для покупки и продажи.

мой код покупки (я сохраняю номер ордера в переменную под названием "ticket", чтобы потом использовать его для проверки успешности ордера)
r = mt5.Buy(symbol, lot)

Вы можете установить tp/sl при отправке ордера, а также изменить его. Вот быстрый пример.

import MetaTrader5 as mt5
from contextlib import contextmanager


@contextmanager
def mt5_connection(**kw):
    try:
        if not mt5.initialize(**kw):
            raise Exception("Failed to initialize python MT5")
        yield
    finally:
        mt5.shutdown()


def raw_order(**kwargs):
    return mt5.order_send(kwargs)


def buy(symbol, volume, sl=0.0, tp=0.0):
    price = mt5.symbol_info_tick(symbol).ask
    res = raw_order(
        action=mt5.TRADE_ACTION_DEAL,
        type=mt5.ORDER_TYPE_BUY,
        symbol=symbol,
        volume=float(volume),
        price=price,
        sl=sl,
        tp=tp,
    )
    return res


def mod_sl_tp(position, sl=None, tp=None):
    res = raw_order(
        action=mt5.TRADE_ACTION_SLTP,
        position=position.ticket,
        symbol=position.symbol,
        sl=(sl or position.sl),
        tp=(tp or position.tp),
    )
    return res


def position_from_result(result):
    try:
        deal = mt5.history_deals_get(ticket=result.deal)[0]
        pos = mt5.positions_get(ticket=deal.position_id)[0]
        return pos
    except:
        return None


def main():
    symbol = "EPM20"
    result = buy(symbol, volume=1)
    print(result)
    if position := position_from_result(result):
        new_stop = position.price_open - 25
        new_take = position.price_open + 50
        result = mod_sl_tp(position, sl=new_stop, tp=new_take)
        print(result)


if __name__ == "__main__":
    with mt5_connection():
        main()
 
nicholi shen:

Я не говорю по-русски, поэтому не могли бы вы передать следующее в эту тему от моего имени?


Функция symbols_get должна возвращать генератор SymbolInfo с именем tuples. Вызов symbols_get без args должен возвращать все символы, доступные в терминале. Функция должна принимать обратный вызов, который будет передан в именованный кортеж SymbolInfo для обработки функцией фильтра. Вот несколько примеров.

Смотрите пример в symbols_get, пожалуйста

Пример:

importMetaTrader5asmt5
# отображение данных о пакете MetaTrader 5
print("Автор пакета MetaTrader5: ",mt5.__author__)
print("Версия пакета MetaTrader5: ",mt5.__version__)

# устанавливаем соединение с терминалом MetaTrader 5
if not mt5.initialize():
print("initialize() failed, error code =",mt5.last_error())
quit()

# получить все символы
symbols=mt5.symbols_get()
print('Символы: ', len(symbols))
count=0
# вывести на экран первые пять символов
for s in symbols:
count+=1
print("{}. {}".format(count,s.name))
if count==5: break
print()

# получить символы, содержащие RU в своем имени
ru_symbols=mt5.symbols_get("*RU*")
print('len(*RU*): ', len(ru_symbols))
for s in ru_symbols:
print(s.name)
print()

# получить символы, названия которых не содержат USD, EUR, JPY и GBP
group_symbols=mt5.symbols_get(group="*,!*USD*,!*EUR*,!*JPY*,!*GBP*")
print('len(*,!*USD*,!*EUR*,!*JPY*,!*GBP*):', len(group_symbols))
for s in group_symbols:
print(s.name,":",s)

# закрываем соединение с терминалом MetaTrader 5
mt5.shutdown()

Результат:
Автор пакета MetaTrader5: MetaQuotes Software Corp.
Версия пакета MetaTrader5: 5.0.29
Символы: 84
1. EURUSD
2. GBPUSD
3. USDCHF
4. USDJPY
5. USDCNH

len(*RU*): 8
EURUSD
USDRUB
USDRUR
EURRUR
EURRUB
FORTS.RUB.M5
EURUSD_T20
EURUSD4

len(*,!*USD*,!*EUR*,!*JPY*,!*GBP*): 13
AUDCAD : SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session...
AUDCHF : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
AUDNZD : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
CADCHF : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
NZDCAD : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
NZDCHF : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
NZDSGD : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
CADMXN : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
CHFMXN : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
NZDMXN : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
FORTS.RTS.M5 : SymbolInfo(custom=True, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, ...
FORTS.RUB.M5 : SymbolInfo(custom=True, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, ...
FOREX.CHF.M5 : SymbolInfo(custom=True, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, ...

Documentation on MQL5: Integration / MetaTrader for Python / symbols_get
Documentation on MQL5: Integration / MetaTrader for Python / symbols_get
  • www.mql5.com
AUDCAD : SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session... AUDCHF : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi...
Причина обращения: