트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 2103

 
블라디미르 페레르벤코 :

자기자본과 수수료를 계산하는 기능이 있습니까?

 
mytarmailS :

자기자본과 수수료를 계산하는 기능이 있습니까?

언어, 교환, 외환? 무엇을 이해하지 못했습니다.

 
블라디미르 페레르벤코 :

언어, 교환, 외환? 무엇을 이해하지 못했습니다.

R-카, 외환

글쎄, 거래에 대한 대차 대조표 + 수수료 \ 스프레드 (비용)를 고려하는 기능

제가 쓴건데 맞는지 모르겠네요

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에는 "망상" 라이브러리가 설치되어 있어야 합니다. 실제로 이 라이브러리는 Python과의 상호 작용을 제공합니다. 여기여기 를 주의 깊게 읽으십시오 . 망상 라이브러리를 처음 실행하면 miniconda를 설치하라는 메시지가 표시됩니다. 포기하지 않는 것이 좋습니다. 이것은 python(3.6.xx)이 설치되고 초기 패키지 세트가 있는 r-reticulate conda 환경을 생성합니다. 이미 Python(또는 여러 버전)이 설치되어 있는 경우 스크립트 시작 부분에서 원하는 환경을 활성화해야 합니다. "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-카, 외환

글쎄, 거래에 대한 대차 대조표 + 수수료 \ 스프레드 (비용)를 고려하는 기능

제가 쓴건데 맞는지 모르겠네요


난 여기가 이해가 안돼

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

R-카, 외환

글쎄, 거래에 대한 대차 대조표 + 수수료 \ 스프레드 (비용)를 고려하는 기능

제가 쓴건데 맞는지 모르겠네요


여기서 거래의 수는 고려할 필요가 없다고 생각합니다. 그리고 각 거래에서 수수료와 스프레드를 빼면 됩니다. 이 같은:

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)}
 
도서관 :

여기서 거래의 수는 고려할 필요가 없다고 생각합니다. 그리고 각 거래에서 수수료와 스프레드를 빼면 됩니다. 이 같은:

이 방법이 아닙니다. 예를 들어

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

행운을 빕니다

 
블라디미르 페레르벤코 :

난 여기가 이해가 안돼

c "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
 
블라디미르 페레르벤코 :

다음을 사용하는 R의 예제 스크립트 ...

고마워, 나는 그것을 조사할 것이다

 
mytarmailS :

c "rle" 신호 변경 횟수를 계산할 수 있습니다. 업무

"값"으로 신호가 5번 변경되었음을 알 수 있습니다. 이는 5번의 거래가 있었음을 의미합니다.

내 구현에서 수수료도 고려되며 "첫 번째 거래, 개설이 없는 경우 마감만 있는 경우 "

이 거래처럼 내 옵션은 커미션을 받습니다.

버전이 이 버전에서 가져오기 시작하면 버전이 더 정확하지만 수정하기 쉽습니다. 그냥 하고 "1"을 빼면 됩니다.

예, 버전이 정확합니다.

사유: