MetaTrader 5 R User Group - как использовать R в Метатрейдере

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Perervenko
4948
Vladimir Perervenko  
Поскольку разработчики вняли просьбам части пользователей использующих языки R/Python и сделали возможным получение котировок прямо с терминала - время создать ветку в которой можно было бы обсуждать конкретные вопросы применения этих языков. 
Для кого эта ветка:
- для новичков желающих выучить и применять эти языки в своих разработках
- для знающих и использующих эти языки (обмен опытом, решение возникающих проблем и т.п.). В отличии от многих других языков, включая Python, в R одно и тоже действие можно выполнить многими способами. И в этом плане обмен опытом очень полезен.
Что нужно постить в этой ветке:
- примеры, вопросы, мнения сопровождаемые воспроизводимыми данными и кодами связанными с торговлей на Форекс/бирже. Желательно чтобы было ясно как этот код может быть выполнен в индикаторе/эксперте МТ4/МТ5. 
Чего не нужно постить:
- оценки , сранения, др. пустой треп без данных и кодов. Для этого есть море других веток залитых водой различной степени свежести. 
- сообщения типа:"я тут такую штуку замутил офигенную, но я не покажу как я это сделал". Не хочешь подделиться - не хвались.
В следующем посте начнем с самого простого - установки пакета MetaTrader и проверки его функционирования. 
Vladimir Perervenko
4948
Vladimir Perervenko  
В ветке расписано довольно подробно как установить пакет. Повторю последовательность немного модифицировав:
Что нужно сделать для проверки:

  1. Обновить MetaTrader 5 до 2005 билда через открытие демо-счета на MetaQuotes-Demo или дождаться обновлений на своем брокере
  2. Скачать и инсталлировать R: https://cran.r-project.org/bin/windows/base/ (сейчас версия 3.5.2, ставьте 64 битную версию)
  3. Прописать путь до исполняемых файлов R в PATH, например E:\Programs\R\bin\x64 , чтобы легко можно было запускать с командной строки
  4. Скачать пакет MetaTrader_1.0.3.zip (собран под минимальную версию R 3.5.0) из аттача и инсталлировать его командой. Файл в топике ветки.
  5. Скачать IDE R-Studio https://www.rstudio.com/products/rstudio/download/ для удобства работы, хотя есть штатный Rgui.exe в составе R
  6. Запустить Rstudio. Во вкладке Packages нажать install и указать путь к месту где лежит файл MetaTrader_1.0.3.zip

Готово. В следующем посте проверим работу на простых примерах.
Vladimir Perervenko
4948
Vladimir Perervenko  
Скопируйте приведенный ниже скрипт в панель Source Rstudio. Это позволит Вам выполнять скрипт построчно или несколько выделенных строк одновременно. Если некоторые применяемые пакеты в скрипте у Вас не установлены, будет выдана ошибка. Просто установите их во вкладке Packages.
#Очистим рабочее пространство
rm(list = ls())
# Загрузим библиотеку 
library(MetaTrader)
# Инициируем соединение с терминалом МТ5. Терминал запустится, если он не был запущен
MT5Initialize();
# Это не обязательно, мы предварительно очистили пространство
# if (exists("ver")) rm(ver)
# if (exists("info")) rm(info)
# if (exists("ticks1")) rm(ticks1)
# if (exists("ticks2")) rm(ticks2)
# if (exists("rates1")) rm(rates1)
# if (exists("rates2")) rm(rates2)
# if (exists("rates3")) rm(rates3)

# Проверим версию терминала
ver <- MT5Version()
ver
# Состояние и параметры соединения с терминалом МТ5. Значение возвращаемых 
#  параметров смотрите Help к пакету
info <- MT5TerminalInfo()
info
# Ожидание соединение терминала с сервером брокера. Возвращает TRUE если 
# соединение установлено, в противном случае - FALSE
if (MT5WaitForTerminal()) {
# Загрузим тиковую историю по двум символам
ticks1 <- MT5CopyTicksFrom("AUDJPY", as.POSIXct("2019-01-28 13:00:00"), 10000, MT5_COPY_TICKS_ALL)
ticks2 <- MT5CopyTicksRange("AUDUSD", as.POSIXct("2019-01-28 13:00:00"), as.POSIXct("2019-01-28 13:01:00"), MT5_COPY_TICKS_ALL)
# Загрузим котировки с разных тайм фреймов и преобразуем матрицы в датафреймы
require(magrittr)
rates1 <- MT5CopyRatesFrom("EURUSD", MT5_TIMEFRAME_M12, 
                           as.POSIXct("2019-01-28 13:00:00"), 1000) %>% as.data.frame()
rates2 <- MT5CopyRatesFromPos("EURUSD", MT5_TIMEFRAME_M6, 0, 1000) %>% as.data.frame()
# Закроем соединение с терминалом
MT5Shutdown();}
# Посмотрим длину полученных данных
#COUNT можно так
length(ticks1[,1])
length(ticks2[,1])
length(rates1[,1])
length(rates2[,1])
# но лучше так
dim(ticks1)
dim(ticks2)
dim(rates1)
dim(rates2)
# более информативно
str(ticks1)
str(ticks2)
str(rates1)
str(rates2)
# Скоректируем время
#time correcting
ticks1[,1] = ticks1[,1] / 1000
ticks2[,1] = ticks2[,1] / 1000

# Трансформируем время в читаемый вид
require(anytime)
rates1$time <- anytime(rates1$time)
rates2$time <- anytime(rates2$time)

#Посмотрим на значениея в полученных данных
#DATA
head(ticks1, 10)
head(ticks2, 10)
head(rates1)
tail(rates2)

# Можно визуализировать массивы тиков
plot.ts(ticks1[ ,2:3])
plot.ts(ticks1[ ,2] - ticks1[ ,3])

# Котировки визуализируем иначе
library(plotly)
# basic example of ohlc charts
df <- rates1
p <- df %>%
  plot_ly(x = ~time, type = "candlestick",
          open = ~open, close = ~close,
          high = ~high, low = ~low) %>%
  layout(title = "EURUSD M12 Candlestick Chart")
p
# Во вкладке Viewer RStudio увидите интерактивный рисунок, который можно вывести 
# в броузер или сохранить как png
#---------------
df <- rates2
p <- df %>%
  plot_ly(x = ~time, type = "candlestick",
          open = ~open, close = ~close,
          high = ~high, low = ~low) %>%
  layout(title = "EURUSD M6 Candlestick Chart")
p

Выполнять лучше по частям выделяя несколько нужных строк во вкладке Source и нажимая Run

Первая часть скрипта строка 1:35

> # Загрузим библиотеку 
> library(MetaTrader)
> # Инициируем соединение с терминалом МТ5. Терминал запустится, если он не был запущен
> MT5Initialize();
[1] TRUE
> # Это не обязательно, мы предварительно очистили пространство
> # if (exists("ver")) rm(ver)
> # if (exists("info")) rm(info)
> # if (exists("ticks1")) rm(ticks1)
> # if (exists("ticks2")) rm(ticks2)
> # if (exists("rates1")) rm(rates1)
> # if (exists("rates2")) rm(rates2)
> # if (exists("rates3")) rm(rates3)
> 
> # Проверим версию терминала
> ver <- MT5Version()
> ver
[[1]]
[1] 500

[[2]]
[1] 2006

[[3]]
[1] "22 Feb 2019"

> # Состояние и параметры соединения с терминалом МТ5. Значение возвращаемых 
> #  параметров смотрите Help к пакету
> info <- MT5TerminalInfo()
> info
[[1]]
[1] 2

[[2]]
[1] "MetaQuotes-Beta"

[[3]]
[1] "7282"

> # Ожидание соединение терминала с сервером брокера. Возвращает TRUE если 
> # соединение установлено, в противном случае - FALSE
> if (MT5WaitForTerminal()) {
+ # Загрузим тиковую историю по двум символам
+ ticks1 <- MT5CopyTicksFrom("AUDJPY", as.POSIXct("2019-01-28 13:00:00"), 10000, MT5_COPY_TICKS_ALL)
+ ticks2 <- MT5CopyTicksRange("AUDUSD", as.POSIXct("2019-01-28 13:00:00"), as.POSIXct("2019-01-28 13:01:00"), MT5_COPY_TICKS_ALL)
+ # Загрузим котировки с разных тайм фреймов и преобразуем матрицы в датафреймы
+ require(magrittr)
+ rates1 <- MT5CopyRatesFrom("EURUSD", MT5_TIMEFRAME_M12, 
+                            as.POSIXct("2019-01-28 13:00:00"), 1000) %>% as.data.frame()
+ rates2 <- MT5CopyRatesFromPos("EURUSD", MT5_TIMEFRAME_M6, 0, 1000) %>% as.data.frame()
+ # Закроем соединение с терминалом
+ MT5Shutdown();}
[1] TRUE

строки 36-41

> # Посмотрим длину полученных данных
> #COUNT можно так
> length(ticks1[,1])
[1] 10000
> length(ticks2[,1])
[1] 34
> length(rates1[,1])
[1] 1000
> length(rates2[,1])
[1] 1000

строки 42-46

> # но лучше так
> dim(ticks1)
[1] 10000     6
> dim(ticks2)
[1] 34  6
> dim(rates1)
[1] 1000    8
> dim(rates2)
[1] 1000    8

Строки 47-51

> # более информативно
> str(ticks1)
 num [1:10000, 1:6] 1.55e+12 1.55e+12 1.55e+12 1.55e+12 1.55e+12 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:6] "time" "bid" "ask" "last" ...
> str(ticks2)
 num [1:34, 1:6] 1.55e+12 1.55e+12 1.55e+12 1.55e+12 1.55e+12 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:6] "time" "bid" "ask" "last" ...
> str(rates1)
'data.frame':   1000 obs. of  8 variables:
 $ time       : num  1.55e+09 1.55e+09 1.55e+09 1.55e+09 1.55e+09 ...
 $ open       : num  1.14 1.14 1.14 1.14 1.14 ...
 $ high       : num  1.14 1.14 1.14 1.14 1.14 ...
 $ low        : num  1.14 1.14 1.14 1.14 1.14 ...
 $ close      : num  1.14 1.14 1.14 1.14 1.14 ...
 $ tick_volume: num  478 521 246 350 324 246 289 215 212 283 ...
 $ spread     : num  2 2 2 2 2 2 2 2 2 2 ...
 $ real_volume: num  0 0 0 0 0 0 0 0 0 0 ...
> str(rates2)
'data.frame':   1000 obs. of  8 variables:
 $ time       : num  1.55e+09 1.55e+09 1.55e+09 1.55e+09 1.55e+09 ...
 $ open       : num  1.13 1.13 1.13 1.13 1.13 ...
 $ high       : num  1.13 1.13 1.13 1.13 1.13 ...
 $ low        : num  1.13 1.13 1.13 1.13 1.13 ...
 $ close      : num  1.13 1.13 1.13 1.13 1.13 ...
 $ tick_volume: num  97 67 37 45 55 30 97 99 54 91 ...
 $ spread     : num  3 3 4 3 2 3 3 2 4 3 ...
 $ real_volume: num  0 0 0 0 0 0 0 0 0 0 ...

Строки  52- 67

> # Скорректируем время
> #time correcting
> ticks1[,1] = ticks1[,1] / 1000
> ticks2[,1] = ticks2[,1] / 1000
> 
> # Трансформируем время в читаемый вид
> require(anytime)
> rates1$time <- anytime(rates1$time)
> rates2$time <- anytime(rates2$time)
> 
> #Посмотрим на значениея в полученных данных
> #DATA
> head(ticks1, 10)
            time    bid    ask last volume flags
 [1,] 1548673200 78.573 78.586    0      0   134
 [2,] 1548673202 78.574 78.585    0      0   134
 [3,] 1548673202 78.573 78.585    0      0   130
 [4,] 1548673212 78.573 78.583    0      0     4
 [5,] 1548673212 78.572 78.583    0      0   130
 [6,] 1548673214 78.569 78.580    0      0   134
 [7,] 1548673214 78.570 78.581    0      0   134
 [8,] 1548673215 78.572 78.582    0      0   134
 [9,] 1548673215 78.571 78.581    0      0   134
[10,] 1548673216 78.571 78.582    0      0     4
> head(ticks2, 10)
            time     bid     ask last volume flags
 [1,] 1548673200 0.71839 0.71849    0      0   130
 [2,] 1548673202 0.71840 0.71849    0      0   130
 [3,] 1548673202 0.71839 0.71848    0      0   134
 [4,] 1548673210 0.71840 0.71848    0      0   130
 [5,] 1548673214 0.71840 0.71849    0      0     4
 [6,] 1548673214 0.71841 0.71849    0      0   130
 [7,] 1548673229 0.71842 0.71850    0      0   134
 [8,] 1548673230 0.71841 0.71850    0      0   130
 [9,] 1548673230 0.71841 0.71849    0      0     4
[10,] 1548673231 0.71842 0.71849    0      0   130
> head(rates1)
                 time    open    high     low   close tick_volume spread real_volume
1 2019-01-16 05:12:00 1.14100 1.14100 1.14027 1.14036         478      2           0
2 2019-01-16 05:24:00 1.14036 1.14042 1.13997 1.14023         521      2           0
3 2019-01-16 05:36:00 1.14023 1.14033 1.14012 1.14017         246      2           0
4 2019-01-16 05:48:00 1.14017 1.14025 1.13967 1.13982         350      2           0
5 2019-01-16 06:00:00 1.13982 1.14014 1.13962 1.14008         324      2           0
6 2019-01-16 06:12:00 1.14008 1.14024 1.13984 1.13999         246      2           0
> tail(rates2)
                    time    open    high     low   close tick_volume spread real_volume
995  2019-02-23 01:24:00 1.13313 1.13318 1.13307 1.13312          55      3           0
996  2019-02-23 01:30:00 1.13312 1.13316 1.13300 1.13310         140      4           0
997  2019-02-23 01:36:00 1.13312 1.13323 1.13306 1.13322          75      3           0
998  2019-02-23 01:42:00 1.13322 1.13322 1.13315 1.13320          67      3           0
999  2019-02-23 01:48:00 1.13318 1.13327 1.13313 1.13323         155      6           0
1000 2019-02-23 01:54:00 1.13325 1.13325 1.13303 1.13303         131      4           0

Визуализация в следующем посте

Vladimir Perervenko
4948
Vladimir Perervenko  

Можно визуализировать  тиковый график 

# Можно визуализировать массивы тиков
plot.ts(ticks1[ ,2:3])
plot.ts(ticks1[ ,2] - ticks1[ ,3])

BidAsk_ticks1

Bid-Ask__ticks1

Vladimir Perervenko
4948
Vladimir Perervenko  

Котировки можем визуализировать получше

# Котировки визуализируем иначе
library(plotly)
# basic example of ohlc charts
df <- rates1
p <- df %>%
  plot_ly(x = ~time, type = "candlestick",
          open = ~open, close = ~close,
          high = ~high, low = ~low) %>%
  layout(title = "EURUSD M12 Candlestick Chart")
p
# Во вкладке Viewer RStudio увидите интерактивный рисунок, который можно вывести 
# в броузер или сохранить как png

EURUSDm12

#---------------
df <- rates2
p <- df %>%
  plot_ly(x = ~time, type = "candlestick",
          open = ~open, close = ~close,
          high = ~high, low = ~low) %>%
  layout(title = "EURUSD M6 Candlestick Chart")
p

EURUSDm6

Изучайте, пробуйте.

Удачи

Vladimir Pastushak
132383
Vladimir Pastushak  
Скажите, для не понимающего, что может R чего не может MQL ?
Vladimir Perervenko
4948
Vladimir Perervenko  
Vladimir Pastushak:
Скажите, для не понимающего, что может R чего не может MQL ?

Посмотрите здесь и в других статьях.

Удачи

Aleksey Nikolayev
1994
Aleksey Nikolayev  
Vladimir Pastushak:
Скажите, для не понимающего, что может R чего не может MQL ?

Для анализа данных интерпретируемые языки удобнее компилируемых. В ЦЕРНе, например, используется интерпретатор с++.

Vladimir Perervenko
4948
Vladimir Perervenko  

В следующем посте напишем тестовый/демонстрационный индикатор и проверим коммуникацию между терминалом и R/Python. Это скорее завтра.

Удачи

Alexey Volchanskiy
28767
Alexey Volchanskiy  
Vladimir Perervenko:
В ветке расписано довольно подробно как установить пакет. Повторю последовательность немного модифицировав:
Что нужно сделать для проверки:

  1. Обновить MetaTrader 5 до 2005 билда через открытие демо-счета на MetaQuotes-Demo или дождаться обновлений на своем брокере

Уже 2006, обновляется через Справка->Проверить обновления десктопа->Последняя бета-версия

Vladimir Perervenko
4948
Vladimir Perervenko  
Alexey Volchanskiy:

Уже 2006, обновляется через Справка->Проверить обновления десктопа->Последняя бета-версия

При соединении R с терминалом он автоматически запускается и если есть обновление - обновляется. Хотя можно это сделать и врукопашную.

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