Ежедневная стратегия FX на основе скользящей средней и индикатора Уильямса

Автор:Чао Чжан, Дата: 2024-01-29 14:35:48
Тэги:

img

Обзор

Эта стратегия сочетает в себе скользящую среднюю, индикатор ATR и индикатор Уильямса для ежедневной торговли валютой. Она сначала оценивает ценовую тенденцию и потенциальные точки переворота через скользящую среднюю, затем использует индикатор Уильямса для дальнейшего подтверждения торговых сигналов и использует индикатор 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)


Больше