• Написание робота на Питон для МТ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
     
    Сообщений: 10961
    Зарегистрирован: 18 июл 2013, 08:05
    Средств на руках: 0.10 Доллар
    Группа: Администраторы
    Благодарил (а): 987 раз.
    Поблагодарили: 2769 раз.
    Каждый заблуждается в меру своих возможностей.

    Написание робота на Питон для МТ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
     
    Сообщений: 10961
    Зарегистрирован: 18 июл 2013, 08:05
    Средств на руках: 0.10 Доллар
    Группа: Администраторы
    Благодарил (а): 987 раз.
    Поблагодарили: 2769 раз.
    Каждый заблуждается в меру своих возможностей.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Написание робота на Питон для МТ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
     
    Сообщений: 10961
    Зарегистрирован: 18 июл 2013, 08:05
    Средств на руках: 0.10 Доллар
    Группа: Администраторы
    Благодарил (а): 987 раз.
    Поблагодарили: 2769 раз.
    Каждый заблуждается в меру своих возможностей.

    Написание робота на Питон для МТ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
     
    Сообщений: 10961
    Зарегистрирован: 18 июл 2013, 08:05
    Средств на руках: 0.10 Доллар
    Группа: Администраторы
    Благодарил (а): 987 раз.
    Поблагодарили: 2769 раз.
    Каждый заблуждается в меру своих возможностей.


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

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

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

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

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