Как запустить скрипт Python из MQL5?

 
Почитал справку и статьи, везде описывается как запустить МТ5 из Python и выполнять из Python команды MQL5. Мы с ИИ сделали на Python прототип стратегии и задача обратная - как запустить этот скрипт или его отдельные функции из MQL5 и получить ответные данные? Это вообще возможно? Пока я нашел только предложение из 20 века обмениваться данными через файлы!!! 
 
Alexey Volchanskiy:
Почитал справку и статьи, везде описывается как запустить МТ5 из Python и выполнять из Python команды MQL5. Мы с ИИ сделали на Python прототип стратегии и задача обратная - как запустить этот скрипт или его отдельные функции из MQL5 и получить ответные данные? Это вообще возможно? Пока я нашел только предложение из 20 века обмениваться данными через файлы!!! 

две статьи видел: это первая - нет данных? или из этой подобное изобразить .... 

Интеграция MQL5: Python
Интеграция MQL5: Python
  • 2025.02.20
  • www.mql5.com
Python — известный и популярный язык программирования со множеством функций, особенно в областях финансов, науки о данных, искусственного интеллекта и машинного обучения. Python — мощный инструмент, который может быть полезен и в трейдинге. MQL5 позволяет нам использовать этот мощный язык для эффективного достижения наших целей. В этой статье мы рассмотрим некоторые базовые сведения о Python и расскажем, как его можно интегрировать в MQL5.
 
Alexey Volchanskiy:
Почитал справку и статьи, везде описывается как запустить МТ5 из Python и выполнять из Python команды MQL5. Мы с ИИ сделали на Python прототип стратегии и задача обратная - как запустить этот скрипт или его отдельные функции из MQL5 и получить ответные данные? Это вообще возможно? Пока я нашел только предложение из 20 века обмениваться данными через файлы!!! 

ты всё правильно понял. Если главный это советник на MQL, то вызов питона через файлы, пайпы, exec или общие базы. 

или переписывай всю логику советника в тормоза питона, тогда питон будет главным а терминал просто исполнителем

PS/ можно и сам интерпретатор питона запустить в советнике, но один на весь терминал. Второй интерпретатор уже не запустишь без side-эффектов и ошибок

 
Roman Shiredchenko #:

две статьи видел: это первая - нет данных? или из этой подобное изобразить .... 

Эту статью читал, там про то, как дергать МТ5 из Питона, а надо наоборот.
 
Maxim Kuznetsov #:

ты всё правильно понял. Если главный это советник на MQL, то вызов питона через файлы, пайпы, exec или общие базы. 

или переписывай всю логику советника в тормоза питона, тогда питон будет главным а терминал просто исполнителем

PS/ можно и сам интерпретатор питона запустить в советнике, но один на весь терминал. Второй интерпретатор уже не запустишь без side-эффектов и ошибок

Нет, советник на тормозном питоне это извращение )). Пожалуй, сделаю на MMF, самый быстрый вариант. Типа такого, это ИИ Алиса написала:
#import "kernel32.dll"
   int CreateFileMappingA(int hFile, int lpAttributes, int flProtect,
                        int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
   int MapViewOfFile(int hFileMappingObject, int dwDesiredAccess,
                       int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytesToMap);
   bool UnmapViewOfFile(int lpBaseAddress);
   bool CloseHandle(int hObject);
#import

void WriteToMMF(double &data[], string mapName) {
   // Создаём MMF (4096 байт = 512 double)
   int hMap = CreateFileMappingA(-1, 0, 0x04, 0, 4096, mapName);
   if (hMap == 0) {
      Print("CreateFileMapping failed");
      return;
   }

   // Получаем указатель на область памяти
   int pData = MapViewOfFile(hMap, 0x0004, 0, 0, 4096);
   if (pData == 0) {
      CloseHandle(hMap);
      Print("MapViewOfFile failed");
      return;
   }

   // Пишем массив double в MMF через FileWriteArray
   // MQL5 позволяет писать в любой адрес памяти, если он валиден
   int hMem = FileOpen("memory", FILE_WRITE|FILE_BIN); // "memory" — специальный флаг
   if (hMem != INVALID_HANDLE) {
      FileSeek(hMem, pData, SEEK_SET);
      FileWriteArray(hMem, data, 0, ArraySize(data));
      FileClose(hMem);
   } else {
      Print("FileOpen for memory failed");
   }

   UnmapViewOfFile(pData);
   CloseHandle(hMap);
}
Вот это 
#import "kernel32.dll"

сейчас решается через \MQL5\Include\WinAPI\memoryapi.mqh, а вот код на питоне, тоже ее творчество

import mmap
import struct

with mmap.mmap(-1, 4096, tagname="MySharedMemory") as mm:
    data = []
    for i in range(10):  # читаем 10 double
        mm.seek(i * 8)
        value = struct.unpack('d', mm.read(8))[0]
        data.append(value)
    print("Received:", data)

 Ты писал: «можно и сам интерпретатор питона запустить в советнике, но один на весь терминал»/ Ок, запустили, а как обмениваться?

 
Питонские скрипты запускаются на графике МТ5 как родные - непосредственно из навигатора. Это дает основание предполагать, что они также могут запускаться и через MQL5. Помнится fxsaber делал автоматический запуск MQL-программ на чартах - подпихнуть туда питон вероятно пока никто не пробовал. Про получение ответных данных - другой вопрос - пайпы, файлы, вебсокеты, бд - всё сойдет.
Expert
Expert
  • 2017.08.28
  • www.mql5.com
Библиотека чтения/записи параметров произвольных советников.
 
Alexey Volchanskiy #:
Нет, советник на тормозном питоне это извращение )). Пожалуй, сделаю на MMF, самый быстрый вариант. Типа такого, это ИИ Алиса написала:
Вот это 

сейчас решается через \MQL5\Include\WinAPI\memoryapi.mqh, а вот код на питоне, тоже ее творчество

 Ты писал: «можно и сам интерпретатор питона запустить в советнике, но один на весь терминал»/ Ок, запустили, а как обмениваться?

если уж запустили, то Python C API https://docs.python.org/3/c-api/index.html простынка длинная, но для минимума нужно всего 3-4 функции. Запихнуть массив double в объект питона, вызвать функцию, провести обратную операцию.

просто сам по себе интерпретатор питона не вполне дружен с тред-моделью терминала. Запуск второго интерпретатора в том-же или отдельном треде (на другом символе, другом чарте, советнике, etc) может привести к непредсказуемым последствиям.

Python/C API Reference Manual
Python/C API Reference Manual
  • docs.python.org
This manual documents the API used by C and C++ programmers who want to write extension modules or embed Python. It is a companion to Extending and Embedding the Python Interpreter, which describes...
 
Maxim Kuznetsov #:
Alexey Volchanskiy #:
Нет, советник на тормозном питоне это извращение )). Пожалуй, сделаю на MMF, самый быстрый вариант. Типа такого, это ИИ Алиса написала:
Вот это 

сейчас решается через \MQL5\Include\WinAPI\memoryapi.mqh, а вот код на питоне, тоже ее творчество

 Ты писал: «можно и сам интерпретатор питона запустить в советнике, но один на весь терминал»/ Ок, запустили, а как обмениваться?

если уж запустили, то Python C API https://docs.python.org/3/c-api/index.html простынка длинная, но для минимума нужно всего 3-4 функции. Запихнуть массив double в объект питона, вызвать функцию, провести обратную операцию.

просто сам по себе интерпретатор питона не вполне дружен с тред-моделью терминала. Запуск второго интерпретатора в том-же или отдельном треде (на другом символе, другом чарте, советнике, etc) может привести к непредсказуемым последствиям.

Stanislav Korotky #:
Питонские скрипты запускаются на графике МТ5 как родные - непосредственно из навигатора. Это дает основание предполагать, что они также могут запускаться и через MQL5. Помнится fxsaber делал автоматический запуск MQL-программ на чартах - подпихнуть туда питон вероятно пока никто не пробовал. Про получение ответных данных - другой вопрос - пайпы, файлы, вебсокеты, бд - всё сойдет.
Это интересно. Я обрисую свои цели, чтоб бы было понятно, что реально нужно. Сейчас работаю с Дипсик и Алисой, так как в Питоне я слабак. Пока научились вынимать минутки:
import yfinance as yf

# 2. ЗАГРУЗКА ДАННЫХ (7 дней минуток)
print("📥 Качаем минутные данные EUR/USD...")
data_1m = yf.download("EURUSD=X", period="7d", interval="1m", progress=False)
close_prices = data_1m[('Close', 'EURUSD=X')].values

print(f"✅ Скачано: {len(close_prices)} минутных баров")
print(f"📊 Диапазон цен: {close_prices.min():.5f} - {close_prices.max():.5f}")

 А также фильтровать их фильтрами с нулевой фазовой задержкой, строить HP канал. То есть на питоне только быстрое прототипирование, потом все буду переводить на MQL5. Но сейчас хочется прогнать прототип в тестере МТ5, используя питоновские наработки.  Вот и думаю, как лучше это сделать...
1

2

 
Alexey Volchanskiy #:
фильтрами с нулевой фазовой задержкой

:-)

они полфазы "перерисовывают"

чудес к сожалению не бывает

PS/ просто к слову пришлось

 
Alexey Volchanskiy #:
... Пока научились вынимать минутки

Можно вынимать котировки по любым символам в терминале, используя функцию из Python-модуля интеграции с терминалом. Пример есть в справке внизу страницы.

Документация по MQL5: copy_rates_from / Python интеграция
Документация по MQL5: copy_rates_from / Python интеграция
  • www.mql5.com
Получает бары из терминала MetaTrader 5, начиная с указанной даты. Параметры symbol [in]  Имя финансового инструмента, например, ...
 
Yuriy Bykov #:

Можно вынимать котировки по любым символам в терминале, используя функцию из Python-модуля интеграции с терминалом. Пример есть в справке внизу страницы.

Спасибо за ценную наводку, вот то, что мне нужно: copy_ticks_from

У меня давно скальпер работает на тиковых данных, выборка по таймеру с частотой 1 Гц, потом методы DSP. Для прототипа на питоне самое то!