Написание робота на Питон для МТ5

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Написание робота на Питон для МТ5

Сообщение Рэндом » 17 июн 2020, 04:11

Это не такая сложная тема как кажется. С недавних пор библиотека МТ5 для Питона пригодна для написания роботов. Их написание и будет рассмотрено в этой теме. Только учтите у вас не будет тестера. У вас не будет готовых индикаторов. Зато у вас будет множество готовых библиотек для использования в коде. Например машинное обучение. В этой теме будет создан простой пример робота со случайными входами и мартингейлом. Будет код с пояснениями.
Полный код https://github.com/RandomKori/PythonRobotMT5
Сейчас там заготовка робота. Со временем будет написан полноценный робот.

Справка по Питону для МТ5 https://www.mql5.com/ru/docs/integratio ... etatrader5
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Написание робота на Питон для МТ5

Сообщение Рэндом » 17 июн 2020, 04:20

Девайте рассмотрим заготовку робота.

Код: выделить все
import MetaTrader5 as mt5

def OnTick():
    print("OnTick")
    return

mt5.initialize()
v=mt5.version()
print(v)

d=mt5.symbol_info_tick("EURUSD").time_msc;
while(True):
    tick=mt5.symbol_info_tick("EURUSD")
    print(tick)
    if tick.time_msc!=d:
        d=tick.time_msc
        OnTick()


Первое мы подключаем МТ5:
Код: выделить все
import MetaTrader5 as mt5


Далее создаем функцию OnTick. Она будет вызываться из основного кода В ней собственно и должна делаться вся работа робота.

Рассмотрим основной код.
Код: выделить все
mt5.initialize()
v=mt5.version()
print(v)

Здесь мы подключаем терминал и выводим в консоль его версию.

Код: выделить все
d=mt5.symbol_info_tick("EURUSD").time_msc;
while(True):
    tick=mt5.symbol_info_tick("EURUSD")
    print(tick)
    if tick.time_msc!=d:
        d=tick.time_msc
        OnTick()

Это основной код который в бесконечном цикле получает время в милисекундах прихода тика и если оно отличается от пришедшего ранее, вызывается функции OnTick. Опрос в бесконечном цикле это самый простой способ отследить каждый новый тик.
Как видите все просто.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Написание робота на Питон для МТ5

Сообщение Haos » 17 июн 2020, 09:29

Тема добавлена в структуру тем раздела. Надеюсь будет продолжение. Писать есть что, особенно проблема быстродействия актуальна.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Написание робота на Питон для МТ5

Сообщение Рэндом » 17 июн 2020, 12:38

Продолжение будет. Будет готовый робот. Быстродействие это не про Питон.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Написание робота на Питон для МТ5

Сообщение Haos » 17 июн 2020, 12:46

Рэндом писал(а):Быстродействие это не про Питон.

Да? А как же он может за доли секунды проверять пришел или нет тик? Если есть такая скорость в тысячу раз быстрее тика, то разве вычислительные операции не может проводить быстрее того же МТ5? Именно об обработке данных речь идет, понятно, что скорость торговых операций это к надстройке, типа, МТ4, МТ5 и т.п.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Написание робота на Питон для МТ5

Сообщение Рэндом » 17 июн 2020, 21:30

MQL ,быстрее. На сайте mql5 проводили тесты.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Написание робота на Питон для МТ5

Сообщение Haos » 17 июн 2020, 22:03

Если МТ5 быстрее и в расчетах, тогда зачем нужен Питон? Нестыковка какая-то. :ne_vi_del:
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Написание робота на Питон для МТ5

Сообщение Рэндом » 17 июн 2020, 22:16

Питон нужен для сложных роботов с использованием различных крутых библиотек. Например машинного обучения.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Написание робота на Питон для МТ5

Сообщение Рэндом » 17 июн 2020, 22:37

Файл robot1.py практически готовый робот. Давайте рассмотрим функцию OnTick:
Код: выделить все
def OnTick():
    print("OnTick")
    if mt5.positions_total()==0:
        n=rnd.random()
        if n>0.5:
            print("Buy")
            point = mt5.symbol_info(symbol).point
            price = mt5.symbol_info_tick(symbol).ask
            request = {
                        "action": mt5.TRADE_ACTION_DEAL,
                        "symbol": symbol,
                        "volume": OnLot(),
                        "type": mt5.ORDER_TYPE_BUY,
                        "price": price,
                        "sl": price - SL * point,
                        "tp": price + TP * point,
                        "deviation": deviation,
                        "magic": magic,
                        "comment": "python script open",
                        "type_time": mt5.ORDER_TIME_GTC,
                        "type_filling": mt5.ORDER_FILLING_FOK,
                    }
            result = mt5.order_send(request)
            print("Error ",result.retcode)
        else:
            print("Sell")
            point = mt5.symbol_info(symbol).point
            price = mt5.symbol_info_tick(symbol).bid
            request = {
                        "action": mt5.TRADE_ACTION_DEAL,
                        "symbol": symbol,
                        "volume": OnLot(),
                        "type": mt5.ORDER_TYPE_SELL,
                        "price": price,
                        "sl": price + SL * point,
                        "tp": price - TP * point,
                        "deviation": deviation,
                        "magic": magic,
                        "comment": "python script open",
                        "type_time": mt5.ORDER_TIME_GTC,
                        "type_filling": mt5.ORDER_FILLING_FOK,
                    }
            result = mt5.order_send(request)
            print("Error ",result.retcode)
    return

В ней проверяется есть ли открытые позиции и если их нет, то открывается позиция по случайному числу. Открытие позиций очень похоже на MQL5. Поэтому детально их рассматривать не будем. Остается сделать функцию для расчета лота OnLot и советник готов. Пока она просто передает лот заданный глобальной переменной Lot.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Написание робота на Питон для МТ5

Сообщение Рэндом » 19 июн 2020, 06:04

Робот полностью готов. Нам осталось рассмотреть функцию определения лота.
Код: выделить все
def OnLot():
    l=Lot
    from_date=datetime.datetime(2020,1,1)
    to_date=datetime.datetime.today()+relativedelta(days=+1)
    pos=None
    pos=mt5.history_deals_get(from_date, to_date)
    if pos!=None:
        p=len(pos)
        while(p>0):
            p=p-1
            ps=pos[p].type
            print(pos[p])
            if ps==0 or ps==1:
                if pos[p].profit<0.0:
                    l=pos[p].volume*2
                break
    return l

Сначала мы загружаем историю торговли. Мы могли бы загрузить последнюю сделку. Именно она нам нужна. Только сделать это не просто. Нет способа загрузить сделку по индексу. Есть способ загрузить по тикету. Есь способ загрузить по ид позиции. Только ид позиции это не тоже что индекс. Для их использования нужно их сохранять при открытии сделки. Лучше использовать ид позиции. Так как закрытие позиции проходит отдельной сделкой тикет которой мы не можем получить при открытии. Поэтому выбран вариант загрузки истории по диапазону дат. С выбором начальной даты всё понятно. А вот с выбором конечной есть проблемы. Если выбрать текущий день, то история за него не будет получена. Надо выбрать следующий за текущем день. Далее всё просто. Мы выбираем последнюю сделку по её типу и если профит по ней меньше нуля, берём ее лот и умножаем на 2.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения