Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2054
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Подскажите, пожалуйста, где здесь входные данные и фактические?
Как сюда вставить Close[0]-Close[1] в фактические данные и Close[1]-Close[2] в тренировочную выборку?
То есть, это нейросетевик. В шаблоне из справочника этот советник выполняет одну конкретную задачу: найти правила по какому-то математическому уравнению. Как его перепрофилировать под цены? Эти матрицы, векторы... намного сложней ориентироваться, чем в обычном mql4 советнике.
Шаблон из справочника работы с матрицами
matrix output1, output2, result; // матрицы выходов нейронных слоев
input int layer1 = 200; // размер 1-го скрытого слоя
input int layer2 = 200; // размер 2-го скрытого слоя
input int Epochs = 20000; // количество эпох обучения
input double lr = 3e-6; // коэффициент скорости обучения
input ENUM_ACTIVATION_FUNCTION ac_func = AF_SWISH; // функция активации
//+------------------------------------------------------------------+
//| Функция запуска скрипта |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int train = 1000; // размер обучающей выборки
int test = 10; // размер тестовой выборки
matrix m_data, m_target;
//--- генерируем обучающую выборку
if(!CreateData(m_data, m_target, train))
return;
//--- обучаем модель
if(!Train(m_data, m_target, Epochs))
return;
//--- генерируем тестовую выборку
if(!CreateData(m_data, m_target, test))
return;
//--- тестирование модели
Test(m_data, m_target);
}
//+------------------------------------------------------------------+
//| Метод генерации выборки |
//+------------------------------------------------------------------+
bool CreateData(matrix &data, matrix &target, const int count)
{
//--- инициализируем матрицы исходных данных и результатов
if(!data.Init(count, 3) || !target.Init(count, 1))
return false;
//--- заполняем матрицу исходных данных случайными значениями
data.Random(-10, 10);
//--- рассчитываем целевые значения для обучающей выборки
vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);
if(!target.Col(X1 / X2, 0))
return false;
//--- возвращаем результат
return true;
}
//+------------------------------------------------------------------+
//| Метод обучения модели |
//+------------------------------------------------------------------+
bool Train(matrix &data, matrix &target, const int epochs = 10000)
{
//--- создаем модель
if(!CreateNet())
return false;
//--- обучаем модель
for(int ep = 0; ep < epochs; ep++)
{
//--- прямой проход
if(!FeedForward(data))
return false;
PrintFormat("Epoch %d, loss %.5f", ep, result.Loss(target, LOSS_MSE));
//--- обратный проход и обновление матриц весов
if(!Backprop(data, target))
return false;
}
//--- возвращаем результат
return true;
}
//+------------------------------------------------------------------+
//| Метод создания модели |
//+------------------------------------------------------------------+
bool CreateNet()
{
//--- инициализируем матрицы весов
if(!weights1.Init(4, layer1) || !weights2.Init(layer1 + 1, layer2) || !weights3.Init(layer2 + 1, 1))
return false;
//--- заполняем матрицы весов случайными значениями
weights1.Random(-0.1, 0.1);
weights2.Random(-0.1, 0.1);
weights3.Random(-0.1, 0.1);
//--- возвращаем результат
return true;
}
//+------------------------------------------------------------------+
//| Метод прямого прохода |
//+------------------------------------------------------------------+
bool FeedForward(matrix &data)
{
//--- проверяем размер исходных данных
if(data.Cols() != weights1.Rows() - 1)
return false;
//--- вычисляем первый нейронный слой
matrix temp = data;
if(!temp.Resize(temp.Rows(), weights1.Rows()) ||
!temp.Col(vector::Ones(temp.Rows()), weights1.Rows() - 1))
return false;
output1 = temp.MatMul(weights1);
//--- вычисяем функцию активации
if(!output1.Activation(temp, ac_func))
return false;
//--- вычисляем второй нейронный слой
if(!temp.Resize(temp.Rows(), weights2.Rows()) ||
!temp.Col(vector::Ones(temp.Rows()), weights2.Rows() - 1))
return false;
output2 = temp.MatMul(weights2);
//--- вычисляем функцию активации
if(!output2.Activation(temp, ac_func))
return false;
//--- вычисляем третий нейронный слой
if(!temp.Resize(temp.Rows(), weights3.Rows()) ||
!temp.Col(vector::Ones(temp.Rows()), weights3.Rows() - 1))
return false;
result = temp.MatMul(weights3);
//--- возвращаем результат
return true;
}
//+------------------------------------------------------------------+
//| Метод обратного прохода |
//+------------------------------------------------------------------+
bool Backprop(matrix &data, matrix &target)
{
//--- проверяем размерность матрицы целевых значений
if(target.Rows() != result.Rows() ||
target.Cols() != result.Cols())
return false;
//--- определяем отклонение расчетных значений от целевых
matrix loss = (target - result) * 2;
//--- проводим градиент до предыдущего слоя
matrix gradient = loss.MatMul(weights3.Transpose());
//--- обновляем матрицу весов последнего слоя
matrix temp;
if(!output2.Activation(temp, ac_func))
return false;
if(!temp.Resize(temp.Rows(), weights3.Rows()) ||
!temp.Col(vector::Ones(temp.Rows()), weights3.Rows() - 1))
return false;
weights3 = weights3 + temp.Transpose().MatMul(loss) * lr;
//--- корректируем градиент ошибки на производную функции активации
if(!output2.Derivative(temp, ac_func))
return false;
if(!gradient.Resize(gradient.Rows(), gradient.Cols() - 1))
return false;
loss = gradient * temp;
//--- опускаем градиент на слой ниже
gradient = loss.MatMul(weights2.Transpose());
//--- обновляем матрицу весов 2-го скрытого слоя
if(!output1.Activation(temp, ac_func))
return false;
if(!temp.Resize(temp.Rows(), weights2.Rows()) ||
!temp.Col(vector::Ones(temp.Rows()), weights2.Rows() - 1))
return false;
weights2 = weights2 + temp.Transpose().MatMul(loss) * lr;
//--- корректируем градиент ошибки на производную функции активации
if(!output1.Derivative(temp, ac_func))
return false;
if(!gradient.Resize(gradient.Rows(), gradient.Cols() - 1))
return false;
loss = gradient * temp;
//--- обновляем матрицу весов 1-го скрытого слоя
temp = data;
if(!temp.Resize(temp.Rows(), weights1.Rows()) ||
!temp.Col(vector::Ones(temp.Rows()), weights1.Rows() - 1))
return false;
weights1 = weights1 + temp.Transpose().MatMul(loss) * lr;
//--- возвращаем результат
return true;
}
//+------------------------------------------------------------------+
//| Метод тестирования модели |
//+------------------------------------------------------------------+
bool Test(matrix &data, matrix &target)
{
//--- прямой проход на тестовых данных
if(!FeedForward(data))
return false;
//--- выводим в лог результаты расчета модели и истинные значения
PrintFormat("Test loss %.5f", result.Loss(target, LOSS_MSE));
ulong total = data.Rows();
for(ulong i = 0; i < total; i++)
PrintFormat("(%.2f + %.2f + %.2f)^2 / (%.2f^2 + %.2f^2 + %.2f^2) = Net %.2f, Target %.2f", data[i, 0], data[i, 1], data[i, 2],
data[i, 0], data[i, 1], data[i, 2], result[i, 0], target[i, 0]);
//--- возвращаем результат
return true;
}
//+------------------------------------------------------------------+
Уважаемый Александр Николаев, та блин... Перенесите double array[]; в глобальную область, и всё)))
И нет никаких ошибок, принтует 7,0
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Alekseu Fedotov, 2022.10.04 04:22
Попробуйте объявить массив в глобальной области
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Alexandr Nikolaev, 2022.10.04 09:47
Пробовал и писал до этого, что тогда ошибка пропадает. Но суть вопроса не в том, чтобы найти выход из этого положения, а в том, что должно и так работать, но почему то не работает, и надо бы это разработчикам mql исправить.
Предлагать тестер МТ5 не нужно!
Подскажите пожалуйста, в терминале МТ4 когда тестируешь роботы на одном инструменте соответственно, дает тестер получить данные по одному инструменту, но по разным периодам. Или все как в настройках, если выбрал инструмент (валюту) и период эти данные только и возможно взять, другие периоды не подготавливаются?
Предлагать тестер МТ5 не нужно!
Метод генерации выборки / заполняем матрицу исходных данных случайными значениями.
Извините, не совсем понимаю: то есть, этот советник не подходит для цен, разности цен?
Извините, не совсем понимаю: то есть, этот советник не подходит для цен, разности цен?
Ну тут же всё по русски то написано - в примере случайные значения - заполните не случайными, я так думаю...
Извините, не совсем понимаю: то есть, этот советник не подходит для цен, разности цен?
сб - случайное блуждание))) Вместо разности цен в примере случайные величины.
Да и нормировать надо данные не забывать)))
здравствуйте! нужна помощь. если есть несколько ордеров как закрыть нужный нам ордер в mql4 ?
?
Как определить баланс счета, на момент когда кол-во ордеров равно нулю.
Возвращаемое значение
Балансовая стоимость расчетного счета (сумма денег на счете).
здравствуйте! нужна помощь. если есть несколько ордеров как закрыть нужный нам ордер в mql4 ?
?
А какое условие "нужного ордера"???