Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 2103

 
Vladimir Perervenko:

Haben Sie zufällig eine Funktion, die sowohl den Nettowert als auch die Provision berechnet?

 
mytarmailS:

Haben Sie zufällig eine Funktion, die sowohl den Nettowert als auch die Provision berechnet?

Sprache, Austausch, Devisen? Ich verstehe das nicht.

 
Vladimir Perervenko:

Sprache, Börse, Devisen? Ich weiß nicht, worum es da geht.

R-ka, forex.

Nun, eine Funktion, die ein Gleichgewicht Diagramm der Trades + Kommission\Spread (Kosten) berechnen würde

Ich habe das geschrieben, ich weiß nicht, ob es richtig ist.

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

 

Beispiel für ein Skript in R, das das Paket "MetaTrader5" (Python) zum Herunterladen von Kursen verwendet. Die Bibliothek "reticulate" muss in R installiert sein. Diese Bibliothek ermöglicht die Interaktion mit Python. Lesen Sie sorgfältig hier und hier. Wenn Sie die reticulate Bibliothek zum ersten Mal ausführen, wird Ihnen angeboten, miniconda zu installieren. Ich empfehle Ihnen, sich nicht zu weigern. Dadurch wird die conda-Umgebung r-reticulate mit Python (3.6.xx) und einem ersten Satz von installierten Paketen erstellt. Wenn Sie Pyhon (oder mehrere Versionen) bereits installiert haben, sollten Sie die erforderliche Umgebung zu Beginn des Skripts aktivieren. Alle Befehle des MetaTrader5-Pakets finden Sie hier.

Skript zur Initialisierung

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


Zum Herunterladen von Zitaten schreiben wir die Funktion

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

Schauen wir uns die Struktur der erhaltenen Daten an.

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)

Außerdem werden wir die notwendigen Berechnungen durchführen.

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-Karte, Devisen.

Nun, eine Funktion, die eine Bilanztabelle der Trades + Kommission/Spread (Kosten) berechnen würde

geschrieben hat, weiß ich nicht, ob es richtig ist.


Ich verstehe das hier nicht.

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

R-Karte, Devisen.

Nun, eine Funktion, die eine Bilanztabelle der Trades + Kommission/Spread (Kosten) berechnen würde

Ich habe das geschrieben, ich weiß nicht, ob es richtig ist.


Ich denke, dass die Anzahl der Geschäfte hier nicht gezählt werden sollte. Wir müssen nur den Spread mit Provision von jedem Geschäft abziehen. Es ist also folgendermaßen:

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:

Ich glaube nicht, dass die Anzahl der Trades hier gezählt werden muss. Ziehen Sie einfach den Spread und die Kommission von jedem Handel ab. So ist das nun mal:

Nicht so. Zum Beispiel

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

Die Provision wird nicht für jedes Signal erhoben, sondern nur, wenn das Signal umgekehrt wird. Ich verwende die Funktion

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

Für den obigen Signalvektor

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

Der Unterschied ist nicht klar.

Und für die Berechnung des Saldos wird die Funktion

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

Viel Glück!

 
Vladimir Perervenko:

Ich verstehe das hier nicht.

Mit "rle" können Sie die Anzahl der Signalwechsel berechnen, d.h. die Anzahl der Geschäfte

 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

Anhand der "Werte" können Sie sehen, dass sich das Signal 5 Mal geändert hat, was bedeutet, dass es 5 Geschäfte gab.

Vladimir Perervenko:

Ich verstehe den Unterschied nicht.

Ich denke, meine Umsetzung berücksichtigt, als ob die Kommission von "der erste Handel, die Eröffnung von denen wir nicht haben, gibt es nur die Schließung".

 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

wie bei diesem Geschäft erhält meine Variante eine Provision

Ihre Version ist korrekter, aber es ist leicht zu korrigieren, ziehen Sie einfach die "1" ab.

 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:

Beispielskript in R mit ...

Danke, ich werde es mir ansehen.

 
mytarmailS:

Mit "rle" können Sie die Anzahl der Signalwechsel, d.h. die Anzahl der Trades, berechnen.

Anhand der "Werte" können Sie sehen, dass sich das Signal 5 Mal geändert hat, d. h. es wurden 5 Geschäfte getätigt.

Ich denke, meine Umsetzung berücksichtigt auch die Kommission und als "die erste Transaktion, die Eröffnung von denen wir nicht haben, gibt es nur die Schließung".

wie bei diesem Geschäft erhält meine Variante eine Provision

und Ihre Variante fängt an, von dieser zu nehmen, Ihre Variante ist richtiger, aber es ist leicht zu korrigieren, tun Sie einfach, subtrahieren Sie einfach "1"

Ja, Ihre Version ist richtiger.