Дневная стратегия на основе скользящей средней и индикатора Вильямса


Дата создания: 2024-01-29 14:35:48 Последнее изменение: 2024-01-29 14:35:48
Копировать: 1 Количество просмотров: 639
1
Подписаться
1617
Подписчики

Дневная стратегия на основе скользящей средней и индикатора Вильямса

Обзор

Эта стратегия в сочетании с использованием средней линии, показателя ATR и показателя Вильгельма проводит торговлю на уровне дневной линии для валютной разновидности GBP/JPY. С помощью средней линии стратегия сначала определяет ценовые тенденции и возможные точки разворота, затем использует показатель Вильгельма для дальнейшей подтверждения торговых сигналов, а также рассчитывает стоп-лосс и объем торговли с помощью показателя ATR.

Стратегический принцип

  1. Используйте 20-дневную среднюю линию (базовую линию) для определения общей тенденции цены, цена считывается как сигнал покупки ниже средней линии, и как сигнал продажи ниже средней линии
  2. Индикатор Уильяма используется для подтверждения обратного движения цены. При повышении на 35 показатель подтверждает покупку, при повышении на 70 - продажу.
  3. Показатель ATR рассчитывает средний диапазон колебаний за последние 2 дня. Этот показатель умножается на коэффициент и устанавливается как стоп-дистанция
  4. Контроль риска в соответствии с 50% долей в аккаунте. Объем сделки рассчитывается в соответствии с остановкой и риском
  5. После входа в длинную позицию остановка уменьшается за счет расстояния от остановки до нижней точки цены. Стоп-стоп добавляет 100 пунктов к входной точке. Логика выхода используется для дальнейшего подтверждения сигнала выхода
  6. После входа в короткую позицию, стоп и стоп-ап находятся на одном уровне. Exiting logic используется для дальнейшего подтверждения выхода

Анализ преимуществ

  1. Комбинированное использование средней линии для определения тенденции и показателей для подтверждения входа в игру может эффективно отфильтровывать убытки от ложных прорывов.
  2. ATR динамический стоп может устанавливать разумные стоп-дистанции в зависимости от колебаний рынка
  3. Контроль риска и динамический расчет объема торгов позволяют максимально контролировать одиночные потери
  4. Выходная логика в сочетании с равномерным суждением позволяет дополнительно подтвердить время выхода и избежать преждевременного прекращения деятельности

Анализ рисков

  1. Уровень средней оценки имеет большую вероятность получения ошибочного сигнала и требует дальнейшего подтверждения показателя.
  2. Сам по себе индикатор может давать ошибочные сигналы, что не позволяет полностью избежать убытков.
  3. Эта стратегия лучше подходит для трендовых сортов, но может оказаться менее эффективной для сортов с колебаниями диапазона
  4. Неправильная установка пропорций для управления рисками может повлиять на стратегическую прибыль

Дополнительные оптимизации и улучшения могут быть достигнуты путем корректировки среднелинейного цикла, комбинирования большего количества показателей или путем искусственного вмешательства в торговлю.

Подвести итог

Стратегия в сочетании с определением тенденций и фильтрацией индикаторов, разработает методы для торгов на уровне GBP/JPY. При этом используются такие средства, как динамическая остановка, контроль риска и другие средства для контроля риска торгов.

Исходный код стратегии
/*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)