English Deutsch 日本語
preview
Алгоритмическая торговля с MetaTrader 5 и R для начинающих

Алгоритмическая торговля с MetaTrader 5 и R для начинающих

MetaTrader 5Трейдинг | 2 мая 2024, 12:11
446 24
Gamuchirai Zororo Ndawana
Gamuchirai Zororo Ndawana



Введение

MetaTrader является всемирно признанным продуктом в области торговых платформ. Это программное обеспечение, известное своим высоким качеством, предоставляется бесплатно, что делает его доступным для широкого круга пользователей. Благодаря этому, сообщество MetaTrader из года в год демонстрирует устойчивый рост. Сообщество, которое сейчас более разнообразно, чем когда-либо в своей истории, включает в себя людей разного культурного происхождения и обладающих отличными навыками в языках программирования. Примечательно то, что наряду с MetaQuotes Language 5 (официальным языком платформы), Python является единственным языком программирования с полной поддержкой платформы MetaTrader.

В сообществе MetaQuotes всегда рады новым членам, переходящим с R, независимо от их опыта работы в академических кругах или в сфере научных вычислений. Несмотря на достижения в Python и эксклюзивную интеграцию Python как единственного (кроме MQL5) полностью поддерживаемого языка в терминале MetaTrader, люди, владеющие R, не должны воспринимать свои навыки программирования как устаревшие. Эта статья бросает вызов любым представлениям об устаревании, показывая, что, приложив творческий подход и немного изобретательности, вполне зможно создать комплексный алгоритмический торговый советник с использованием R и MetaTrader 5.

Основываясь на опыте автора, необходимо отметить, что пакеты, обсуждаемые в этой статье, демонстрируют несовершенное взаимодействие при их отдельном использовании в терминале MetaTrader 5. Каждый пакет имеет свои ограничения. Однако при совместном использовании эти пакеты эффективно компенсируют недостатки друг друга, вместе образуя надежную основу, способствующую разработке торговых алгоритмов с использованием R и MetaTrader.

На что обратить внимание:

1. Рассмотрение операционной системы:

Демонстрация проводилась на компьютере под управлением ОС Windows 11, сборка 22621.1848. Эти шаги не прошли тестирование на альтернативных операционных системах.

2. Совместимость версии R:

В демонстрации используется R версии 4.3.2. Крайне важно, чтобы участники использовали одну и ту же версию R, поскольку некоторые пакеты, представленные в этой презентации, не поддерживают более ранние версии языка R.

3. Интеграция RStudio:

Эта демонстрация интегрируется с RStudio — сложной интегрированной средой разработки, предназначенной для написания кода R. Участникам рекомендуется использовать RStudio для оптимального опыта программирования на протяжении всей демонстрации.


Настройка окружения

Давайте сначала настроим наше окружение.

Для начала убедитесь, что на вашем компьютере установлена версия R 4.3.2. Если вы не уверены или у вас не установлен R, мы пройдем все этапы вместе.

Чтобы проверить, установлен ли R, найдите значок R на рабочем столе. Если его там нет, вы можете поискать "R" - это должно вызвать терминал R, если он уже установлен. Вы можете установить R из официального репозитория в The Comprehensive R Archive Network. Эта ссылка всегда приведет вас к последней версии R, на данный момент это версия 4.3.2. После загрузки установочного файла просто следуйте всплывающим инструкциям, начиная с выбора языка. 

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

Проверка версии R

Рис. 1. Проверка версии R

Теперь давайте настроим RStudio. Скачать RStudio можно здесь: RStudio Desktop - Posit. Просто следуйте инструкциям на экране по мере их появления аналогично процессу установки R, который мы обсуждали ранее.

После завершения установки проверим версию R, на которую указывает R studio.

Откроем R studio.

Выберем Tools (инструменты) и Global Options... (глобальные параметры).

Глобальные параметры

Рис. 2. Проверка версии R, используемой в RStudio

Вы увидите используемую версию R.

Если на вашем компьютере установлены две или более версии R, нажмите Change... (изменить).

Меню настроек

Рис. 3. Проверка версии R, используемой в RStudio

Выберите "Choose a specific version of R" (выбрать конкретную версию R), выберите версию 4.3.2, кликните OK и перезапустите RStudio, чтобы изменения вступили в силу. 

Выбор версии R

Рис. 4. Выбор версии R

После перезапуска RStudio нужно установить несколько зависимостей. 

#Algorithmic Trading With RStudio And MetaTrader 5
#Gamuchirai Zororo Ndawana
#This script will help you get your environment setup and test that everything is working fine
#Sunday 17 December 2023

#Installing Dependencies
install.packages("stringi")             #This package is a dependency for devtools
install.packages("devtools")            #We will use this package to install R packages hosted on github
install.packages("xts")                 #We will use this package to plot data fetched from the MetaTrader 5 Terminal
install.packages("quantmod")            #We will use this package to plot data fetched from the MetaTrader 5 Terminal
install.packages("ttr")                 #We will use this package to calculate technical indicator values 
install.packages("reticulate")          #We will use this package to call Python libraries in R 
devtools::install_github("Kinzel/mt5R") #We will use this open source package to interact with the MetaTrader 5 Terminal

Начнем с импорта первой библиотеки — reticulate. Эта библиотека позволяет нам выполнять код Python в R. Мы будем использовать reticulate для установки библиотеки MT5 Python в виртуальной среде. После установки библиотеки MT5 мы можем использовать reticulate в качестве моста между RStudio и виртуальной средой Python. Это промежуточное соединение позволяет нам отправлять команды в наш терминал MetaTrader 5, облегчая выполнение сделок.

Начнем с загрузки библиотеки reticulate.

#Libraries
#Importing reticulate
library(reticulate)
Далее создадим виртуальную среду, используя функцию virtualenv_create() в библиотеке reticulate. Функция принимает строковый параметр, представляющий имя нашей виртуальной среды. В программировании виртуальные среды предлагают метод создания изолированных и автономных пространств для отдельных проектов. Фундаментальным обоснованием использования виртуальных сред является эффективное управление зависимостями, смягчение конфликтов и обеспечение воспроизводимости проекта. Это становится особенно важным, когда несколько проектов или пакетов имеют общие зависимости, но нуждаются в разных версиях одних и тех же зависимостей. 
#Create a virtual environment
virtualenv_create("rstudio-metatrader5")

После создания виртуальной среды следующим шагом будет ее активация и использование. Это достигается использованием функции use_virtualenv() в библиотеке reticulate. Активация виртуальной среды гарантирует, что последующие операции Python будут выполняться в изолированном контексте этой среды, что позволяет нам управлять зависимостями и конфигурациями, специфичными для нашего проекта. 

#Use the virtual environemnt 
use_virtualenv("rstudio-metatrader5")

Установим библиотеку Python для MetaTrader 5, используя функцию py_install() в библиотеке reticulate. Мы предоставляем функции имя библиотеки, которую собираемся установить, в данном случае это "MetaTrader5".

#Install metatrader5 python library
py_install("MetaTrader5")

После установки библиотеки следующим шагом будет импорт библиотеки MetaTrader 5 и сохранение ее в переменной с именем "MT5". Это достигается с помощью функции import() из библиотеки reticulate. Переменная "MT5" будет служить нашим интерфейсом для взаимодействия с библиотекой MetaTrader 5 на последующих шагах.

#Import MetaTrader 5
MT5 <- import("MetaTrader5")

Прежде чем продолжить, убедитесь, что терминал MetaTrader 5 в данный момент не запущен. Если он запущен, пожалуйста, закройте его.

Теперь запустим терминал MetaTrader 5 непосредственно из RStudio. Мы можем добиться этого, вызвав функцию инициализации из библиотеки MetaTrader 5 Python. Если инициализация прошла успешно, функция вернет TRUE, что указывает на успешный запуск терминала MetaTrader 5.

#Initialize the MetaTrader 5 Terminal
MT5$initialize()

[1] TRUE

Хотя у нас есть возможность получить доступ к информации об учетной записи, данным терминала, характеристикам символов, мы сталкиваемся с нашим первым ограничением: невозможностью программного входа в другую учетную запись. Учетная запись, которая активна во время инициализации терминала, становится единственной доступной учетной записью, если она не изменена пользователем вручную. Хотя вполне возможно создать скрипт Python для входа в другую учетную запись с помощью библиотеки MetaTrader 5 и выполнить его из R с помощью reticulate, в этой статье предполагается, что читатели обладают только знаниями программирования на R, а также базовым пониманием программирования на MQL5.


Последующее ограничение связано с невозможностью запросить историческую информацию о ценах с помощью reticulate. Это ограничение может быть связано с автоматическим преобразованием типов данных reticulate в процессе передачи объектов между R и Python. Следовательно, возникают трудности с обработкой объекта, возвращаемого при запросе исторических данных о ценах с терминала. Здесь мы используем второй пакет, чтобы исправить недостатки reticulate.

#Get account information
account_info <- MT5$account_info()

#Print account information
account_info$company
account_info$balance
account_info$name

#Get terminal information
terminal_info <- MT5$terminal_info()

terminal_info$build
terminal_info$company
terminal_info$name

[1]"Deriv.com Limited"

[1]868.51

[1]"Gamuchirai Ndawana"

[1]4094

[1]"MetaQuotes Software Corp."

[1]"MetaTrader 5"

#Requesting price data
price_data <- MT5$copy_rates_from_pos("Boom 1000 Index",MT5$TIMEFRAME_M1,0,10)

Error in py_call_impl(callable, call_args$unnamed, call_args$named) :

SystemError: <built-in function copy_rates_from_pos> returned a result with an exception set

Run `reticulate::py_last_error()` for details.

Используем MT5R для решения этих проблем. Но сначала давайте разберемся, как работает MT5R под капотом.

Пакет MT5R устанавливает соединение WebSocket между RStudio и терминалом MetaTrader 5, создавая полнодуплексный канал связи. В полнодуплексной системе данные могут отправляться и приниматься одновременно. Чтобы этот канал был эффективным, терминал MetaTrader 5 должен прослушивать определенный порт, который мы будем использовать для передачи инструкций. Кроме того, он должен взаимодействовать с нашим сеансом RStudio через тот же порт. К счастью, MT5R включает в себя советника, написанного на языке MetaQuotes Language 5, который слушает наши команды. Советник имеет открытый исходный код, что обеспечивает гибкость при включении дополнительных функций. Исходный код можно скачать здесь. Обратите внимание, что к статье мы приложили настроенную версию советника, включающую дополнительную функцию для автоматического размещения трейлинг-стопов и тейк-профитов.

MT5R

Рис. 5. Схема MT5R

После того как вы загрузили советник, вам необходимо поместить его в те же папки, что и другие ваши советники. Запустите ваш терминал MetaTrader 5, откройте меню "Файл" и выберите "Открыть каталог данных".

Открыть каталог данных

Рис. 6. Поиск папки с данными

Затем перейдите в ".\MQL5\experts\" и поместите советник в папку Experts. Затем откройте символ, которым хотите торговать, и поместите советник MT5R на график. Система может спросить, нужно ли предоставить разрешение на использование MetaTrader 5 сетевых операций на вашем компьютере. Предоставьте такое разрешение. Как только это будет сделано, мы готовы вернуться в RStudio и продолжить создание нашего торгового алгоритма. 

Откройте RStudio и импортируйте MT5R, xts и quantmod.

#Import the MT5R Library
library(mt5R)
#Import xts to help us plot
library(xts)
#Import quantmod to help us plot
library(quantmod)

Затем проверьте, установлено ли наше соединение с терминалом, с помощью функции Ping() в пакете MT5R. Функция возвращает TRUE, если ей удалось связаться с советником.

#Check if our connection is established
MT5.Ping()
#Global variables
MARKET_SYMBOL <- "Volatility 75 Index"

[1] TRUE

MT5R не решает проблему входа в систему, которую мы обсуждали ранее, однако решает проблему запроса данных о ценах.

Чтобы запросить данные о ценах из нашего терминала MetaTrader 5, мы вызываем функцию GetSymbol из нашей библиотеки MT5R. Функция ожидает имя символа, за которым следует таймфрейм в минутах, поэтому ежедневные данные будут равны 1440, и, наконец, количество строк. Самые старые данные расположены наверху, текущая цена - внизу. 

Обратите внимание, что мы установили для параметра xts значение true. Это преобразует блок данных в объект временной серии R и автоматически форматирует даты на графике. Это также позволяет нам легко добавлять значения технических индикаторов в наш блок данных.

#Request historical price data
price_data <- MT5.GetSymbol(MARKET_SYMBOL, iTF = 1, iRows=5000,xts = TRUE)
Мы можем легко построить график ценовых данных, используя функцию из quantmod под названием lineChart().

#Plotting a line chart
lineChart(price_data, name = MARKET_SYMBOL)


Линейный график

Рис. 7. Отображение ценовых данных в RStudio

Мы также можем добавить технические индикаторы на наш график, используя функцию addIndicator в quantmod, например, добавим на наш график 60-периодный индекс относительной силы (RSI). 

#We can also add technical indicators to the plot
addRSI(n=60)

Добавляем технические индикаторы

Рис. 8. Добавление технических индикаторов на график


Обработка пользовательских данных

Когда мы добавляли RSI и индикатор Aroon, мы добавляли их только на график. Чтобы добавить значения технического индикатора в наш фрейм данных, мы должны вызвать индикатор из пакета quantmod, а затем передать ему соответствующие столбцы, необходимые для расчетов. Соответствующие столбцы указаны в документации, в этом примере мы добавим в фрейм данных 20-периодную простую скользящую среднюю, 20-периодный индикатор относительной силы (RSI) и 20-периодный индикатор среднего истинного диапазона (ATR).

#Add moving average
price_data$SMA_20 <- SMA(price_data$Close,n = 20)
#Add RSI to the dataframe
price_data$RSI_20 <- RSI(price_data$Close,n=20)
#Add ATR to the dataframe
price_data$ATR_20 <- ATR(price_data[,c("High","Low","Close")], n=20)

Как только это будет сделано, мы удалим все строки с пропущенными значениями.

#Drop missing values
price_data <- na.omit(price_data)

Мы добавим функцию под названием "следующее закрытие" (next close), которая будет содержать цену следующего закрытия. Если значение следующего закрытия больше, чем цена закрытия, наша цель будет равна единице, в противном случае – нулю. Это делается с помощью функции ifelse в R.

#Next close price
price_data$Next_Close <- lag(price_data$Close,-1)

#Setting up our target
price_data$Target <- ifelse( ( (price_data$Next_Close) > price_data$Close) , 1 , 0)

Теперь мы готовы выполнить тестовое разделение поезда. Первые 4000 строк мы будем использовать для обучения, а остальные — для тестирования. При работе с данными временных рядов мы избегаем случайного разделения, чтобы избежать утечки данных — ситуации, когда модель непреднамеренно учится на будущей информации, чтобы предсказать прошлое. Вместо этого мы уделяем приоритетное внимание сохранению естественного временного порядка данных. На практике мы выбираем первые 4000 строк в их хронологической последовательности и следуем этому примеру с оставшимися строками. Такой подход гарантирует, что наша модель учится на прошлых данных для прогнозирования будущего, поддерживая лучшие практики анализа временных рядов.

#Train test split
train_set <- price_data[1:4000,]
train_y <- price_data[1:4000,c("Target")]

test_set <- price_data[4001:4980,]
test_y <- price_data[4001:4980,c("Target")]

Теперь, когда мы разделили наши данные на обучающий и тестовый наборы, следующим шагом будет обучение выбранной вами модели. В этом случае мы выбираем квадратичный дискриминантный анализ (Quadratic Discriminant Analysis, QDA). QDA ориентирован на максимальное различие между двумя классами, способствуя более эффективной классификации данных. Это достигается за счет максимального разделения средних значений двух классов и минимизации разброса среднего значения внутри каждого класса. Для реализации QDA мы используем библиотеку MASS, в которой находится модель QDA. Поэтому мы импортируем библиотеку MASS для доступа и использования модели QDA в нашем анализе.

#Fitting models
library(MASS)
#Quadratic Discriminant Analysis
#Using OHLC Data
qda  <- qda(Target ~ Open+High+Low+Close,data = train_set)
qda

Call:

qda(Target ~ Open + High + Low + Close, data = train_set)

Prior probabilities of groups:

      0       1 

0.49925 0.50075 

Group means:

      Open     High      Low    Close

0 365424.6 365677.8 365159.9 365420.5

1 365125.4 365384.0 364866.6 365131.4

Из матрицы неточностей (confusion matrix) мы видим, что наша модель лучше предсказывает движения вверх, чем движения вниз на рынке.

#Evaluating model performance
#Custom Quadratic Discriminant Analysis
qda_predictionts <- predict(qda,test_set)
qda_predictionts <- qda_predictionts$class

#Confusion matrix
table(qda_predictionts,test_y)

Матрица неточностей

Рис. 9. Матрица неточностей


Реализация торговой логики

Мы достигли фундаментальной сути нашего торгового алгоритма, где первоначальным императивом является создание переменной, обозначенной как last_trade. Эта переменная приобретает значение, поскольку она выполняет ключевую функцию мониторинга самой последней инициированной сделки. Ее важность заключается в содействии своевременному закрытию позиций, когда наша модель предсказывает неблагоприятное движение рынка, которое потенциально может подорвать нашу общую позицию на рынке. Уместно вспомнить нашу несложную систему кодировки, в которой значение 1 означает покупку (BUY), а значение 0 – продажу (SELL).

#Keeping track of the last trade
last_trade <- -1

При реализации нашего алгоритма необходимо запустить бесконечный цикл, в который сложно вложена наша торговая логика. Этот бесконечный цикл достигается за счет включения функции таймаута, тем самым регулируя частоту итераций. В соответствии с генерацией новых свечей мы стремимся к синхронным циклам итераций. Интеграция функции Sys.sleep гарантирует, что наши торговые действия будут соответствовать ритму ежеминутных изменений рынка.

Наш первый шаг — получить текущую рыночную информацию.

Затем мы передаем данные в нашу модель и получаем прогноз.

После того, как наша модель сделала прогноз, мы проверяем, есть ли у нас открытые позиции, используя пакет MT5, который мы установили с помощью reticulate. Если у нас нет открытых позиций, то мы переходим к открытию позиции в направлении прогноза рынка, а затем обновляем нашу переменную last_trade.

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

И, наконец, нам нужно добавить тайм-аут, чтобы наш алгоритм проверял нашу позицию один раз на каждом баре.

while(TRUE){
  #Fetching current market data
  print("Fetching market information")
  data <- MT5.GetSymbol(MARKET_SYMBOL,iTF=1, iRows = 2)
  data <- data[1,]
  
  #Forecasting market move
  qda_forecast <- predict(qda,data)
  qda_forecast <- qda_forecast$class
  print("Model forecast: ")
  print(qda_forecast)
  #Checking if we have no open positions
  current_positions <- MT5$positions_total()
  
  #If we have no open positions, open a position following the model forecast
  if(current_positions == 0){
    print("We have no open positions. Opening a new position")
    
    #A Forecast of 1 means buy
    if(qda_forecast == 1){
      print("Opening Buy Position")
      MT5$Buy(MARKET_SYMBOL,symbol_info$volume_min)
      last_trade <- 1
    }
    #A Forecast of 0 means sell
    if (qda_forecast == 0){
      print("Opening Sell Position")
      MT5$Sell(MARKET_SYMBOL,symbol_info$volume_min)
      last_trade <- 0
    }
  }
  
  else{
      #Are we anticipating a move against our open position?
      if(last_trade != qda_forecast){
        #If we are, let's close our position
        print("Closing open position")
        MT5$Close(MARKET_SYMBOL)
        #Reset last trade
        last_trade <- -1
      }
    
    else{
      #Otherwise everything is expected to be fine
      print("The current position is aligned with the market")
      info <- MT5$account_info()
      print("Current Profit")
      print(info$profit)
    }
    
  }
  #Wait for a new candle to form 
  Sys.sleep(60)
}


Соберем все вместе

Рис. 10. Модель квадратичного дискриминантного анализа в торговле R в MetaTrader 5 в реальном времени


Заключение

Несмотря на трудности при разработке алгоритма торговли в реальном времени с использованием R и MetaTrader 5, статья демонстрирует, что задача более достижима, чем может показаться на первый взгляд. Даже новички в языке R могут добиться значительного прогресса. Ограничения отдельных пакетов эффективно смягчаются дополнительными пакетами, и, в частности, принятый подход сводит к минимуму зависимости. В целом, он представляет собой жизнеспособную и надежную структуру, доступную любому пользователю R.

Кроме того, прилагаемая к статье настроенная версия советника MT5R предназначена для автономного включения стоп-лоссов и тейк-профитов, что помогает в управлении торговлей. Пользователям рекомендуется расширять функциональность советника по мере необходимости. Желаю вам мира, процветания и прибыльных сделок!

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/13941

Прикрепленные файлы |
mt5R_v0_1_5.mq5 (151.33 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (24)
Gamuchirai Zororo Ndawana
Gamuchirai Zororo Ndawana | 3 мая 2024 в 07:21
Maxim Dmitrievsky #:
Не очень понятно резкое переключение с Python (прошлые статьи) на P, из которого снова вызывается Python. Может быть, какой-то глюк в матрице?
Максим, вы хотели сказать

"Не очень понятен резкий переход с Python (прошлые статьи) на Р?".
Maxim Dmitrievsky
Maxim Dmitrievsky | 3 мая 2024 в 07:23
Gamuchirai Zororo Ndawana #:
Максим, вы хотели сказать

"Не очень понятен резкий переход с Python (прошлые статьи) на Р?".

Да :)

Gamuchirai Zororo Ndawana
Gamuchirai Zororo Ndawana | 3 мая 2024 в 08:39
Maxim Dmitrievsky #:

Да :)

Я понимаю, что вы имеете в виду. У меня был разговор с одним из разработчиков, курирующих библиотеку ONNX для R, ссылка на которую находится здесь. Я спросил его, как я могу построить модель ONNX с помощью R, и он предложил библиотеку Reticulate. Вот так я и обратился к Python из R. Кроме того, я просто почувствовал, что члены сообщества, использующие R, возможно, чувствуют себя несколько "брошенными". Потому что Python сейчас в тренде.

Кроме того, я не могу поверить, что разговариваю с тобой, я действительно равняюсь на тебя.

Я читал ваши статьи об алгоритмах обучения с подкреплением, особенно статью об алгоритмах Random Forest RL.

Вы один из немногих членов сообщества, кто обсуждает RL.

Я был бы очень благодарен, если бы вы могли начать с более простого алгоритма, например, SARSA? REINFORCE? Небольшие промежутки действий, например, "Купить" или "Продать" или "Подождать и посмотреть/Ничего не делать". И тогда, возможно, вознаграждением могла бы быть прибыль счета. Или что-то в этом роде. Тогда мы могли бы построить наш путь к Q Learning. Это, конечно, когда вы найдете время. Спасибо.




Maxim Dmitrievsky
Maxim Dmitrievsky | 3 мая 2024 в 15:48
Gamuchirai Zororo Ndawana #:

Я понимаю, что вы имеете в виду. У меня был разговор с одним из разработчиков, курирующих библиотеку ONNX для R, ссылка на которую находится здесь. Я спросил его, как я могу построить модель ONNX с помощью R, и он предложил библиотеку Reticulate. Вот так я и обратился к Python из R. Кроме того, я просто почувствовал, что члены сообщества, использующие R, возможно, чувствуют себя несколько "брошенными". Потому что Python сейчас в тренде.

Кроме того, я не могу поверить, что разговариваю с тобой, я действительно равняюсь на тебя.

Я читал ваши статьи об алгоритмах обучения с подкреплением, особенно статью об алгоритмах Random Forest RL.

Вы один из немногих членов сообщества, кто обсуждает RL.

Я был бы очень благодарен, если бы вы могли начать с более простого алгоритма, например, SARSA? REINFORCE? Небольшие промежутки действий, например, "Купить" или "Продать" или "Подождать и посмотреть/Ничего не делать". И тогда, возможно, вознаграждением могла бы быть прибыль счета. Или что-то в этом роде. Тогда мы могли бы построить наш путь к Q Learning. Это, конечно, когда вы найдете время. Спасибо.

Понял. То есть вы изначально R юзер :) тогда пазл сложился.

К сожалению, я не встречал эффективных RL алгоритмов на форексе. Использую только какие-то элементы из них, например вместо случайного выбора действия можно использовать случайное семплирование сделок. Здесь есть другой автор, который написал уже почти 100 статей по RL :) 

mytarmailS
mytarmailS | 4 мая 2024 в 11:33
Gamuchirai Zororo Ndawana #:

когда новая статья по R ?

Критерий однородности Смирнова как индикатор нестационарности временного ряда Критерий однородности Смирнова как индикатор нестационарности временного ряда
В статье рассматривается один из самых известных непараметрических критериев однородности — критерий Смирнова. Анализируются как модельные данные, так и реальные котировки. Приводится пример построения индикатора нестационарности (iSmirnovDistance).
Разработка MQTT-клиента для MetaTrader 5: методология TDD (Часть 5) Разработка MQTT-клиента для MetaTrader 5: методология TDD (Часть 5)
Статья является пятой частью серии, описывающей этапы разработки нативного MQL5-клиента для протокола MQTT 5.0. В этой части мы опишем структуру пакетов PUBLISH - как мы устанавливаем их флаги публикации (Publish Flags), кодируем строки названий тем и устанавливаем идентификаторы пакетов, когда это необходимо.
Возможности Мастера MQL5, которые вам нужно знать (Часть 10): Нетрадиционная RBM Возможности Мастера MQL5, которые вам нужно знать (Часть 10): Нетрадиционная RBM
Ограниченные машины Больцмана (Restrictive Boltzmann Machines, RBM) представляют собой на базовом уровне двухслойную нейронную сеть, способную выполнять неконтролируемую классификацию посредством уменьшения размерности. Мы используем ее основные принципы и посмотрим что случится, если мы перепроектируем и обучим ее нестандартно. Сможем ли мы получить полезный фильтр сигналов?
Нейросети — это просто (Часть 88): Полносвязный Энкодер временных рядов (TiDE) Нейросети — это просто (Часть 88): Полносвязный Энкодер временных рядов (TiDE)
Желание получить наиболее точные прогнозы толкает исследователей к усложнению моделей прогнозирование. Что в свою очередь ведет к увеличению затрат на обучение и обслуживание модели. Но всегда ли это оправдано? В данной статье я предлагаю Вам познакомиться с алгоритмом, который использует простоту и скорость линейных моделей и демонстрирует результаты на уровне лучших с более сложной архитектурой.