L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 2103

 
Vladimir Perervenko:

Disposez-vous d'une fonction qui calcule à la fois la valeur nette et la commission ?

 
mytarmailS:

Auriez-vous par hasard une fonction qui calcule à la fois la valeur nette et la commission ?

Langue, échange, forex ? Je ne comprends pas.

 
Vladimir Perervenko:

Langue, bourse, forex ? Je ne sais pas de quoi il s'agit.

R-ka, forex.

Eh bien une fonction qui calculerait un tableau de balance des transactions + commission\spread (coûts)

J'ai écrit ça, je ne sais pas si c'est correct.

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)}

 

Exemple d'un script en R qui utilise le paquet "MetaTrader5" (Python) pour télécharger les cotations. La bibliothèque "reticulate" doit être installée dans R. Cette bibliothèque fournit une interaction avec Python. Lisez attentivement ici et ici. Lorsque vous exécutez la bibliothèque reticulate pour la première fois, il vous sera proposé d'installer miniconda. Je vous recommande de ne pas refuser. Ceci créera l'environnement conda r-reticulate avec python(3.6.xx) et un ensemble initial de paquets installés. Si vous avez déjà installé Pyhon (ou plusieurs versions), vous devez activer l'environnement requis au début du script. Toutes les commandes du paquet MetaTrader5 sont ici.

Script d'initialisation

#---необходимые константы------------------
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


Pour télécharger des citations, nous allons écrire la fonction

#---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)
}

Voyons la structure des données obtenues.

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)

Nous ferons ensuite les calculs nécessaires.

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:

R-card, forex.

Eh bien une fonction qui calculerait un tableau de balance des transactions + commission/spread (coûts)

a écrit ça, je ne sais pas si c'est bien.


Je ne comprends pas.

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

R-card, forex.

Eh bien une fonction qui calculerait un tableau de balance des transactions + commission/spread (coûts)

J'ai écrit ça, je ne sais pas si c'est bien.


Je pense que le nombre de transactions ne doit pas être compté ici. Nous devons juste soustraire la marge avec commission de chaque transaction. C'est donc comme ça :

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:

Je ne pense pas que le nombre de transactions doive être compté ici. Il suffit de soustraire le spread et la commission de chaque transaction. C'est comme ça :

Pas comme ça. Par exemple

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

La commission ne sera pas facturée sur chaque signal, mais seulement lorsque le signal est inversé. J'utilise la fonction

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)
}

Pour le vecteur de signal ci-dessus

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

La différence n'est pas claire.

Et pour calculer le solde, la fonction

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)
}

Bonne chance

 
Vladimir Perervenko:

Je ne comprends pas.

Avec "rle", vous pouvez calculer le nombre de changements de signaux, c'est-à-dire le nombre de transactions.

 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

Vous pouvez voir par "valeurs" que le signal a changé 5 fois, cela signifie qu'il y a eu 5 transactions.

Vladimir Perervenko:

Je ne comprends pas la différence.

Je pense que ma mise en œuvre prend en compte comme si la commission de "la première transaction, dont nous n'avons pas l'ouverture, il n'y a que la fermeture".

 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

comme pour cette affaire, ma variante prend une commission

Votre version est plus correcte mais il est facile de la corriger, il suffit de soustraire "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:

Exemple de script en R utilisant ...

Merci, je vais m'en occuper.

 
mytarmailS:

Avec "rle", vous pouvez calculer le nombre de changements de signaux, c'est-à-dire le nombre de transactions.

Vous pouvez voir par les "valeurs" que le signal a changé 5 fois, cela signifie qu'il y a eu 5 transactions.

Je pense que ma mise en œuvre prend également en compte la commission et comme "la première transaction, dont nous n'avons pas l'ouverture, il n'y a que la fermeture".

comme pour cette affaire, ma variante prend une commission

et votre variante commence à prendre de celui-ci, votre variante est plus correcte, mais il est facile de corriger, il suffit de faire, il suffit de soustraire "1".

Oui, votre version est plus correcte.