Фундаментальная стратегия торговли с Пинбар

Автор:Чао Чжан, Дата: 2023-11-15 15:25:57
Тэги:

img

Обзор

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

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

  1. Вычислить скользящие средние скорости (20-периодные) и медленные (50-периодные).

  2. Определите бычьи (закрытие>открытие) и медвежие (закрытие<открытие) козырьки на основе светильника.

  3. Проверьте, превышает ли пинбар высокий/низкий уровень предыдущей свечи. Бычий пинбар, превышающий предыдущий высокий уровень, дает длинный сигнал. Белый пинбар, превышающий предыдущий низкий, дает короткий сигнал.

  4. Также проверьте, является ли быстрый MA выше медленного MA для определения восходящего тренда и наоборот для нисходящего.

  5. Длинные сигналы действительны только тогда, когда быстрый/медленный MA указывает на восходящий тренд. Короткие сигналы действительны только тогда, когда быстрый/медленный MA указывает на нисходящий тренд.

  6. На действительных длинных сигналах, займите длинный с заранее определенной стоплосс и takeprofit. На действительных коротких сигналах, займите короткий с заранее определенной стоплосс и takeprofit.

  7. Если быстрый MA переходит ниже медленного MA, закрыть любые существующие позиции.

Преимущества

  • Использует высокий/низкий пинбар как уровень прорыва, представляющий сильный импульс.

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

  • Захватывает тенденции и прорывы, хорошо работает на трендовых рынках.

  • Параметры могут быть оптимизированы для различных продуктов и временных рамок.

Риски и их смягчение

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

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

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

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

Возможности для расширения

  • В целом, параметры MA, breakout, stoploss и takeprofit могут быть оптимизированы для различных продуктов и временных рамок для разработки индивидуальной стратегии.

  • Различные МА, такие как EMA, SMA и т. д., могут быть проверены, чтобы найти оптимальный показатель.

  • Дополнительные индикаторы, такие как Momentum, могут улучшить точность тренда.

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

  • Уровень успеха в прорыве можно улучшить с помощью статистического обучения.

Резюме

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


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

//@version=4
//Backtested Time Frame: H1
//Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting.
//Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK.
//Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties.
strategy("Pin Bar Strategy v1", overlay=true)

// User Input
usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false)
atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=1.9,confirm=false)
trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false)
sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false)
sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false)
atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false)
use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false)
slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false)
slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false)
emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,confirm=false)
ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false)

// Create Indicators
fastSMA = sma(close, sma_fast)
slowSMA = sma(close, sma_slow)
bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low)))
bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low)))
atr = atr(atr_valu)

// Specify Trend Conditions
smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4])
smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4])
candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10])
candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10])

// Specify Piercing Conditions
bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA))
bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA))

// MA Slope Function
angle(_source) =>
    rad2degree=180/3.14159265359
    ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu)) 

// Calculate MA Slope
fastSlope=angle(fastSMA)
slowSlope=angle(slowSMA)
slopingUp = fastSlope > slp_long
slopingDn = fastSlope < slp_shrt
    
// Specify Entry Conditions
longEntry = smaUpTrend and bullishPinBar and bullPierce
shortEntry = smaDnTrend and bearishPinBar and bearPierce
longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp
shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn

// Specify Secondary Exit Conditions
longExit = crossunder(fastSMA, slowSMA)
shortExit = crossover(fastSMA, slowSMA)

// Long Entry Function
enterlong() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = low[1] - atr[1] * atr_mult
    entryPrice = high[1]
    units = risk / (entryPrice - stopLoss)
    takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss)
    strategy.entry("long", strategy.long, units, stop=entryPrice)
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
// Short Entry Function
entershort() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = high[1] + atr[1] * atr_mult
    entryPrice = low[1]
    units = risk / (stopLoss - entryPrice)
    takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice)
    strategy.entry("short", strategy.short, units, stop=entryPrice)
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
// Execute Long Entry w/o Slope
if (longEntry and use_slpe == false)
    enterlong()
    
// Execute Long Entry w/ Slope
if (longEntryWithSlope and use_slpe == true)
    enterlong()

// Exit Long Due to Re-Cross
if(longExit and strategy.position_size > 0 and emg_exit)    
    strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size))

// Cancel the Long Entry
strategy.cancel("long", barssince(longEntry) > ent_canc)

// Execute Short Entry w/o Slope
if (shortEntry and use_slpe == false)
    entershort() 
    
// Execute Short Entry w/ Slope
if (shortEntryWithSlope and use_slpe == true)
    entershort() 

// Exit Short Due to Re-Cross
if(shortExit and strategy.position_size < 0 and emg_exit)    
    strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size))

// Cancel the Short Entry
strategy.cancel("short", barssince(shortEntry) > ent_canc)

// Plot Moving Averages to Chart
plot(fastSMA, color=color.red)
plot(slowSMA, color=color.blue)

// Plot Pin Bars to Chart
plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='')
plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')

Больше