загрузка и обработка данных

загрузка нужных библиотек

library(xts)
library(plotly)

Загружаю котировки, беру последние 500 свечей и удаляю обьемы

P <- file.choose() |> readRDS() |> lapply(\(x) tail(x[,1:4],n=500)) 

Оставляю только те пары у которых есть в названии USD

p <- P[grep("USD", names(P))]

меняю “EURUSD” на “USDEUR” итд пары.. 1 / p[[i]]

for(i in grep("USD$", names(p)))   p[[i]] <- 1 / p[[i]]

Моя нормализация, вернее обычная стандартизация (x - mean(x)) / sd(x) которую я применяю к первым 100 свечам потом по полученым параметрам продлеваю график

my_scale <- function(x,y)  (y - mean(x)) / sd(x)
p2 <- lapply(p, \(x) my_scale(x = x[1:100,],y = x))

Визуализация

# Определяем набор цветов
colors <- c("blue", "red", "green", "purple", "orange", "black", "gray")
# Создаем пустой график
fig <- plot_ly()
# Для каждой валютной пары в p2
for(i in 1:length(p2)) {
  data <- cbind.data.frame(date=index(p2[[i]]) , coredata(p2[[i]]))
  # Добавляем график свечей для валютной пары к основному графику
  fig <- fig %>% 
    add_trace(data=data, 
              x = ~date, 
              type="candlestick",
              open = ~Open, close = ~Close,
              high = ~High, low = ~Low,
              line = list(width = 1),
              name = names(p2)[i],
              increasing = list(line = list(color = colors[i])),
              decreasing = list(line = list(color = colors[i])))
  
  fig <- layout(fig ,
               xaxis = list(rangeslider = list(visible = F),
               title = ""),
               yaxis = list(side = "left"))
}
# Показываем график
fig