Хорошая статья. График предсказаний на тестовых данных разочаровывает. Вы могли бы пропустить все это моделирование/обучение DNN и просто использовать предсказание следующей цены, равной последней известной цене. Готов поспорить, что точность предсказания такой тривиальной модели будет выше, чем при использовании вашей модели DNN. Я предлагаю сравнить эти две точности и показать их здесь. В целом, использовать DNN для предсказания цен - плохая идея. Они лучше подходят для классификации ценовых моделей (например, покупка, продажа, удержание). Кроме того, количество весов в вашей DNN просто астрономическое. Должно быть, это перебор.
Vladimir #: Хорошая статья. График предсказаний на тестовых данных разочаровывает. Вы могли бы пропустить все это моделирование/обучение DNN и просто использовать предсказание следующей цены, равной последней известной цене. Готов поспорить, что точность предсказания такой тривиальной модели будет выше, чем при использовании вашей модели DNN. Я предлагаю сравнить эти две точности и показать их здесь. В целом, использовать DNN для предсказания цен - плохая идея. Они лучше подходят для классификации ценовых моделей (например, покупка, продажа, удержание). Кроме того, количество весов в вашей DNN просто астрономическое. Наверное, это перебор.
Спасибо, Владимир. Просто для обсуждения, когда позволит время, я бы модифицировал эту модель для классификации для сравнения.
Пожалуйста, дайте мне знать, если у вас есть идеи.
В учебнике дается одна партия SAMPLE_SIZE количества близких входов, вам же нужна одна партия входов input_count.
Также в вашей модели в качестве входных данных используются не плавающие числа, а двойные,
Примечание модератора: Это сообщение не соответствует порядку, так как сообщения ниже были перемещены из другой темы. Пожалуйста, смотрите сообщение ниже.
Можем ли мы вместе разобраться с этой моделью ONNX?
Здравствуйте, сообщество MQL5, я пытался следовать этому руководству по использованию ONNX в ваших советниках. В учебнике в качестве модели была выбрана нейронная сеть, я же использовал дерево с градиентным усилением.
Я построил модель с помощью пакета InterpretML Python и экспортировал ее в ONNX с помощью ebm2onnx.
Я кратко опишу процесс обучения модели.
1) Модель была обучена на 5 входах, OHLC и высоте, высота рассчитывается как ((H + L) / 2) - C.
2) Модель представляет собой бинарный классификатор, цель которого - классифицировать следующую свечу как UP (1) или DOWN (0).
Данные, используемые для обучения модели.
3) Затем модель была экспортирована в формат ONNX.
Представление модели в формате ONNX.
Чтобы заставить модель работать, я отклонился от кода в учебнике и продолжал редактировать код, пытаясь заставить модель ONNX работать, но теперь я действительно не знаю, что я делаю неправильно. Я продолжаю получать ошибку о том, что хэндл модели недействителен.
Я прикрепил MQL5-код ниже.
Теперь я кратко опишу шаги, которые я предпринял в своем коде и которые отличаются от того, что описано в учебнике, а также объясню, почему я отклонился от учебника
1) Строка 57: Установка входной формы модели. В учебнике для установки входной и выходной формы использовались 3 измерения, т.е. {1,SAMPLE_SIZE,1}; однако когда я следовал этому подходу, я продолжал получать ошибку, а именно ошибку 5808. После обычного процесса проб и ошибок я понял, что если использовать только 1 измерение, количество входов, то ошибка исчезнет.
2) Строка 68: Установка выходной формы модели.
Логика та же, что и выше.
Другие отклонения, которые я сделал, не влияют на модель, например, я вел учет времени, используя логику, которая показалась мне более интуитивной, чем логика, реализованная в учебнике. Мне не нужно было нормализовать входные данные, потому что это древовидная модель.
Если вы можете заметить другие ошибки, которые я допустил, я буду признателен за ваше понимание.
//+------------------------------------------------------------------+//|ONNX.mq5 |//|Copyright 2023, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+//Мета свойства#property copyright"Gamuchirai Zororo Ndawana"#property link"https://www.mql5.com"#property version"1.00"//Торговая библиотека#include <Trade\Trade.mqh>
//Считывание нашей модели ONNX и сохранение ее в массиве данных#resource "\\Files\\Python\\Volatility_75_EBM.onnx"asuchar ExtModel[]
//Определения ключевых слов#define SAMPLE_SIZE 998#define PRICE_UP 1#define PRICE_DOWN 0//Глобальные переменныеlong ExtHandle = INVALID_HANDLE;
int ExtPredictedClass = -1;
datetime ExtNextBar = 0;
datetime ExtNextMinute =0;
float ExtMin = 0;
float ExtMax = 0;
double min_volume;
CTrade ExtTrade;
//Входыintinput lot_mutliple = 1; //На сколько раз больше минимального лота мы должны ввести?intOnInit()
{
//Проверьте, соответствуют ли символ и временной интервал условиям обученияif(_Symbol != "Volatility 75 Index" || _Period != PERIOD_M1)
{
Comment("Model must be used with the Volatility 75 Index on the 1 Minute Chart");
return(INIT_FAILED);
}
//Создайте модель ONNX из нашего массива данных
ExtHandle = OnnxCreateFromBuffer(ExtModel,ONNX_DEFAULT);
Print("ONNX Create from buffer status ",ExtHandle);
//Проверяем, действителен ли хэндлif(ExtHandle == INVALID_HANDLE)
{
Comment("ONNX create from buffer error ", GetLastError());
return(INIT_FAILED);
}
//Установка формы входаlong input_count = OnnxGetInputCount(ExtHandle);
constlong input_shape[] = {input_count};
Print("Total model inputs : ",input_count);
if(!OnnxSetInputShape(ExtHandle,0,input_shape))
{
Comment("ONNX set input shape error ", GetLastError());
OnnxRelease(ExtHandle);
return(INIT_FAILED);
}
//Установка формы выводаlong output_count = OnnxGetOutputCount(ExtHandle);
constlong output_shape[] = {output_count};
Print("Total model outputs : ",output_count);
if(!OnnxSetOutputShape(ExtHandle,0,output_shape))
{
Comment("ONNX set output shape error ", GetLastError());
OnnxRelease(ExtHandle);
return(INIT_FAILED);
}
//Получите минимально допустимый объем торгов
min_volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
return(INIT_SUCCEEDED);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Функция деинициализации эксперта|//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---if(ExtHandle != INVALID_HANDLE)
{
OnnxRelease(ExtHandle);
ExtHandle = INVALID_HANDLE;
}
}
//+------------------------------------------------------------------+//| Функция экспертного тика|//+------------------------------------------------------------------+voidOnTick()
{
//---//Трекеры времениstaticdatetime time_stamp;
datetime time = iTime(_Symbol,PERIOD_M1,0);
//Проверьте новый барif(time_stamp != time)
{
time_stamp = time;
PredictedPrice();
Print("Predicted class: ",ExtPredictedClass);
if(ExtPredictedClass == PRICE_UP || ExtPredictedClass == PRICE_DOWN)
if(PositionSelect(_Symbol))
CheckForClose();
if(PositionsTotal() == 0)
CheckForOpen();
}
}
//+------------------------------------------------------------------+void CheckForOpen(void)
{
ENUM_ORDER_TYPE signal = WRONG_VALUE;
//Проверка сигналовif(ExtPredictedClass == PRICE_DOWN)
{
signal = ORDER_TYPE_SELL;
}
elseif(ExtPredictedClass == PRICE_UP)
{
signal = ORDER_TYPE_BUY;
}
if(signal != WRONG_VALUE && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
double price, sl = 0 , tp = 0;
double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
if(signal == ORDER_TYPE_SELL)
{
price = bid;
}
else
{
price = ask;
}
Print("Opening a new position: ",signal);
ExtTrade.PositionOpen(_Symbol,signal,min_volume,price,0,0);
}
}
void CheckForClose(void)
{
bool bsignal = false;
long type = PositionGetInteger(POSITION_TYPE);
if(type == POSITION_TYPE_BUY && ExtPredictedClass == PRICE_DOWN)
bsignal = true;
if(type == POSITION_TYPE_SELL && ExtPredictedClass == PRICE_UP)
bsignal = true;
if(bsignal && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
ExtTrade.PositionClose(_Symbol,3);
CheckForOpen();
}
}
void PredictedPrice(void)
{
vectorf output_data(1);
float open = float(iOpen(_Symbol,PERIOD_M1,1));
float high = float(iHigh(_Symbol,PERIOD_M1,1));
float low = float(iLow(_Symbol,PERIOD_M1,1));
float close = float(iClose(_Symbol,PERIOD_M1,1));
float height = float((((high + low) / 2) - close));
Print("Current open ",open);
Print("Current high ",high);
Print("Current low ",low);
Print("Current close ",close);
Print("Current height ",height);
vectorf input_data = {open,high,low,close,height};
Print("Input vector: ",input_data);
if(!OnnxRun(ExtHandle,ONNX_NO_CONVERSION,input_data,output_data))
{
Print("ONNX run error : ",GetLastError());
OnnxRelease(ExtHandle);
}
int predicted = int(output_data[0]);
Print("Model prediction: ",predicted);
Print(output_data);
if(predicted == 1)
{
ExtPredictedClass = PRICE_UP;
}
elseif(predicted == 0)
{
ExtPredictedClass = PRICE_DOWN;
}
Comment("Model Prediction: ", ExtPredictedClass);
}
Можем ли мы вместе устранить неполадки в этой модели ONNX?
Hello MQL5 community, I've been trying to follow this tutorial on how to use ONNX in your EA's. In the tutorial a neural network was the model of choice, I've used a gradient boosted tree.
Я построил модель, используя пакет InterpretML Python, и экспортировал ее в ONNX с помощью ebm2onnx.
Я кратко опишу процесс обучения модели.
1) Модель была обучена на 5 входах, OHLC и высоте, высота рассчитывается как ((H + L) / 2) - C.
2) Модель представляет собой бинарный классификатор, цель которого - классифицировать следующую свечу как UP (1) или DOWN (0).
Данные, используемые для обучения модели.
3) Затем модель была экспортирована в формат ONNX.
Представление модели в формате ONNX.
Чтобы заставить модель работать, я отклонился от кода в учебнике и продолжал редактировать код, пытаясь заставить модель ONNX работать, но теперь я действительно не знаю, что я делаю неправильно. Я продолжаю получать ошибку о том, что хэндл модели недействителен.
Я прикрепил MQL5-код ниже.
Теперь я кратко опишу шаги, которые я предпринял в своем коде и которые отличаются от того, что описано в учебнике, а также объясню, почему я отклонился от учебника
1) Строка 57: Установка входной формы модели. В учебнике для установки входной и выходной формы использовались 3 измерения, т.е. {1,SAMPLE_SIZE,1}; однако когда я следовал этому подходу, я продолжал получать ошибку, а именно ошибку 5808. После обычного процесса проб и ошибок я понял, что если использовать только 1 измерение, количество входов, то ошибка исчезнет.
2) Строка 68: Установка выходной формы модели.
Логика та же, что и выше.
Другие отклонения, которые я сделал, не влияют на модель, например, я вел учет времени, используя логику, которая показалась мне более интуитивной, чем логика, реализованная в учебнике. Мне не нужно было нормализовать входные данные, потому что это древовидная модель.
Если вы можете заметить другие ошибки, которые я допустил, я буду признателен за ваше понимание.
Спасибо, что поделились с нами, Ситан, я применил то, что вы указали, но ошибка все равно осталась.
Одна партия входных данных input_count.
Установите входной сигнал на двойное значение
Сообщение об ошибке.
Похоже, что MQL5 пока не поддерживает (точнее, ONNXMLTools не поддерживает) EBM's ONNX:
Если вы обратитесь к вложениям ONNX (особенно к model.eurusd.D1.10.class.onnx, который использует 4 входа) с сайта https://www.mql5.com/ru/articles/12484; и воспользуетесь Netron(веб-версией) для визуализации файлов onnx, вы увидите различия.
Думаю, следующие две статьи также помогут вам разобраться:
Object-oriented programming enables creation of a more compact code that is easy to read and modify. Here we will have a look at the example for three ONNX models.
Мы пытаемся использовать нейронную сеть keras с 11 предикторами в один момент времени (размер партии 32) для предсказаний на XauUsd (где выход - сингулярное число между 0 и 1). Сначала мы загружаемся из OnnxCreatefrombuffer (потому что сам OnnxCreate у нас не работает), затем мы всегда получаем ошибку на этапе OnnxRun, где я прикрепил обе ошибки ниже. Любая помощь по поводу того, в какую размерность переформировать входные данные, в какой формат поместить наш вектор-предсказатель (если это вообще должен быть вектор?), или просто любая помощь или предложения по синтаксису, чтобы помочь справиться с этими ошибками, была бы потрясающей. Мы пробовали перестраивать на всевозможные комбинации векторов 32,1,11, но не повезло, и мы не знаем, что делать дальше. Огромное спасибо всем, кто может помочь!!! Бен.
' error 5808'
' ONNX: входной параметр #0 тензора имеет неправильную размерность [0], попробуйте использовать OnnxSetInputShape'
'ONNX: неверный размер входного параметра #0, ожидалось 1408 байт вместо 480'
Кто-нибудь может мне помочь, потому что в конце процесса в python вылетает следующая ошибка: AttributeError: 'Sequential' object has no attribute 'output_names'. Я не очень хорошо разбираюсь в python и программировании. Поэтому любая помощь будет оценена по достоинству! Спасибо.
Может ли кто-нибудь помочь мне, потому что в конце процесса в python, выходит следующая ошибка: AttributeError: 'Sequential' object has no attribute 'output_names'. Я не очень хорошо разбираюсь в Python и программировании. Так что любая помощь будет приветствоваться! Спасибо.
Alberto Henrique Tacoronte #: Здравствуйте, господа. Кто-нибудь может мне помочь, потому что в конце процесса python выдает следующую ошибку: AttributeError: 'Sequential' object has no attribute 'output_names'. Я не очень хорошо разбираюсь в питоне и программировании. Поэтому любая помощь будет оценена по достоинству! Спасибо.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Хорошая статья. График предсказаний на тестовых данных разочаровывает. Вы могли бы пропустить все это моделирование/обучение DNN и просто использовать предсказание следующей цены, равной последней известной цене. Готов поспорить, что точность предсказания такой тривиальной модели будет выше, чем при использовании вашей модели DNN. Я предлагаю сравнить эти две точности и показать их здесь. В целом, использовать DNN для предсказания цен - плохая идея. Они лучше подходят для классификации ценовых моделей (например, покупка, продажа, удержание). Кроме того, количество весов в вашей DNN просто астрономическое. Наверное, это перебор.
Спасибо, Владимир.
Просто для обсуждения, когда позволит время, я бы модифицировал эту модель для классификации для сравнения.
Пожалуйста, дайте мне знать, если у вас есть идеи.
В учебнике дается одна партия SAMPLE_SIZE количества близких входов, вам же нужна одна партия входов input_count.
Также в вашей модели в качестве входных данных используются не плавающие числа, а двойные,
Примечание модератора: Это сообщение не соответствует порядку, так как сообщения ниже были перемещены из другой темы. Пожалуйста, смотрите сообщение ниже.
Здравствуйте, сообщество MQL5, я пытался следовать этому руководству по использованию ONNX в ваших советниках. В учебнике в качестве модели была выбрана нейронная сеть, я же использовал дерево с градиентным усилением.
Я построил модель с помощью пакета InterpretML Python и экспортировал ее в ONNX с помощью ebm2onnx.
Я кратко опишу процесс обучения модели.
1) Модель была обучена на 5 входах, OHLC и высоте, высота рассчитывается как ((H + L) / 2) - C.
2) Модель представляет собой бинарный классификатор, цель которого - классифицировать следующую свечу как UP (1) или DOWN (0).
Данные, используемые для обучения модели.
3) Затем модель была экспортирована в формат ONNX.
Представление модели в формате ONNX.
Чтобы заставить модель работать, я отклонился от кода в учебнике и продолжал редактировать код, пытаясь заставить модель ONNX работать, но теперь я действительно не знаю, что я делаю неправильно. Я продолжаю получать ошибку о том, что хэндл модели недействителен.
Я прикрепил MQL5-код ниже.
Теперь я кратко опишу шаги, которые я предпринял в своем коде и которые отличаются от того, что описано в учебнике, а также объясню, почему я отклонился от учебника
1) Строка 57: Установка входной формы модели.
В учебнике для установки входной и выходной формы использовались 3 измерения, т.е. {1,SAMPLE_SIZE,1}; однако когда я следовал этому подходу, я продолжал получать ошибку, а именно ошибку 5808. После обычного процесса проб и ошибок я понял, что если использовать только 1 измерение, количество входов, то ошибка исчезнет.
2) Строка 68: Установка выходной формы модели.
Логика та же, что и выше.
Другие отклонения, которые я сделал, не влияют на модель, например, я вел учет времени, используя логику, которая показалась мне более интуитивной, чем логика, реализованная в учебнике. Мне не нужно было нормализовать входные данные, потому что это древовидная модель.
Если вы можете заметить другие ошибки, которые я допустил, я буду признателен за ваше понимание.
Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий
Обсуждение статьи "Как использовать модели ONNX в MQL5"
Stian Andreassen, 2023.12.08 20:51
В учебнике дается ввод одной партии SAMPLE_SIZE количества близких входов, вам же нужна одна партия входов input_count.
Также в вашей модели в качестве входных данных используются не плавающие числа, а двойные,
Спасибо, что поделились с нами, Ситан, я применил то, что вы указали, но ошибка осталась.
Одна партия входных данных input_count.

Установите входное значение на double
Сообщение об ошибке.
Hello MQL5 community, I've been trying to follow this tutorial on how to use ONNX in your EA's. In the tutorial a neural network was the model of choice, I've used a gradient boosted tree.
Я построил модель, используя пакет InterpretML Python, и экспортировал ее в ONNX с помощью ebm2onnx.
Я кратко опишу процесс обучения модели.
1) Модель была обучена на 5 входах, OHLC и высоте, высота рассчитывается как ((H + L) / 2) - C.
2) Модель представляет собой бинарный классификатор, цель которого - классифицировать следующую свечу как UP (1) или DOWN (0).
Данные, используемые для обучения модели.
3) Затем модель была экспортирована в формат ONNX.
Представление модели в формате ONNX.
Чтобы заставить модель работать, я отклонился от кода в учебнике и продолжал редактировать код, пытаясь заставить модель ONNX работать, но теперь я действительно не знаю, что я делаю неправильно. Я продолжаю получать ошибку о том, что хэндл модели недействителен.
Я прикрепил MQL5-код ниже.
Теперь я кратко опишу шаги, которые я предпринял в своем коде и которые отличаются от того, что описано в учебнике, а также объясню, почему я отклонился от учебника
1) Строка 57: Установка входной формы модели.
В учебнике для установки входной и выходной формы использовались 3 измерения, т.е. {1,SAMPLE_SIZE,1}; однако когда я следовал этому подходу, я продолжал получать ошибку, а именно ошибку 5808. После обычного процесса проб и ошибок я понял, что если использовать только 1 измерение, количество входов, то ошибка исчезнет.
2) Строка 68: Установка выходной формы модели.
Логика та же, что и выше.
Другие отклонения, которые я сделал, не влияют на модель, например, я вел учет времени, используя логику, которая показалась мне более интуитивной, чем логика, реализованная в учебнике. Мне не нужно было нормализовать входные данные, потому что это древовидная модель.
Если вы можете заметить другие ошибки, которые я допустил, я буду признателен за ваше понимание.
Спасибо, что поделились с нами, Ситан, я применил то, что вы указали, но ошибка все равно осталась.
Одна партия входных данных input_count.
Установите входной сигнал на двойное значение
Сообщение об ошибке.
Похоже, что MQL5 пока не поддерживает (точнее, ONNXMLTools не поддерживает) EBM's ONNX:
https://www.mql5.com/ru/docs/onnx/onnx_conversion
Если вы обратитесь к вложениям ONNX (особенно к model.eurusd.D1.10.class.onnx, который использует 4 входа) с сайта https://www.mql5.com/ru/articles/12484; и воспользуетесь Netron(веб-версией) для визуализации файлов onnx, вы увидите различия.
Думаю, следующие две статьи также помогут вам разобраться:
Регрессионные модели библиотеки Scikit-learn и их экспорт в ONNX
Классификационные модели в библиотеке Scikit-Learn и их экспорт в ONNX
Всем привет,
Мы пытаемся использовать нейронную сеть keras с 11 предикторами в один момент времени (размер партии 32) для предсказаний на XauUsd (где выход - сингулярное число между 0 и 1). Сначала мы загружаемся из OnnxCreatefrombuffer (потому что сам OnnxCreate у нас не работает), затем мы всегда получаем ошибку на этапе OnnxRun, где я прикрепил обе ошибки ниже. Любая помощь по поводу того, в какую размерность переформировать входные данные, в какой формат поместить наш вектор-предсказатель (если это вообще должен быть вектор?), или просто любая помощь или предложения по синтаксису, чтобы помочь справиться с этими ошибками, была бы потрясающей. Мы пробовали перестраивать на всевозможные комбинации векторов 32,1,11, но не повезло, и мы не знаем, что делать дальше. Огромное спасибо всем, кто может помочь!!! Бен.
' error 5808'
' ONNX: входной параметр #0 тензора имеет неправильную размерность [0], попробуйте использовать OnnxSetInputShape'
'ONNX: неверный размер входного параметра #0, ожидалось 1408 байт вместо 480'
Здравствуйте, я пытаюсь использовать
OnnxModelInfo.mq5скрипт файла, но не могу заставить его работать, что я делаю не так? Это не может быть так сложно!
Я скопировал скрипт OnnxModelInfo и сохранил в папке de Files.
У меня есть модель Onnx (прилагается)
и когда я компилирую скрипт, появляется 21 ошибка.
Может ли кто-нибудь помочь мне с этим? Пожалуйста,
Опубликована новая статья Использование моделей ONNX в MQL5:
Автор: MetaQuotes
Здравствуйте господа.
Кто-нибудь может мне помочь, потому что в конце процесса в python вылетает следующая ошибка: AttributeError: 'Sequential' object has no attribute 'output_names'. Я не очень хорошо разбираюсь в python и программировании. Поэтому любая помощь будет оценена по достоинству! Спасибо.
Здравствуйте, Альберто, пожалуйста, опубликуйте часть вашего кода[используя кнопкуCODE (Alt -S)], где происходит ошибка, чтобы кто-то, кто знает Python(MetaTrader for Python | ONNX Models), мог указать на решение...