Стратегия перекрестного использования относительного индекса тела

Автор:Чао Чжан, Дата: 2023-10-18 11:16:53
Тэги:

img

Обзор

Эта стратегия в основном использует скользящие средние перекрестные сигналы относительного соотношения тела (RB) ежедневных свечей для определения тренда, наряду с остановкой потерь и получением прибыли для автоматизированной торговли.

Логика стратегии

Стратегия основана на индикаторе RBI Vitelot, который рассчитывает скользящую среднюю относительной пропорции тела (RB) ежедневных свечей.

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

Индикатор RBI использует скользящую среднюю величину RB для фильтрации шума и улавливания сути рыночных тенденций.

Чтобы избежать ложных сигналов во время неопределенных бычьих фаз, стратегия также проверяет, является ли цена закрытия выше 13-периодного EMA, прежде чем генерировать настоящий сигнал покупки для длинной позиции.

После открытия позиции, прибыль будет отслеживаться на основе установленных точек, с фиксированным стоп-лосом в пунктах.

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

  • РБИ отфильтровывает значительный шум и фиксирует характеристики рыночных тенденций, избегая ложных сигналов от различных рынков.

  • Использование фильтра скользящей средней эффективно избегает ложных сигналов во время неопределенных фаз роста, уменьшая потери от шортов.

  • Стоп-лосс и прибыль помогают снизить риск потерь на отдельных позициях и зафиксировать прибыль, улучшая общую прибыльность.

  • Стратегия имеет несколько параметров и легко понятна, подходит для автоматизированной торговли.

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

  • Стратегия опирается исключительно на RBI, любые неправильные сигналы от индикатора могут привести к неудаче.

  • Плохая настройка параметров индикатора также может ухудшить качество торговых сигналов.

  • Ни один технический показатель не может полностью избежать потерь в определенных рыночных условиях.

  • Слишком жесткий режим остановки может привести к слишком частым остановкам; слишком широкий режим может привести к большим потерям на отдельных позициях.

  • Недостаточный контроль за снятием средств может привести к риску снятия с учетной записи.

Руководство по оптимизации

  • Различные комбинации параметров могут быть протестированы для оптимизации параметров RBI.

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

  • Машинное обучение может быть использовано для обучения и оптимизации параметров стоп-лосса и прибыли.

  • Стратегии управления рисками могут быть добавлены для контроля общего размера позиций и рисковой экспозиции.

  • Можно изучить различные периоды хранения, такие как хранения на ночь или краткосрочный скальпинг.

Заключение

В целом это относительно простая и простая стратегия следования тренду. Он использует кроссовер RBI для определения направления тренда, с дополнительными фильтрами и стоп-лосс / принимайте прибыль для контроля рисков, эффективно избегая ложных сигналов от различных рынков. Но никакие технические индикаторы не могут полностью избежать рисков. Для долгосрочной стабильной избыточной доходности все еще необходимы непрерывные улучшения, такие как оптимизация параметров, управление рисками. Логика ясна и проста в понимании, подходит для автоматизированной торговли.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("RBI Backtest /w TSSL", shorttitle="RBI Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
// RBI:
//  The EMA of the relative body (RB) of Japanese candles is evaluated.
//  The RB of a candle (my definition) is simply the ratio of the body with respect to its full length
//  and taken positive for bull candles and negative for bear candles:
//      e.g. a bull "marubozo" has RB=1 a bear "marubozo" has RB=-1;
//      a "doji" has RB=0.
//  This simple indicator grasps the essence of the market by filtering out a great deal of noise.
//
//  A flag can be selected to calculate its very basic binary version, where a bull candle counts as a one
//  and a bear candle counts as a minus one.
//
//  Enter (or exit) the market when the signal line crosses the base line.
//  When the market is choppy we have a kind of alternating bear and bull candles so that
//  RBI is FLAT and usually close to zero. 
//  Therefore avoid entering the market when RBI is FLAT and INSIDE the Exclusion level.
//  The exclusion level is to be set by hand: go back in history and check when market was choppy; a good
//  way to set it is to frame the oscillations of RBI whe price was choppy.
//
//  RBI is more effective when an EMA of price is used as filtering. I found EMA(13) to be
//  a decent filter: go long when base crosses signal upwards AND closing price is above EMA(13);
//  same concept for going short.
//
//  As any other indicator, use it with responsibility: THERE CAN'T BE A SINGLE MAGIC INDICATOR winning
//  all trades.
//
//  Above all, have fun.
//
// Vitelot/Yanez/Vts March 31, 2019

par1 = input(5, title="MA1 Period")
par2 = input(5, title="Signal Period")
exclusion = input(0.2, title="Exclusion level")

useBin = input(false, title="Calculate the binary version")

treshold_long = input(0, title="Treshold Long")
treshold_short = input(0, title="Treshold Short")

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=120)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true

ynSimple(t) =>
    s = (close>open)? 1: -1
    ema(sum(s,t),t)

ynRel(t) =>
    s = (close-open)/(high-low)
    ema(sum(s,t),t)

yn = useBin? ynSimple(par1): ynRel(par1) 
sig = ema(yn,par2)


plot(yn, color=aqua, title="RBI", linewidth=3, transp=0)
plot(sig, color=orange, title="Signal", linewidth=2, transp=0)

hline(0, color=white, title="Zero level", editable=false)
hline(exclusion, color=yellow, title="Exclusion level +", editable=true, linestyle=line)
hline( 0-exclusion, color=yellow, title="Exclusion level -", editable=true, linestyle=line)

long = crossover(yn,sig) and yn < treshold_long
short = crossover(sig,yn)  and yn > treshold_short

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)


Больше