Стратегия прорыва в процентном отношении к положительным порогам

Автор:Чао Чжан, Дата: 2024-01-08 10:32:25
Тэги:

img

Обзор

Положительная стратегия прорыва процента барсов - это количественная стратегия торговли, основанная на суждениях о ценовом движении. Она рассчитывает процент свечей восходящего тренда в определенный период, чтобы определить, находится ли рынок в настоящее время в состоянии восходящего тренда. Когда процент свечей восходящего тренда выше верхнего предельного значения, определенного пользователем, стратегия считает, что рынок в настоящее время находится в восходящем тренде и идет в длинный. Когда процент ниже нижнего предельного значения, определенного пользователем, стратегия считает, что рынок в настоящее время находится в нисходящем тренде и идет в короткий.

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

Основным показателем этой стратегии является процент свечей восходящего тренда. Свеча восходящего тренда открывается ниже предыдущего минимума и закрывается выше открытого, указывая на то, что цена выросла в течение этого периода. Стратегия подсчитывает количество свечей восходящего тренда в определенный пользователем период обратного обзора и вычисляет процент свечей восходящего тренда среди всех свечей. Когда процент выше верхнего предела, стратегия определяет, что рынок находится в постоянном восходящем тренде и идет в длинный. Когда процент ниже нижнего предела, стратегия определяет, что рынок находится в нисходящем тренде и идет в короткий. Ордера на остановку потери и получение прибыли устанавливаются в соответствии с методом остановки потери, определенным пользователем.

Например, если пользователь устанавливает обратный период на 20, верхний предел на 70, нижний предел на 30, стратегия отслеживает последние 20 свечей. Если 16 из них являются свечами с восходящим трендом, процент будет 16/20=80%. Поскольку 80% выше верхнего предела на 70%, стратегия будет выполнять длинный ордер. Если среди последних 20 свечей только 5 являются свечами с восходящим трендом, то процент будет 5/20=25%. Это ниже нижнего предела на 30%, стратегия будет выполнять короткий ордер.

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

Основными преимуществами этой стратегии являются:

  1. Логика стратегии проста и интуитивно понятна;
  2. Он основан только на одном индикаторе, что снижает риск переустановки;
  3. Пользователи могут настраивать параметры для различных продуктов;
  4. Он имеет встроенные функции стоп-лосса/приобретения прибыли для предотвращения больших потерь;
  5. Разрешить обратную торговлю, не выходя из позиций сначала, более быстрое отслеживание тенденций.

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

Основными рисками этой стратегии являются:

  1. Опираясь только на один индикатор, можно генерировать ложные сигналы;
  2. Параметры склонны к переустановке, производительность в режиме реального времени может сильно отличаться;
  3. Стоп-лосс может быть затронут волатильными колебаниями цен, приводящими к убыткам;
  4. Обратная торговля может увеличить убытки;
  5. Производительность в значительной степени зависит от символа, что требует отдельных испытаний.

Риски могут быть уменьшены:

  1. Добавление фильтров для предотвращения ложных сигналов;
  2. Оптимизация логики остановки потери для ограничения потерь;
  3. Оценка и контроль максимального размера потерь;
  4. Испытания на различных символах отдельно.

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

К основным направлениям оптимизации этой стратегии относятся:

  1. Добавление вспомогательных показателей, таких как громкость, чтобы избежать ложных сигналов;
  2. Оптимизация методов стоп-лосса, таких как отслеживание стоп-лосса;
  3. Добавление фильтров входа, таких как прорыв полос Боллинджера;
  4. Испытание оптимальных параметров свечей восходящего тренда для различных символов;
  5. Оценка максимального использования и контроль размера потерь.

Заключение

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


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


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZenAndTheArtOfTrading 
// © TweakerID

// Based on the calculations by ZenAndTheArtOfTrading, I added stop loss, take profit and reverse line codes.
// The Positive Bars % calculates the number of green (positive) bars, relative to a lookback period, defined 
// by the user. If the percentage is low, it means that there was a bigger number of red candles in the 
// lookback period. The strategy goes long when the percentage is high and short when it's low, although
// this logic can be reversed with positive results on different time frames.

//@version=4
strategy("Positive Bars % Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

lookback = input(title="Lookback", type=input.integer, defval=13)
upperLimit = input(title="Upper Limit", type=input.integer, defval=70)
lowerLimit = input(title="Lower Limit", type=input.integer, defval=30)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.6, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//Calculations
positiveBars = 0
for i = (lookback - 1) to 0
    if close[i] > open[i]
        positiveBars := positiveBars + 1
positiveBarsPercent = (positiveBars / lookback) * 100

BUY=positiveBarsPercent >= upperLimit
SELL=positiveBarsPercent <= lowerLimit

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)

Больше