Советники: Примеры из книги "Нейросети в алготрейдинге на MQL5" - страница 3

 
Luiz Godoy #:
При запуске скрипта gpt_test_not_norm.mq5 я получил выход за пределы диапазона.

В 40-й строчке программы:

if(!loss_history.Resize(0,Epochs))

Меняем на:

if(!loss_history.Resize(Epochs))

 

Привет. Написано много, получилась книга. Начал читать, думал, щас как запилю ченидь для маркета.

Это хороший труд. Потому что больше нет ничего настолько универсального, что объяснило бы, как подойти к машинному обучению средствами mql5.

Однако...

Выборка делится на 3 части - 60% обучение, 20% валидация и 20% тест. Из 40 баров каждой цепочки баров повторяется 35. Мораль - вы обучаете и проверяете, используя одни и те же данные. Я нарисовал картинку. Это не только беда этой книги, я встречаю это снова и снова. 

Сначала я подумал, что индикатор Зигзаг - это то самое, что позволяет выделить неповторяющиеся движения. Типа от вершины к впадине, от впадины к вершине. Это были бы уникальные паттерны, как это названо в книге. Но нет, автор строит паттерны побарно, и в этом конечно грубейшая ошибка. И Зигзаг для этого не нужен. Можно просто смотреть вперед на 10 баров и считать, куда пошел рынок.

Это первый пункт - практический. И второй пункт технический - тоже не то. Автор проводит обучение с валидацией только в Тензорфлоу? Это круто, Тензорфлоу - библиотека машинного обучения, которую делает Гугл. Но ведь цель этого труда была в том, чтобы показать, как это сделать средствами mql5?

В mql5 нет примеров обучения с валидацией. Я пока не нашел примеров с валидацией. Потом допишу есливче. Конечно, надо пробовать делать самому. Конечно, надо. Работы много, чтобы подготовить историю и подобрать параметры обучения. Вот и в Тензорфлоу вроде все есть, а сколько всего нужно делать. А здесь получается, что и техническая часть не доделана.

Это те самые 95%, которые без 5% теряют ценность?

Я пока остановлюсь на том, что это хороший труд. Потому что больше нет ничего подобного.


 
Сколько я ни пробовал, историю нельзя выбрать по датам, если между датами больше 1 года. Иногда пролезает 2 года. Но если график пустой, и ты в пустой график заряжаешь, то сразу только 1 год. Чтобы надежно собрать данные за любой период, нужен "холостой" тест в тестере стратегий от одной даты к другой. Тогда сколько угодно лет, и в файл.

Разве метод оптимизации Adam не корректирует learning_rate исходя из скорости обучения? Там еще используется "потолок", а не постоянное значение.

Если делать рекуррентную сеть, зачем добавлять скрытые полносвязные слои? Полносвязная тема уничтожает тему lstm. Конечно, в конце сети нужен 1 полносвязный нейрончик для активации.

Dropout - это свойство слоя в любой нейронной сети. Например, в lstm свойство dropout обязательно должно быть, иначе привыкает к данным за несколько эпох. Я знаю, что в pytorch свойство dropout можно использовать только в переходе между двумя одинаковыми слоями, таким образом нужно 2 рекуррентных слоя. А в tensorflow любой слой может иметь dropout. Очевидное преимущество tensorflow перед pytorch.

Пакетная обработка в обратном распространении. Почему у автора пакет - это любое число?! Получается, что в каждую эпоху он выбирает случайное количество данных для обучения. Пакет - это количество! Например, выборка 1000 элементов, и это 10 пакетов по 100 значений. Каждая эпоха - это разные пакеты, но значений там всегда по 100. Я провожу обучение попакетно, и в конце каждого пакета корректирую веса. Это может гарантировать, что я не застряну в локальном минимуме. И я использую все данные выборки, а не какие-нибудь.
 

Еще не работает оптимизация торговли. Вылетает странная ошибка в диалоговом окне. Один раз выключился комп. То есть если обучить сеть, и потом с ней пытаться проводить оптимизацию торговли.

На мой взгляд, неправильно использовать графический стимулятор для форекса. Как ни крути, данных не много. Правильнее, на мой взгляд, было бы использовать агентов метатрейдера в оптимизаторе, чтобы запускать разные потоки обучения разных сетей. Например, в тензорфлоу я обучаю 7 потоков. Один закончился, добавился другой. И так по порядку 100 вариантов. Потом по ним прогон на истории.

Тут тема в том, что нейронная сеть может и хорошая. Но не любая нейронная сеть способна пройти свою историю обучения. Поэтому нужно много вариантов сетей.

 

ChatGPT подсказывает, что для классификации между двумя лучше всего использовать сигмоид. И его-то как раз я не нашел. А еще функции активации разные. Но функция потери одна и та же - MSE?

Тангенс все равно это не классификация, а регрессия. От -1 до 1 это не вероятность, а расчет значения.

Короче, сойдет. Больше ничего нет. Поэтому труд, безусловно, хороший. Буду использовать.

 
Joseph Bervell остановлен, так как OnInit возвращает ненулевой код 1

LG 2 10:07:44.216 Core 1 отключен

KP 0 10:07:44.216 Core 1 соединение закрыто

Удалось ли вам найти решение? Если я найду его, я опубликую его .

Нет файла"our_model.net " IMO

 
اللعبه :

MQL5 :

المؤلف: MetaQuotes

اخرزميات انا عالم التكنولوجيا الجديدة ومطور برامج ومنشء تطبيقات 
 
Спасибо огромное автору за книгу! Единственный минус))) - моя Алиса Про потеряла для меня магию "сознания") С уважением, Игорь.
 
//+------------------------------------------------------------------+
//|Продвинутый советник FVG.mq5 |
//+------------------------------------------------------------------+
#property strict

input double Lots = 0.1;
input int TakeProfit = 200;
input int StopLoss = 200;
input int MaxLookback = 50;
input int Slippage = 5;
input int MagicNumber = 123456;
input double MaxSpreadPoints = 20.0; // Maksimum izin verilen spread
input int MA_Period = 50; // Trend filtresi
input int StartHour = 8;  // İşlem saat aralığı başlangıç
input int EndHour = 20;   // İşlem saat aralığı bitiş

//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Advanced FVG EA başlatıldı".);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   // Yeni bar kontrolü
   static datetime lastBarTime = 0;
   MqlRates candles[3];
   if(CopyRates(_Symbol, PERIOD_M5, 0, 3, candles) < 3) return;
   if(candles[0].time == lastBarTime) return;
   lastBarTime = candles[0].time;

   // Zaman filtresi
   int currentHour = TimeHour(TimeCurrent());
   if(currentHour < StartHour || currentHour >= EndHour) return;

   // Spread kontrolü
   double spread = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;
   if(spread > MaxSpreadPoints) return;

   // Pozisyon kontrolü
   if(PositionSelect(_Symbol)) return;

   // Trend filtresi (MA)
   double ma = iMA(_Symbol, PERIOD_M5, MA_Period, 0, MODE_SMA, PRICE_CLOSE, 0);
   double price = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   // FVG tespiti
   double fvgHigh = 0;
   double fvgLow = 0;
   bool isBullishFVG = false;
   bool isBearishFVG = false;

   MqlRates rates[];
   if(CopyRates(_Symbol, PERIOD_M5, 2, MaxLookback, rates) < 3) return;

   for(int i = 0; i < ArraySize(rates)-2; i++)
     {
      double high0 = rates[i].high;
      double low2 = rates[i+2].low;
      double low0 = rates[i].low;
      double high2 = rates[i+2].high;

      // Бычий FVG (sadece yükselen trendde aç)
      if(high0 < low2 && price > ma)
        {
         isBullishFVG = true;
         fvgHigh = low2;
         fvgLow = high0;
         break;
        }
      // Медвежий FVG (sadece düşen trendde aç)
      else if(low0 > high2 && price < ma)
        {
         isBearishFVG = true;
         fvgHigh = low0;
         fvgLow = high2;
         break;
        }
     }

   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

   // İşlem açma
   if(isBullishFVG && bid <= fvgHigh && bid >= fvgLow)
     {
      trade_buy(ask);
     }
   else if(isBearishFVG && ask >= fvgLow && ask <= fvgHigh)
     {
      trade_sell(bid);
     }
  }
//+------------------------------------------------------------------+
void trade_buy(double price)
  {
   double sl = price - StopLoss * _Point;
   double tp = price + TakeProfit * _Point;

   MqlTradeRequest req = {};
   MqlTradeResult res  = {};

   req.action = TRADE_ACTION_DEAL;
   req.symbol = _Symbol;
   req.volume = Lots;
   req.type = ORDER_TYPE_BUY;
   req.price = price;
   req.sl = NormalizeDouble(sl, _Digits);
   req.tp = NormalizeDouble(tp, _Digits);
   req.deviation = Slippage;
   req.magic = MagicNumber;
   req.comment = "FVG Buy";

   if(OrderSend(req, res))
      Print("Buy order gönderildi: ", res.retcode);
   else
      Print("Купить заказ hatası: ", res.retcode);
  }
//+------------------------------------------------------------------+
void trade_sell(double price)
  {
   double sl = price + StopLoss * _Point;
   double tp = price - TakeProfit * _Point;

   MqlTradeRequest req = {};
   MqlTradeResult res  = {};

   req.action = TRADE_ACTION_DEAL;
   req.symbol = _Symbol;
   req.volume = Lots;
   req.type = ORDER_TYPE_SELL;
   req.price = price;
   req.sl = NormalizeDouble(sl, _Digits);
   req.tp = NormalizeDouble(tp, _Digits);
   req.deviation = Slippage;
   req.magic = MagicNumber;
   req.comment = "FVG Sell";

   if(OrderSend(req, res))
      Print("Sell order gönderildi: ", res.retcode);
   else
      Print("Продать заказ hatası: ", res.retcode);
  }
//+------------------------------------------------------------------+