Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos
Сообщений: 38
•
1, 2, 3, 4
Написание робота на Питон для МТ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 быстрее и в расчетах, тогда зачем нужен Питон? Нестыковка какая-то.

-

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 раз.
Каждый заблуждается в меру своих возможностей.
Кто сейчас на форуме?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Права доступа к форуму
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения