rm(list = ls())
# definir os códigos disponíveis no yahoo finance
#install.packages("BatchGetSymbols")
tickers <- c('EQTL3.SA', 'PETR4.SA', 'VALE3.SA', 'WEGE3.SA', 'EMBR3.SA')
# Variável numérica para o número de anos
timeframe <- 5
library(BatchGetSymbols)
## Loading required package: rvest
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
##
# Limpa o carregamento em vermelho original.
suppressMessages({
assets <- BatchGetSymbols(tickers,
# A estrutura -365*timeframe seleciona o número de anos a partir da data do sistema
# seja ela qual for.
first.date = Sys.Date() - 365*timeframe,
last.date = Sys.Date(),
type.return = "log",
freq.data = "daily")
})
## Warning: `BatchGetSymbols()` was deprecated in BatchGetSymbols 2.6.4.
## ℹ Please use `yfR::yf_get()` instead.
## ℹ 2022-05-01: Package BatchGetSymbols will soon be replaced by yfR. More
## details about the change is available at github
## <<www.github.com/msperlin/yfR> You can install yfR by executing:
##
## remotes::install_github('msperlin/yfR')
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
assets <- as.data.frame(assets)
summary(assets)
## df.control.ticker df.control.src df.control.download.status
## Length:6185 Length:6185 Length:6185
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## df.control.total.obs df.control.perc.benchmark.dates
## Min. :1237 Min. :0.9594
## 1st Qu.:1237 1st Qu.:0.9594
## Median :1237 Median :0.9594
## Mean :1237 Mean :0.9594
## 3rd Qu.:1237 3rd Qu.:0.9594
## Max. :1237 Max. :0.9594
##
## df.control.threshold.decision df.tickers.price.open df.tickers.price.high
## Length:6185 Min. : 5.91 Min. : 6.08
## Class :character 1st Qu.: 18.80 1st Qu.: 19.07
## Mode :character Median : 25.10 Median : 25.50
## Mean : 32.00 Mean : 32.46
## 3rd Qu.: 36.66 3rd Qu.: 37.25
## Max. :119.80 Max. :120.45
##
## df.tickers.price.low df.tickers.price.close df.tickers.volume
## Min. : 5.77 Min. : 6.03 Min. : 0
## 1st Qu.: 18.47 1st Qu.: 18.77 1st Qu.: 6293500
## Median : 24.70 Median : 25.15 Median : 11487700
## Mean : 31.50 Mean : 31.98 Mean : 24552686
## 3rd Qu.: 36.04 3rd Qu.: 36.61 3rd Qu.: 30697300
## Max. :115.25 Max. :118.72 Max. :490230400
##
## df.tickers.price.adjusted df.tickers.ref.date df.tickers.ticker
## Min. : 4.479 Min. :2018-06-25 Length:6185
## 1st Qu.:12.381 1st Qu.:2019-09-24 Class :character
## Median :20.430 Median :2020-12-22 Mode :character
## Mean :26.531 Mean :2020-12-23
## 3rd Qu.:33.504 3rd Qu.:2022-03-25
## Max. :95.894 Max. :2023-06-21
##
## df.tickers.ret.adjusted.prices df.tickers.ret.closing.prices
## Min. :-0.352367 Min. :-0.352367
## 1st Qu.:-0.011859 1st Qu.:-0.012003
## Median : 0.000389 Median : 0.000300
## Mean : 0.000776 Mean : 0.000526
## 3rd Qu.: 0.013811 3rd Qu.: 0.013704
## Max. : 0.200671 Max. : 0.200671
## NA's :5 NA's :5
# Exibe os 5 primeiros dados
head(assets)
## df.control.ticker df.control.src df.control.download.status
## 1 EQTL3.SA yahoo OK
## 2 PETR4.SA yahoo OK
## 3 VALE3.SA yahoo OK
## 4 WEGE3.SA yahoo OK
## 5 EMBR3.SA yahoo OK
## 6 EQTL3.SA yahoo OK
## df.control.total.obs df.control.perc.benchmark.dates
## 1 1237 0.9593949
## 2 1237 0.9593949
## 3 1237 0.9593949
## 4 1237 0.9593949
## 5 1237 0.9593949
## 6 1237 0.9593949
## df.control.threshold.decision df.tickers.price.open df.tickers.price.high
## 1 KEEP 11.398 11.896
## 2 KEEP 11.890 11.914
## 3 KEEP 11.514 11.572
## 4 KEEP 11.252 11.654
## 5 KEEP 11.502 11.606
## 6 KEEP 11.364 11.772
## df.tickers.price.low df.tickers.price.close df.tickers.volume
## 1 11.398 11.802 5316500
## 2 11.462 11.514 5794500
## 3 11.250 11.252 3397000
## 4 11.250 11.560 4871500
## 5 11.356 11.356 8182500
## 6 11.306 11.700 3956500
## df.tickers.price.adjusted df.tickers.ref.date df.tickers.ticker
## 1 10.62555 2018-06-25 EQTL3.SA
## 2 10.36626 2018-06-26 EQTL3.SA
## 3 10.13037 2018-06-27 EQTL3.SA
## 4 10.40767 2018-06-28 EQTL3.SA
## 5 10.22401 2018-06-29 EQTL3.SA
## 6 10.53372 2018-07-02 EQTL3.SA
## df.tickers.ret.adjusted.prices df.tickers.ret.closing.prices
## 1 NA NA
## 2 -0.02470525 -0.02470533
## 3 -0.02301794 -0.02301780
## 4 0.02700508 0.02700502
## 5 -0.01780467 -0.01780467
## 6 0.02984263 0.02984259
# Exibindo o nome de todas as colunas baixadas.
colnames(assets)
## [1] "df.control.ticker" "df.control.src"
## [3] "df.control.download.status" "df.control.total.obs"
## [5] "df.control.perc.benchmark.dates" "df.control.threshold.decision"
## [7] "df.tickers.price.open" "df.tickers.price.high"
## [9] "df.tickers.price.low" "df.tickers.price.close"
## [11] "df.tickers.volume" "df.tickers.price.adjusted"
## [13] "df.tickers.ref.date" "df.tickers.ticker"
## [15] "df.tickers.ret.adjusted.prices" "df.tickers.ret.closing.prices"
# Criar um dataframe contendo somente informações úteis numéricas.
# cbind junta tudo dentro do ()
# antes do = nomeia a coluna
# depois do = recebe a coluna do dataframe original
# Pegar uma coluna do dataframe df$coluna, df = nome do dataframe, coluna = resultados de colnames
ativos <- as.data.frame(cbind(Data = assets[which(colnames(assets) == "df.tickers.ref.date")],
Ticker = assets$df.tickers.ticker, # Aparentemente faz mais sentido que
# df.control.ticker"
Open = assets$df.tickers.price.open,
Close = assets$df.tickers.price.close,
Low = assets$df.tickers.price.low,
High = assets$df.tickers.price.high,
Ajuste = assets$df.tickers.price.adjusted,
Volume = assets$df.tickers.volume))
# A estrutura df[] retorna a posição da coluna dentro do dataframe df. Por algum motivo o cbind desconfigura as tadas.
# assets[which(colnames(assets) == "df.tickers.ref.date")] retorna a coluna em que a data estiver e coloca na
# primeira posição do dataframe
# renomear a primeira coluna
colnames(ativos)[1] <- "Data"
# esta primeira visualização permite apenas avaliar a classe dos parâmetros: numéricos, categóricos e data e além disso entender se existem valores nulos baixados pela base. Caso existam NAs, a base precisará ser tratada
summary(ativos)
## Data Ticker Open Close
## Min. :2018-06-25 Length:6185 Min. : 5.91 Min. : 6.03
## 1st Qu.:2019-09-24 Class :character 1st Qu.: 18.80 1st Qu.: 18.77
## Median :2020-12-22 Mode :character Median : 25.10 Median : 25.15
## Mean :2020-12-23 Mean : 32.00 Mean : 31.98
## 3rd Qu.:2022-03-25 3rd Qu.: 36.66 3rd Qu.: 36.61
## Max. :2023-06-21 Max. :119.80 Max. :118.72
## Low High Ajuste Volume
## Min. : 5.77 Min. : 6.08 Min. : 4.479 Min. : 0
## 1st Qu.: 18.47 1st Qu.: 19.07 1st Qu.:12.381 1st Qu.: 6293500
## Median : 24.70 Median : 25.50 Median :20.430 Median : 11487700
## Mean : 31.50 Mean : 32.46 Mean :26.531 Mean : 24552686
## 3rd Qu.: 36.04 3rd Qu.: 37.25 3rd Qu.:33.504 3rd Qu.: 30697300
## Max. :115.25 Max. :120.45 Max. :95.894 Max. :490230400
#Pode-se fazer um summary para cada coluna em específico na qual o Ticker é igual a um ativo. O exemplo prático é o seguinte:
# summary(subset(ativos, Ticker == "Coloque o ticker que você definiu e baixou "))
summary(subset(ativos, Ticker == 'EQTL3.SA'))
## Data Ticker Open Close
## Min. :2018-06-25 Length:1237 Min. :11.23 Min. :11.25
## 1st Qu.:2019-09-24 Class :character 1st Qu.:18.90 1st Qu.:18.91
## Median :2020-12-22 Mode :character Median :22.91 Median :22.95
## Mean :2020-12-23 Mean :21.81 Mean :21.83
## 3rd Qu.:2022-03-25 3rd Qu.:25.00 3rd Qu.:25.03
## Max. :2023-06-21 Max. :31.25 Max. :31.15
## Low High Ajuste Volume
## Min. :11.13 Min. :11.49 Min. :10.13 Min. : 2082600
## 1st Qu.:18.64 1st Qu.:19.17 1st Qu.:17.22 1st Qu.: 4772700
## Median :22.63 Median :23.27 Median :21.82 Median : 6523600
## Mean :21.48 Mean :22.12 Mean :20.67 Mean : 7427455
## 3rd Qu.:24.67 3rd Qu.:25.40 3rd Qu.:24.14 3rd Qu.: 9039900
## Max. :30.99 Max. :31.41 Max. :31.15 Max. :28311200
# caso queiramos trabalhar com cada daframe isoladamente, podemos carrecar o subset deste jeito
EQTL3 <- subset(ativos, Ticker == 'EQTL3.SA')
# Agora podemos chamar diretamente EQTL3
head(EQTL3)
## Data Ticker Open Close Low High Ajuste Volume
## 1 2018-06-25 EQTL3.SA 11.398 11.802 11.398 11.896 10.62555 5316500
## 2 2018-06-26 EQTL3.SA 11.890 11.514 11.462 11.914 10.36626 5794500
## 3 2018-06-27 EQTL3.SA 11.514 11.252 11.250 11.572 10.13037 3397000
## 4 2018-06-28 EQTL3.SA 11.252 11.560 11.250 11.654 10.40767 4871500
## 5 2018-06-29 EQTL3.SA 11.502 11.356 11.356 11.606 10.22401 8182500
## 6 2018-07-02 EQTL3.SA 11.364 11.700 11.306 11.772 10.53372 3956500
# podemos fazer o processo repetidamente em código, trocando cada variável ou fazer de um jeito mais inteligente (porém menos acessivel). Todavia, o GPT nos ajuda com isso. Peça ao GPT para que cada item contido em tickers ele gere um dataframe utilizando subset.
# Retorna os valores únicos da coluna TICKER para você entender o FOR
unique(ativos$Ticker)
## [1] "EQTL3.SA" "PETR4.SA" "VALE3.SA" "WEGE3.SA" "EMBR3.SA"
# Retorna os valores do dataframe ticker
tickers
## [1] "EQTL3.SA" "PETR4.SA" "VALE3.SA" "WEGE3.SA" "EMBR3.SA"
# Para cada ticker dentro do dataframe tickers (você definiu){
for (i in tickers) {
# cria-se um subset de ativos, no qual a coluna Ticker em ativos recebe o primeiro elemento (i) em tickers.
# na posição 1 i = EQTL3.SA, na posição 2 = PETR4.SA e assim até EMBR3.SA
subset_dataframe <- subset(ativos, Ticker == i)
# grava ticker como um dataframe com a variável subset_dataframe, para que vocÊ possa acessá-lo posteriormente)
assign(i, subset_dataframe)
}
summary(EQTL3.SA)
## Data Ticker Open Close
## Min. :2018-06-25 Length:1237 Min. :11.23 Min. :11.25
## 1st Qu.:2019-09-24 Class :character 1st Qu.:18.90 1st Qu.:18.91
## Median :2020-12-22 Mode :character Median :22.91 Median :22.95
## Mean :2020-12-23 Mean :21.81 Mean :21.83
## 3rd Qu.:2022-03-25 3rd Qu.:25.00 3rd Qu.:25.03
## Max. :2023-06-21 Max. :31.25 Max. :31.15
## Low High Ajuste Volume
## Min. :11.13 Min. :11.49 Min. :10.13 Min. : 2082600
## 1st Qu.:18.64 1st Qu.:19.17 1st Qu.:17.22 1st Qu.: 4772700
## Median :22.63 Median :23.27 Median :21.82 Median : 6523600
## Mean :21.48 Mean :22.12 Mean :20.67 Mean : 7427455
## 3rd Qu.:24.67 3rd Qu.:25.40 3rd Qu.:24.14 3rd Qu.: 9039900
## Max. :30.99 Max. :31.41 Max. :31.15 Max. :28311200
summary(PETR4.SA)
## Data Ticker Open Close
## Min. :2018-06-25 Length:1237 Min. :11.07 Min. :11.29
## 1st Qu.:2019-09-24 Class :character 1st Qu.:23.54 1st Qu.:23.57
## Median :2020-12-22 Mode :character Median :26.63 Median :26.68
## Mean :2020-12-23 Mean :26.16 Mean :26.15
## 3rd Qu.:2022-03-25 3rd Qu.:29.00 3rd Qu.:28.98
## Max. :2023-06-21 Max. :37.65 Max. :37.72
## Low High Ajuste Volume
## Min. :10.85 Min. :12.18 Min. : 4.479 Min. : 17977100
## 1st Qu.:23.15 1st Qu.:23.95 1st Qu.: 9.439 1st Qu.: 48877800
## Median :26.22 Median :26.97 Median :11.038 Median : 63598500
## Mean :25.74 Mean :26.57 Mean :12.906 Mean : 71791692
## 3rd Qu.:28.58 3rd Qu.:29.27 3rd Qu.:16.109 3rd Qu.: 86264000
## Max. :36.85 Max. :38.39 Max. :31.850 Max. :490230400
summary(VALE3.SA)
## Data Ticker Open Close
## Min. :2018-06-25 Length:1237 Min. : 35.55 Min. : 34.10
## 1st Qu.:2019-09-24 Class :character 1st Qu.: 51.87 1st Qu.: 51.78
## Median :2020-12-22 Mode :character Median : 66.80 Median : 66.56
## Mean :2020-12-23 Mean : 69.81 Mean : 69.74
## 3rd Qu.:2022-03-25 3rd Qu.: 85.90 3rd Qu.: 85.72
## Max. :2023-06-21 Max. :119.80 Max. :118.72
## Low High Ajuste Volume
## Min. : 32.45 Min. : 35.86 Min. :24.84 Min. : 4356600
## 1st Qu.: 51.15 1st Qu.: 52.42 1st Qu.:36.80 1st Qu.: 18118600
## Median : 65.83 Median : 67.70 Median :61.28 Median : 23933600
## Mean : 68.83 Mean : 70.68 Mean :57.60 Mean : 26295480
## 3rd Qu.: 84.72 3rd Qu.: 86.73 3rd Qu.:76.55 3rd Qu.: 31476600
## Max. :115.25 Max. :120.45 Max. :95.89 Max. :183534500
summary(WEGE3.SA)
## Data Ticker Open Close
## Min. :2018-06-25 Length:1237 Min. : 7.75 Min. : 7.83
## 1st Qu.:2019-09-24 Class :character 1st Qu.:11.90 1st Qu.:11.91
## Median :2020-12-22 Mode :character Median :30.30 Median :30.21
## Mean :2020-12-23 Mean :26.10 Mean :26.09
## 3rd Qu.:2022-03-25 3rd Qu.:36.66 3rd Qu.:36.61
## Max. :2023-06-21 Max. :46.46 Max. :46.10
## Low High Ajuste Volume
## Min. : 7.75 Min. : 8.01 Min. : 7.307 Min. : 0
## 1st Qu.:11.78 1st Qu.:12.11 1st Qu.:11.387 1st Qu.: 5594500
## Median :29.81 Median :30.78 Median :29.713 Median : 7460300
## Mean :25.68 Mean :26.53 Mean :25.397 Mean : 8595393
## 3rd Qu.:36.07 3rd Qu.:37.23 3rd Qu.:35.486 3rd Qu.:10405200
## Max. :44.80 Max. :46.93 Max. :44.467 Max. :43934000
summary(EMBR3.SA)
## Data Ticker Open Close
## Min. :2018-06-25 Length:1237 Min. : 5.91 Min. : 6.03
## 1st Qu.:2019-09-24 Class :character 1st Qu.:12.78 1st Qu.:12.83
## Median :2020-12-22 Mode :character Median :17.93 Median :17.87
## Mean :2020-12-23 Mean :16.10 Mean :16.08
## 3rd Qu.:2022-03-25 3rd Qu.:19.50 3rd Qu.:19.48
## Max. :2023-06-21 Max. :26.61 Max. :26.95
## Low High Ajuste Volume
## Min. : 5.77 Min. : 6.08 Min. : 6.03 Min. : 888800
## 1st Qu.:12.51 1st Qu.:13.13 1st Qu.:12.83 1st Qu.: 3455400
## Median :17.66 Median :18.11 Median :17.87 Median : 7107500
## Mean :15.79 Mean :16.40 Mean :16.08 Mean : 8653408
## 3rd Qu.:19.24 3rd Qu.:19.75 3rd Qu.:19.48 3rd Qu.: 11130300
## Max. :26.11 Max. :28.00 Max. :26.91 Max. :125473100
#insttal.packages(ggplot)
# Carregar as bibliotecas necessárias
library(ggplot2)
# Criar o gráfico de dispersão
ggplot(ativos, aes(x = Ticker, y = Ajuste)) +
geom_point() +
xlab("Ticker") +
ylab("Preço") +
ggtitle("Gráfico de Dispersão dos Preços por Ticker")
# O gráfico abaixo não representa muita coisa! já que a dimensão esta apenas no preço de ajuste.
# muito similar ao código acima, porém vamos definir o tamanho com a coluna de volume
library(ggplot2)
library(scales)
# Criar o gráfico de dispersão com preço por volume
ggplot(ativos, aes(x = Ticker, y = Ajuste, size = Volume)) +
geom_point() +
xlab("Ticker") +
ylab("Preço") +
ggtitle("Gráfico de Dispersão: Preço por Volume") +
scale_size_continuous(labels = comma)
library(ggplot2)
#install.packages("scales")
library(scales)
# Criar o gráfico de dispersão de ajuste por volume dividido em 5 painéis
ggplot(ativos, aes(x = Ajuste, y = Volume)) +
geom_point() +
xlab("Ajuste") +
ylab("Volume") +
ggtitle("Gráfico de Dispersão: Ajuste por Volume") +
facet_wrap(~ Ticker, nrow = 1, ncol = 5) + # Linha que resolve o problema de exibição
scale_y_continuous(labels = comma_format()) # Arruma o eixo Y de um jeito mais amigável
## Plotando a correlação entre as variáveis
# A opção mais simples é criar um dataframe com os preços de ajuste e plotar
# tentei plotar direto e não consegui
ajustes <- as.data.frame(cbind(WEG = WEGE3.SA$Ajuste,
VALE = VALE3.SA$Ajuste,
EMBR = EMBR3.SA$Ajuste,
PETR = PETR4.SA$Ajuste,
EQTL = EQTL3.SA$Ajuste))
# Este é o jeito mais tranquilo
plot(ajustes)
# Converter a matriz em um dataframe
dados_cor <- as.data.frame(cor(ajustes))
# Obter as combinações de variáveis para as estéticas x e y
dados_cor$linhas <- rownames(dados_cor)
dados_cor <- reshape2::melt(dados_cor, id.vars = "linhas")
# Criar o heatmap
heatmap <- ggplot(data = dados_cor, aes(x = linhas, y = variable, fill = value)) +
geom_tile() +
scale_fill_gradient(low = "blue", high = "red") +
labs(title = "Heatmap de Correlação") +
theme_minimal()
print(heatmap)
## Plotando os dataframes em candlesticks (padrões de vela da análise
técnica)
# Biblioteca
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
## Loading required package: TTR
# Vamos utilizar o dataframe 'ativos'
# Retirando Volume e Ajuste de ativos
candles <- subset(ativos, select = -c(Volume, Ajuste))
# Trocar ordem das colunas no dataframe candles
candles <- candles[, c("Data", "Ticker", "Open", "Close", "Low", "High")]
head(candles)
## Data Ticker Open Close Low High
## 1 2018-06-25 EQTL3.SA 11.398 11.802 11.398 11.896
## 2 2018-06-26 EQTL3.SA 11.890 11.514 11.462 11.914
## 3 2018-06-27 EQTL3.SA 11.514 11.252 11.250 11.572
## 4 2018-06-28 EQTL3.SA 11.252 11.560 11.250 11.654
## 5 2018-06-29 EQTL3.SA 11.502 11.356 11.356 11.606
## 6 2018-07-02 EQTL3.SA 11.364 11.700 11.306 11.772
# Loop para criar os gráficos de candlestick para cada ativo
for (ativo in tickers) {
# Criar subset para o ativo atual
subset_candles <- candles[candles$Ticker == ativo, ]
# Configurar a coluna de data para o formato correto
subset_candles$Data <- as.POSIXct(subset_candles$Data)
# Criar objeto 'xts' apenas com as colunas relevantes
subset_xts <- xts(subset_candles[, -(1:2)], order.by = subset_candles$Data)
# Plotar o gráfico de candlestick
chartSeries(subset_xts, type = "candlesticks", name = ativo, theme = chartTheme("white", col = c("green", "red")))
}
# Jeito fácil
#install.packages("plotly")
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(htmltools)
candles2 <- subset(ativos, select = c(Data, Ticker, Open, Close, High, Low, Volume))
head(candles2)
## Data Ticker Open Close High Low Volume
## 1 2018-06-25 EQTL3.SA 11.398 11.802 11.896 11.398 5316500
## 2 2018-06-26 EQTL3.SA 11.890 11.514 11.914 11.462 5794500
## 3 2018-06-27 EQTL3.SA 11.514 11.252 11.572 11.250 3397000
## 4 2018-06-28 EQTL3.SA 11.252 11.560 11.654 11.250 4871500
## 5 2018-06-29 EQTL3.SA 11.502 11.356 11.606 11.356 8182500
## 6 2018-07-02 EQTL3.SA 11.364 11.700 11.772 11.306 3956500
for (ativo in unique(candles2$Ticker)) {
subset_candles <- subset(candles2, Ticker == ativo)
subset_candles <- data.frame(Date = as.Date(index(subset_candles)), coredata(subset_candles))
fig <- plot_ly(data = subset_candles, x = ~Date, type = "candlestick",
open = ~Open, close = ~Close,
high = ~High, low = ~Low, name = "Candles")
fig <- layout(fig, title = "Basic Candlestick Chart",
xaxis = list(type = "date", rangeslider = list(visible = FALSE)))
fig2 <- plot_ly(subset_candles, x = ~Date, y = ~Volume, type = 'bar', name = "Volume",
marker = list(color = ifelse(c(subset_candles$Volume[-1] > subset_candles$Volume[-length(subset_candles$Volume)]), "green", "red")))
fig2 <- layout(fig2, yaxis = list(title = "Volume"))
fig <- subplot(fig, fig2, heights = c(0.7, 0.2), nrows = 2,
shareX = TRUE, titleY = TRUE)
html_print(fig)
knitr::knit_print(fig)
}