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

 
amirhossein rahbari:

Здравствуйте, дорогие друзья!

Я начинающий пользователь meta trader, мне очень интересно использовать python API для своих торговых задач,

но когда я пытался загрузить все символы по

symbols=mt5.symbols_get()

он возвращает None в качестве символов, но когда я написал в другом скрипте

rates = mt5.copy_rates_from("غسالم", mt5.TIMEFRAME_D1, utc_from)

он выдает соответствующие данные для غسالم и работает хорошо.

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

мой брокер: Mofid

и символы написаны на персидском языке.

Ваш терминал должен быть обновлен до последней бета-версии. Войдите в демо-счет MetaQuotes, затем перейдите в раздел Помощь>Проверить наличие обновлений. Следует отметить, что пакет MetaTrader5 никогда не вызовет исключение, поэтому вы должны спросить, были ли ошибки после выполнения операций, вызвав last_error(). Если вы хотите использовать стандартные соглашения python, вы можете использовать pymt5adapter, чтобы инкапсулировать ваш код в try: except...

import pymt5adapter as mta


def main():
    try:
        symbols = mta.symbols_get()
    except mta.MT5Error as e:
        print(e.error_code, e.description)
    else:
        print(f'First symbol is {symbols[0].name}')
    finally:
        print("Main finished")


if __name__ == '__main__':
    with mta.connected(raise_on_errors=True):
        main()
 

Спасибо за добавление функции sys.argv! Это потрясающе и определенно поможет со скриптами, которые падают на график. Спасибо за проделанную работу. Однако у меня возникла проблема с имплантацией. Значения, возвращаемые для таймфреймов, неожиданны. Вместо того чтобы вернуть значение перечисления таймфрейма const, я получаю эквивалент количества минут в периоде. Это неожиданно, учитывая, что API имеет разные значения для таймфреймов. Пример:

import sys

import pymt5adapter as mt5


def time_frame_to_str(tf):
    tfs = {
        mt5.TIMEFRAME_M1 : 'M1',
        mt5.TIMEFRAME_M2 : 'M2',
        mt5.TIMEFRAME_M3 : 'M3',
        mt5.TIMEFRAME_M4 : 'M4',
        mt5.TIMEFRAME_M5 : 'M5',
        mt5.TIMEFRAME_M6 : 'M6',
        mt5.TIMEFRAME_M10: 'M10',
        mt5.TIMEFRAME_M12: 'M12',
        mt5.TIMEFRAME_M15: 'M15',
        mt5.TIMEFRAME_M20: 'M20',
        mt5.TIMEFRAME_M30: 'M30',
        mt5.TIMEFRAME_H1 : 'H1',
        mt5.TIMEFRAME_H2 : 'H2',
        mt5.TIMEFRAME_H4 : 'H4',
        mt5.TIMEFRAME_H3 : 'H3',
        mt5.TIMEFRAME_H6 : 'H6',
        mt5.TIMEFRAME_H8 : 'H8',
        mt5.TIMEFRAME_H12: 'H12',
        mt5.TIMEFRAME_D1 : 'D1',
        mt5.TIMEFRAME_W1 : 'W1',
        mt5.TIMEFRAME_MN1: 'MN1',
    }
    return tfs.get(tf, f'{tf} not a valid enum constant value for timeframe')


def main():
    if not len(sys.argv) == 3:
        print('Missing symbol and timeframe args')
        return
    symbol, timeframe = sys.argv[1], int(sys.argv[2])
    tf_str = time_frame_to_str(timeframe)
    print(f'Script was dropped on {symbol}, {tf_str}')
    try:
        rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 1)
        print(rates)
    except mt5.MT5Error as e:
        print(f'CopyRates failed: {e.error_code}, {e.description}')


if __name__ == '__main__':
    with mt5.connected(raise_on_errors=True):
        main()

Вывод при запуске этого примера скрипта на графике H1:

Script was dropped on EPM20, 60 not a valid enum constant value for timeframe
CopyRates failed: -2, Terminal: Invalid params('EPM20', 60, 0, 1){}
 
nicholi shen:

Спасибо за добавление функции sys.argv! Это потрясающе и определенно поможет со скриптами, которые падают на график. Спасибо за проделанную работу. Однако у меня возникла проблема с имплантацией. Значения, возвращаемые для таймфреймов, неожиданны. Вместо того чтобы вернуть значение перечисления таймфрейма const, я получаю эквивалент количества минут в периоде. Это неожиданно, учитывая, что API имеет разные значения для таймфреймов. Пример:

Вывод при запуске этого примера скрипта на графике H1:

Я обновил пакет pymt5adapter и добавил функцию parse_args, которая будет автоматически конвертировать минуты, передаваемые терминалом, в соответствующий таймфрейм.

import pymt5adapter as mta


def main():
    symbol, tf = mta.parse_args()
    print(symbol, tf.name)
    rates = mta.copy_rates_from_pos(symbol, tf, 0, 1)
    print(rates)


if __name__ == '__main__':
    with mta.connected(raise_on_errors=True):
        main()

Обновить:

pip install -U pymt5adapter
 
nicholi shen:

Спасибо за добавление функции sys.argv! Это потрясающе и определенно поможет со скриптами, которые падают на график. Спасибо за проделанную работу. Однако у меня возникла проблема с имплантацией. Значения, возвращаемые для таймфреймов, неожиданны. Вместо того чтобы вернуть значение перечисления таймфрейма const, я получаю эквивалент количества минут в периоде. Это неожиданно, учитывая, что API имеет разные значения для таймфреймов. Пример:

Вывод при запуске этого примера скрипта на графике H1:

Это наша ошибка, она будет исправлена в следующей бета-версии.
 

Привет всем.
Хотел задать вопрос по интеграции python с metatrader...
Я пытаюсь инициализировать metatrader 5 через python (с предопределенными данными для входа), все работает хорошо для одного и того же брокерского счета, но как только я пытаюсь инициализировать metatrader с данными для входа от другого брокера, то он не входит в счет.

например,
если у меня установлена платформа метатрейдера BrokerABC
и когда я запускаю скрипт с этим кодом с адресом сервера и логином и паролем от счета "Broker ABC", то все работает отлично:

if not mt5.initialize(path=C:\Program Files\Broker ABC\terminal.exe, login=123456, server= BrokerABC-Demo,password=123123, ):


Но когда я запускаю скрипт с этим кодом, содержащим данные для входа в аккаунт какого-то другого брокера (XYZBroker), на платформе Broker ABC
, он открывает платформу metatrader, но не входит в аккаунт.

if not mt5.initialize(path=C:\Program Files\Broker ABC\terminal.exe, login=654321, server= XYZBroker-Demo,password=654321, ):


Какие-нибудь предложения, почему он не может войти в аккаунт от любого другого брокера на платформе metatrader другого брокера?

 
mhdumer016:

Привет всем.
Хотел задать вопрос по интеграции питона с метатрейдером...
Я пытаюсь инициализировать метатрейдер 5 через питон (с заданными данными для входа), все работает хорошо для одного брокерского счета, но как только я пытаюсь инициализировать метатрейдер с данными для входа от другого брокера, то он не входит в счет.

например,
если у меня установлена платформа метатрейдера BrokerABC
и когда я запускаю скрипт с этим кодом с адресом сервера и логином и паролем от счета "Broker ABC", то все работает отлично:


Но когда я запускаю скрипт с этим кодом, содержащим данные для входа в аккаунт другого брокера (XYZBroker), на платформе Broker ABC
, он открывает платформу metatrader, но не входит в аккаунт.


Какие-нибудь предложения, почему он не может войти в аккаунт от любого другого брокера на платформе metatrader другого брокера?

Необходимо проверить значение MetaTrader5.last_error.

 
nicholi shen:

Необходимо проверить значение MetaTrader5.last_error.

Здравствуйте, Nicholi Shen, спасибо за ответ.
Я проверил ошибки, но ничего не смог найти, вот ошибка, которую показывает python ide:

initialize() failed, error code = (-10003, "IPC initialize failed, Pipe server didn't answer in 60 sec")

Запуск кода python открывает платформу metatrader, но он не входит в систему с предоставленными данными, но когда я вручную захожу в metatrader и нажимаю на accounts-> login-> и ввожу те же данные для входа из скрипта python, то он успешно входит в учетную запись

 
mhdumer016:

Привет, Ничоли Шен, спасибо за ответ.
Я проверил ошибки, но ничего не смог найти, вот ошибка, которую показывает python ide:

initialize() failed, error code = (-10003, "IPC initialize failed, Pipe server didn't answer in 60 sec")

Запуск кода python открывает платформу metatrader, но он не входит в систему с предоставленными данными, но когда я вручную захожу в metatrader и нажимаю на accounts-> login-> и ввожу те же данные для входа из скрипта python, то он успешно входит в учетную запись

init_kwargs = dict(
    path=r'C:\Program Files\Broker ABC\terminal64.exe',
    login=654321,
    server='XYZBroker-Demo',
    password='654321',
)
assert type(init_kwargs['password']) is str
assert 'terminal64.exe' in init_kwargs['path']

if not mt5.initialize(**init_kwargs):
    pass
 
nicholi shen:
Вы имеете в виду заменить текущий код инициализации на код, который вы предоставили?

Я сделал что-то вроде этого:
import MetaTrader5 as mt5
import kwargs
# display data on the MetaTrader 5 package

print("MetaTrader5 package author: ",mt5.__author__)
print("MetaTrader5 package version: ",mt5.__version__)
 
# establish MetaTrader 5 connection to a specified trading account
init_kwargs = dict(
    path=r'C:\Program Files\Broker ABC\terminal64.exe',
    login=35385303,
    server='XYZBroker-Demo',
    password='cv5sjsze',
)
assert type(init_kwargs['password']) is str
assert 'terminal64.exe' in init_kwargs['path']

if not mt5.initialize(**init_kwargs):
    pass 

 
# display data on connection status, server name and trading account
print(mt5.terminal_info())
# display data on MetaTrader 5 version
print(mt5.version())
 
# shut down connection to the MetaTrader 5 terminal
mt5.shutdown()

но все равно ничего...

он запускает mertatrader и пытается войти в систему с данными, но так и не входит в аккаунт...

вот что происходит: https://paste.pics/299c254cdd8b42cc0a2203f9ea118a2c

 
mhdumer016:
Вы имеете в виду заменить текущий код инициализации на код, который вы предоставили?

Я сделал что-то вроде этого:

но все равно ничего...

он не входит в учетную запись и возвращает это в python IDE:

Если все работает, когда вы вызываете initialize без args, но ломается, когда вы пытаетесь вызвать его с args, значит, вы вводите что-то неправильно.