이동 평균 및 윌리엄스 지표에 기초한 일일 FX 전략

저자:차오장, 날짜: 2024-01-29 14:35:48
태그:

img

전반적인 설명

이 전략은 이동 평균, ATR 지표 및 윌리엄스 지표를 결합하여 매일 FX 거래를 수행합니다. 먼저 이동 평균을 통해 가격 트렌드와 잠재적 인 반전 지점을 판단하고, 이후 윌리엄스 지표를 사용하여 거래 신호를 추가로 확인하고, ATR 지표를 활용하여 스톱 로스 및 포지션 사이즈를 계산합니다.

전략 논리

  1. 전체 트렌드를 결정하기 위해 20일 이동 평균 (기본선) 을 사용하십시오. 아래에서 상향으로의 가격 교차는 구매 신호이며, 위에서 아래로의 교차는 판매 신호입니다.
  2. 윌리엄스 지표는 가격 반전을 확인하는 데 사용됩니다. 지표가 -35을 넘으면 구매 확인이고 -70을 넘으면 판매 확인입니다.
  3. ATR 지표는 지난 2 일 동안 가격 범위의 평균을 계산합니다. 인수로 곱한 값은 중지 손실 거리로 설정됩니다.
  4. 포지션 크기는 계정 자금의 50% 리스크를 기준으로 합니다. 거래 크기는 스톱 로스 거리와 리스크 비율을 기준으로 계산됩니다.
  5. 긴 포지션에 진입한 후, 스톱 로스는 낮은 가격에서 마이너스 스톱 로스 거리를 설정합니다. 이윤을 취하는 것은 입시 가격과 100 포인트로 설정됩니다. 출구 논리는 출구 신호를 추가로 확인합니다.
  6. 유사하게 짧은 포지션, 손실 중지 및 이익 취득은 같은 방식으로 설정됩니다. 출구 논리 또한 출구를 확인하는 데 사용됩니다.

이점 분석

  1. 유동평균을 통한 트렌드 판단과 지표를 통한 확인을 결합하면 잘못된 브레이크로 인한 손실을 효과적으로 피할 수 있습니다.
  2. ATR의 동적 스톱 손실은 시장 변동성에 따라 합리적인 스톱 거리를 설정할 수 있습니다.
  3. 리스크 제어 및 동적 위치 사이즈링은 단일 거래 손실에 대한 통제를 극대화 할 수 있습니다.
  4. 출구 논리와 이동 평균을 결합하면 좋은 출구 타이밍을 확인하고 조기 수익을 피하는 데 도움이 될 수 있습니다.

위험 분석

  1. 이동 평균 신호는 잘못된 확률이 높을 수 있으며, 지표로부터 추가 확인이 필요합니다.
  2. 지표 자체는 또한 손실을 완전히 피할 수 없기 때문에 잘못된 신호를 생성 할 수 있습니다.
  3. 이 전략은 트렌딩 쌍에 더 잘 맞지만, 범위에 묶인 쌍에서는 더 나쁜 결과를 가져올 수 있습니다.
  4. 부적절한 위험 통제 비율 설정도 전략 수익성에 영향을 줄 수 있습니다.

이동 평균 기간의 조정, 더 많은 지표의 결합, 수동 개입 등과 같은 방법은 전략을 더 최적화하고 개선하는 데 도움이 될 수 있습니다.

결론

이 전략은 트렌드 판단과 지표 필터를 결합하여 매일 거래를 수행합니다. 또한 동적 스톱 로스, 리스크 제어 및 다른 방법을 활용하여 거래 위험을 제어합니다. 전략 성능을 더욱 향상시키기 위해 매개 변수 조정 및 방법 조합에 의해 최적화 할 수있는 많은 공간이 있습니다.


/*backtest
start: 2023-12-29 00:00:00
end: 2024-01-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("GBPJPY DAILY FX",initial_capital = 1000,currency="USD", overlay=true)

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//INDICATOR---------------------------------------------------------------------    
    //Average True Range (1. RISK)
atr_period = 2
atr = atr(atr_period)



    //Ichimoku Cloud - Kijun Sen (2. BASELINE)
ks_period = 20
kijun_sen = (highest(haHigh,ks_period) + lowest(haLow,ks_period))/2
base_long = haOpen < kijun_sen and haClose > kijun_sen
base_short = haOpen > kijun_sen and haClose < kijun_sen

    //Williams Percent Range (3. Confirmation#1)
use_wpr = true
wpr_len = 4
wpr = -100*(highest(haHigh,wpr_len) - haClose)/(highest(haHigh,wpr_len) - lowest(haLow,wpr_len))
wpr_up = -35
wpr_low = -70
conf1_long = wpr >= wpr_up
conf1_short = wpr <= wpr_low
if(use_wpr == false)
    conf1_long := true
    conf1_short := true
//TRADE LOGIC-------------------------------------------------------------------
    //Long Entry
    //if -> WPR crosses below -39 AND MACD line is less than signal line
l_en = base_long and conf1_long
    //Long Exit
    //if -> WPR crosses above -14
l_ex = haClose < kijun_sen
    //Short Entry
    //if -> WPR crosses above -39 AND MACD line is greater than signal line
s_en = base_short and conf1_short
    //Short Exit
    //if -> WPR crosses under -14
s_ex = haClose > kijun_sen
    
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
isTwoDigit = input(true,"Is this a 2 digit pair? (JPY, XAU, XPD...")
risk = input(50,"Risk %")/100           //risk % per trade
equity_protector = input(30,"Equity Protection %")/100  //equity protection %
stop = atr*100000*input(1,"Average True Range multiplier")    //Stop level
if(isTwoDigit)
    stop := stop/100
target = input(100, "Target TP in Points")  //TP level
    //Calculate current DD and determine if stopout is necessary
equity_stopout = false
if(floating<0 and abs(floating/balance)>equity_protector)
    equity_stopout := true
    
    //Calculate the size of the next trade
temp01 = balance * risk     //Risk in USD
temp02 = temp01/stop        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 1)
    size := 1            //Set min. lot size

//TRADE EXECUTION---------------------------------------------------------------
strategy.close_all(equity_stopout)      //Close all trades w/equity protector
is_open = strategy.opentrades > 0

fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

if(time_cond)
    strategy.entry("l_en",true,1,oca_name="a",when=l_en and not is_open)  //Long entry
    strategy.entry("s_en",false,1,oca_name="a",when=s_en and not is_open) //Short entry
    
    strategy.exit("S/L","l_en",loss=stop, profit=target)      //Long exit (stop loss)
    strategy.close("l_en",when=l_ex)            //Long exit (exit condition)
    strategy.exit("S/L","s_en",loss=stop, profit=target)      //Short exit (stop loss)
    strategy.close("s_en",when=s_ex)            //Short exit (exit condition)


더 많은