トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 2103

 
ウラジミール・ペレヴェンコ

もしかして、純資産と手数料の両方を計算する機能があるのでしょうか?

 
mytarmailS:

ひょっとして、純資産と手数料の両方を計算する機能はないのでしょうか?

言語、交換、FX? 意味不明です。

 
Vladimir Perervenko:

言語、証券取引所、FX? 何のことだかわからない。

R-ka、FX。

トレードのバランスチャート+コミッションスプレッド(コスト)を計算する関数です。

私が書いたものですが、正しいかどうかわかりません。

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

 

MetaTrader5」(Python)パッケージを使用した、Rによる相場情報のダウンロードスクリプトの例です。Rに "reticulate "ライブラリがインストールされている必要があります。Pythonとのインタラクションを提供するライブラリです。ここと ここを よく読んでください。初めてレティキュレートライブラリを実行するとき、minicondaをインストールするように指示されます。断らないことをお勧めします。これは python(3.6.xx) とパッケージの初期セットがインストールされた conda 環境 r-reticulate を作成します。Pyhon (またはいくつかのバージョン) をすでにインストールしている場合は、スクリプトの最初に必要な環境を有効にする必要があります。MetaTrader5パッケージの全コマンドはこちら です。

初期化スクリプト

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


引用符をダウンロードするために、次の関数を作成します。

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

取得したデータの構造を見てみましょう。

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)

さらに、必要な計算を行います。

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カード、FX。

トレードのバランスチャート+手数料/スプレッド(コスト)を計算するような機能ですね。

が書いたものですが、正しいかどうかわかりません。


ここではわからない。

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

Rカード、FX。

トレードのバランスチャート+手数料/スプレッド(コスト)を計算するような機能ですね。

こんなの書いたんだけど、合ってるかな?


ここでは、案件の 数はカウントしない方がいいと思います。各取引から手数料を含むスプレッドを差し引けばよいのです。つまり、こういうことです。

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:

トレードの回数は、ここでは数える必要がないと思うんです。各取引からスプレッドと手数料を差し引くだけです。そういうことなんです。

こんなもんじゃない。例えば

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

手数料はすべてのシグナルに対して発生するのではなく、シグナルが反転したときのみ発生します。私が使っているのは、関数

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

上記の信号ベクトルに対して

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

その差は明確ではありません。

また、残高を計算するための関数

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

グッドラック

 
Vladimir Perervenko:

ここではわからない。

rle "を使用すると、シグナルの変化数、すなわちディール数を計算することができます。

 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

シグナルが5回変化していることが「値」でわかりますが、これは5回取引があったということです。

ウラジミール・ペレヴェンコ

その違いがわからない。

私は私の実装では、「最初の貿易、我々は持っていないのオープニングは、唯一の閉鎖が ある」の手数料のように考慮されると思います。

 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

この案件のように、私のバリアントは手数料を取ります。

の方が正しいのですが、訂正は簡単で、"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:

Rで...を使ったスクリプト例

ありがとうございます。

 
mytarmailS:

rle」では、シグナルの変化回数、つまりトレード回数を計算することができます。

シグナルが5回変化していることが「値」でわかりますが、これは5回の取引があったことを意味します。

私の実装では、手数料も考慮し、「最初のトランザクションは、我々は持っていないのオープニングは、唯一の閉鎖が ある」としていると思います。

この案件のように、私のバリアントは手数料を取ります。

で、あなたの変種はこの変種から取り始めます、あなたの変種はより正しいですが、修正するのは簡単です、ただやるだけです、ただ "1" を引くだけです。

はい、あなたのバージョンの方が正しいです。

理由: