Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 2103

 
Vladimir Perervenko:

¿Por casualidad tienen una función que calcule tanto el valor neto como la comisión?

 
mytarmailS:

¿Tiene por casualidad una función que calcule tanto el valor neto como la comisión?

¿Idioma, intercambio, forex? No lo entiendo.

 
Vladimir Perervenko:

¿Idioma, bolsa, forex? No sé de qué se trata.

R-ka, forex.

Bueno, una función que calcularía un gráfico de balance de los oficios + commission\spread (costos)

He escrito esto, no sé si es correcto.

calc.balance <- function(sig,x, comision=0){
sig <- ifelse(sig>0, 1, -1)

trades.count <- length(rle(c(sig))$values) # сколько было сделок
comis <- comision*trades.count


sig <- na.omit(  dplyr::lag(sig)  )
dC <- c(NA, diff(x))
bal <- cumsum(sig * tail(dC, length(sig) )   )

bal <- bal-comis
return(bal)}

 

Ejemplo de un script en R que utiliza el paquete "MetaTrader5" (Python) para descargar las cotizaciones. La biblioteca "reticulate" debe estar instalada en R. Esta biblioteca permite la interacción con Python. Lea atentamente aquí y aquí. Cuando ejecute la biblioteca reticulada por primera vez se le ofrecerá instalar miniconda. Le recomiendo que no se niegue. Esto creará el entorno conda r-reticulate con python(3.6.xx) y un conjunto inicial de paquetes instalados. Si ya has instalado Pyhon (o varias versiones) debes activar el entorno necesario al principio del script. Todos los comandos del paquete MetaTrader5 están aquí.

Script de inicialización

#---необходимые константы------------------
sym <- "Si-12.20"
#TERMINAL_PATH <- "C:/Program Files/.../terminal64.exe"
# server <- "Open-Broker"
# login <- xxxxxx
bar <- 6000 L
tf <- 3 L
ch <- 15 L
# TP <-5
# SL <-
# lot <- 1.0
# magik <-
#----------------------------------
require(reticulate)
#----Connect terminal(Python)-------------------
mt5 <- import('MetaTrader5')

if(!mt5$initialize())
    print("initialize() failed, error code =", mt5$last_error())


termInfo <- mt5$terminal_info()
termInfo$data_path -> dataPath
termInfo$name -> broker

#termInfo$trade_allowed
#termInfo$connected

AccInfo <- mt5$account_info()
AccInfo$login -> login
AccInfo$server -> server
AccInfo$balance -> start_balance
AccInfo$equity -> start_equity
AccInfo$profit -> profit

selected = mt5$symbol_select(sym,TRUE)
if(!selected){
    print("Failed to select ", sym, ", error code =", mt5$last_error())
    mt5$shutdown()
    quit()
}

SymInfo = mt5$symbol_info(sym)
SymInfo$digits -> Dig


Para descargar las cotizaciones escribiremos la función

#---Function-------------------------------
GetCotirPy <- function(sym){
    selected = mt5$symbol_select(sym,TRUE)
    if (selected)
        py_run_string("
import pandas as pd
import MetaTrader5 as mt5
rates = pd.DataFrame(mt5.copy_rates_from_pos(r.sym, r.tf, 1, r.bar))"
        )
    return(py$rates)
}

Veamos la estructura de los datos obtenidos.

rates <- GetCotirPy(sym = sym)
str(rates)
'data.frame':   6000 obs. of  8 variables:
 $ time       : num  1.6e+09 1.6e+09 1.6e+09 1.6e+09 1.6e+09 ...
 $ open       : num  77498 77504 77511 77528 77553 ...
 $ high       : num  77520 77561 77555 77560 77578 ...
 $ low        : num  77472 77504 77500 77521 77537 ...
 $ close      : num  77502 77511 77528 77553 77564 ...
 $ tick_volume: num  2748 3934 1984 1459 2452 ...
 $ spread     : int  1 1 1 1 1 1 1 1 1 1 ...
 $ real_volume: num  11540 21547 8953 6521 14932 ...
 - attr(*, "pandas.index")=RangeIndex(start=0, stop=6000, step=1)

Además, haremos los cálculos necesarios.

reticulate 1.14
  • blog.rstudio.com
We’re excited to announce that 1.14 is now available on CRAN! You can install it with: With this release, we are introducing a major new feature: can now automatically configure a Python environment for the user, in coordination with any loaded R packages that depend on . This means that: Ultimately, the goal is for R packages using to be able...
 
mytarmailS:

Tarjeta R, forex.

Bueno, una función que calcularía un gráfico de balance de las operaciones + comisión / spread (costos)

escribió esto, no sé si es correcto.


No lo entiendo aquí.

trades.count <- length(rle(c(sig))$values) #  сколько было сделок
 
mytarmailS:

Tarjeta R, forex.

Bueno, una función que calcularía un gráfico de balance de las operaciones + comisión / spread (costos)

He escrito esto, no sé si es correcto.


Creo que el número de acuerdos no debería contarse aquí. Sólo hay que restar el diferencial con la comisión de cada operación. Así que es así:

calc.balance <- function(sig,x, comision=0){
sig <- ifelse(sig>0, 1, -1)


sig <- na.omit(  dplyr::lag(sig)  )
dC <- c(NA, diff(x))
bal <- cumsum(sig * tail(dC, length(sig) )   )

bal <- bal-comision
return(bal)}
 
elibrarius:

No creo que sea necesario contar el número de intercambios aquí. Sólo hay que restar el diferencial y la comisión de cada operación. Así es:

No así. Por ejemplo

sig<- rep(c(1,1,1,1,1,-1,-1,-1,-1), 100)
length(sig)
[1] 900

La comisión no se cobrará en cada señal, sino sólo cuando se invierta la señal. Utilizo la función

cnt<-function(x){
    n <- 1:(length(x)-1)
    cnt <- 0
    for(i in n) {if(x[i]!=x[i+1]) {cnt<-cnt+1}}
    return(cnt)
}

Para el vector de señales anterior

cnt(sig)
[1] 199
length(rle(c(sig))$values)
[1] 200

La diferencia no está clara.

Y para calcular el saldo la función

test_bal <- function(sig, CO){
    import::here(poorman, Lag = lag)
    import::here(.from = fTrading, maxDrawDown)
    sig %>%  Lag() %>% na.omit()->sig
    CO %>% tail(length(sig))-> CO
    bal <- cumsum(CO * sig)
    K <- (last(bal)/length(bal) * 10^Dig)%>% round()
    Kmax <- max(bal)/which.max(bal) * 10^Dig %>% round()
    dd <- maxDrawDown(bal)[[1]] %>% round()
    op <-cnt(sig)
    tst<-list(bal = bal, k = K, k.max = Kmax, op = op, dd = dd)
    return(tst)
}

Buena suerte

 
Vladimir Perervenko:

No lo entiendo aquí.

Con "rle" se puede calcular el número de cambios de señal, es decir, el número de operaciones

 sig <- c(1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1)
> sig
 [1] 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1
> rle(sig)
Run Length Encoding
  lengths: int [1:5] 5 4 3 4 3
  values : num [1:5] 1 0 1 0 1

Puedes ver por los "valores" que la señal ha cambiado 5 veces, significa que hubo 5 tratos.

Vladimir Perervenko:

No entiendo la diferencia.

Creo que mi aplicación tiene en cuenta como si la comisión de "el primer comercio, la apertura de los cuales no tenemos, sólo hay el cierre".

 sig <- c(1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1)

 [1] 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1

como para este trato, mi variante se lleva una comisión

Tu versión es más correcta, pero es fácil de corregir, sólo hay que restar "1".

 sig <- c(1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1)
> sig
 [1] 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1
 
Vladimir Perervenko:

Script de ejemplo en R utilizando ...

Gracias, lo investigaré.

 
mytarmailS:

Con "rle" puede calcular el número de cambios de señal, es decir, el número de operaciones.

Puede ver por los "valores" que la señal cambió 5 veces, significa que hubo 5 operaciones.

Creo que mi aplicación también tiene en cuenta la comisión y como "la primera transacción, cuya apertura no tenemos, sólo hay el cierre".

como para este trato, mi variante se lleva una comisión

y su variante comienza a tomar de este, su variante es más correcta, pero es fácil de corregir, sólo hacer, sólo restar "1"

Sí, su versión es más correcta.