0bps

Strategy vault / Breakout

Yesterdays High Breakout Strategy

The Yesterday's High Breakout strategy is a trend following system that goes long when the price breaks above yesterday's high, even if the breakout occurs multiple times in a day. It aims to follow the trending…

Author
ChaoZhang
Complexity
Intermediate · 122 lines
Parameters
10
Backtest bar
1h · intraday
Tested on
BTC/USDT · futures

IMG

Overview

The Yesterday's High Breakout strategy is a trend following system that goes long when the price breaks above yesterday's high, even if the breakout occurs multiple times in a day. It aims to follow the trending market conditions.

Principle

The strategy employs several technical indicators for entry and exit signals:

  • ROC Filter - Strategy is enabled only when today's close has a price change percent above a threshold versus previous day's close. This filters non-trending volatile markets.

  • Trigger Point - Records today's high, low and open prices. Long entry triggered when price breaks above today's high.

  • Entry and Exit Conditions - After entry, stop loss and take profit percentages are set. Trailing stop can be enabled to lock in profit. Conditional exit when price drops below a reference EMA.

  • Configuration - Gap percent to anticipate or delay entry. Customizable stop loss, take profit, trailing stop percentages.

Specifically, it tracks today's high price for entry signal. Long entry when price breaks above today's high. Then stop loss and take profit exits are set, with trailing stop enabled. Alternate exit when price crosses below given EMA. Optimization by setting gap percentage, adjusting stop loss and take profit ratios to control risk, enabling trailing stop to lock in profit.

Advantage Analysis

The advantages of this strategy:

  • Trend following, captures profit from trending moves.

  • Breakout strategy gives clear entry signals.

  • Considers today's high price, avoids consecutive entries.

  • Stop loss and take profit helps risk control.

  • Trailing stop locks in profit.

  • Entry timing can be tuned with parameter optimization to control risk.

  • Simple and intuitive, easy to understand and implement.

  • Applicable for long and short trades.

Risk Analysis

The risks to consider:

  • Breakout strategies susceptible to whipsaws. Price may immediately reverse after entry.

  • Only effective for trending markets, underperforms in ranging conditions.

  • Reasonable stop loss percent needed, too wide may increase loss.

  • Reasonable gap percent needed, too aggressive may increase loss.

  • False breakout can cause unnecessary loss, tuning required.

  • Volume needs to support follow through after breakout.

  • Consistency needed between parameters across timeframes.

Optimization Directions

Possible optimizations:

  • Add other indicators like volume, volatility to avoid whipsaws during ranging markets.

  • Add curve fitting indicators to qualify trend strength, avoid false trends.

  • Dynamic optimization of entry gap based on market volatility.

  • Dynamic optimization of stop loss and take profit following market conditions.

  • Different parameter sets for different symbols and timeframes.

  • Machine learning to TEST parameter impact on strategy performance.

  • Add Options functionality to optimize configurations.

  • Research applicability during ranging market conditions.

  • Expand to cross timeframe and multi-asset strategies.

Conclusion

The strategy offers decent performance during trending markets based on breakout of yesterday's high concept. But risks of whipsaw and parameter optimization difficulties exist. Further optimizations possible by adding judgments, dynamic parameter tuning, expanding to combined strategies etc. Overall it suits short term trend following, but risk control and parameter tuning needed.

Parameters

NameDefaultWhat it controls
v_input_bool_1false(?ROC Filter from CloseD)roc_enable
v_input_float_1trueTreshold
v_input_float_2true(?Entry)Gap%
v_input_float_33Stop-loss
v_input_float_49Take-profit
v_input_float_52(?Trailing Stop Settings)Trailing-stop
v_input_float_6trueOffset Trailing
v_input_bool_2trueTrailing-stop
v_input_bool_3falseClose EMA
v_input_int_110EMA length

Source Pine Script

/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 00:00:00
period: 1h
basePeriod: 15m
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/
// Author: © tumiza 999 
// © TheSocialCryptoClub

//@version=5

strategy("Yesterday's High v.17.07", overlay=true, pyramiding = 1,
         initial_capital=10000, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=10,
         slippage=1, backtest_fill_limits_assumption=1, use_bar_magnifier=true,
         commission_type=strategy.commission.percent, commission_value=0.075
         )

// -----------------------------------------------------------------------------
// ROC Filter
// -----------------------------------------------------------------------------

// f_security function by LucF for PineCoders available here: https://www.tradingview.com/script/cyPWY96u-How-to-avoid-repainting-when-using-security-PineCoders-FAQ/
f_security(_sym, _res, _src, _rep) => request.security(_sym, _res, _src[not _rep and barstate.isrealtime ? 1 : 0])[_rep or barstate.isrealtime ? 0 : 1]
high_daily = f_security(syminfo.tickerid, "D", high, false)

roc_enable = input.bool(false, "", group="ROC Filter from CloseD", inline="roc")
roc_threshold = input.float(1, "Treshold", step=0.5, group="ROC Filter from CloseD", inline="roc")

closed = f_security(syminfo.tickerid,"1D",close, false)
roc_filter= roc_enable ? (close-closed)/closed*100  > roc_threshold  : true


// -----------------------------------------------------------------------------
// Trigger Point 
// -----------------------------------------------------------------------------

open_session = ta.change(time('D'))
price_session = ta.valuewhen(open_session, open, 0)
tf_session = timeframe.multiplier <= 60

bgcolor(open_session and tf_session ?color.new(color.blue,80):na, title = "Session")

first_bar = 0
if open_session
    first_bar := bar_index

var max_today = 0.0
var min_today = 0.0
var high_daily1 = 0.0
var low_daily1 = 0.0
var today_open = 0.0

if first_bar
    high_daily1 := max_today
    low_daily1 := min_today
    today_open := open
    max_today := high
    min_today := low


if high >= max_today
    max_today := high

if low < min_today
    min_today := low


same_day  = today_open == today_open[1]

plot( timeframe.multiplier <= 240 and same_day ? high_daily1 : na, color= color.yellow , style=plot.style_linebr, linewidth=1, title='High line')
plot( timeframe.multiplier <= 240 and same_day ? low_daily1 : na, color= #E8000D , style=plot.style_linebr, linewidth=1, title='Low line')

// -----------------------------------------------------------------------------
// Strategy settings 
// -----------------------------------------------------------------------------

Gap = input.float(1,"Gap%", step=0.5, tooltip="Gap di entrata su entry_price -n anticipa entrata, con +n posticipa entrata", group = "Entry")
Gap2 = (high_daily1 * Gap)/100

sl  = input.float(3, "Stop-loss", step= 0.5,  group = "Entry")
tp  = input.float(9, "Take-profit", step= 0.5, group = "Entry")
stop_loss_price = strategy.position_avg_price * (1-sl/100)
take_price = strategy.position_avg_price * (1+tp/100)

sl_trl = input.float(2, "Trailing-stop", step = 0.5, tooltip = "Attiva trailing stop dopo che ha raggiunto...",group = "Trailing Stop Settings")//group = "Trailing Stop Settings")
Atrl= input.float(1, "Offset Trailing", step=0.5,tooltip = "Distanza dal prezzo", group = "Trailing Stop Settings")
stop_trl_price_cond = sl_trl * high/syminfo.mintick/100
stop_trl_price_offset_cond = Atrl * high/syminfo.mintick/100

stop_tick = sl * high/syminfo.mintick/100
profit_tick = tp * high/syminfo.mintick/100

mess_buy = "buy"
mess_sell = "sell"

// -----------------------------------------------------------------------------
// Entry - Exit - Close
// -----------------------------------------------------------------------------

if close < high_daily1 and roc_filter
    strategy.entry("Entry", strategy.long, stop = high_daily1 + (Gap2), alert_message = mess_buy)

ts_n  = input.bool(true, "Trailing-stop", tooltip = "Attiva o disattiva trailing-stop", group = "Trailing Stop Settings")
close_ema = input.bool(false, "Close EMA", tooltip = "Attiva o disattiva chiusura su EMA", group = "Trailing Stop Settings")
len1 = input.int(10, "EMA length", step=1, group = "Trailing Stop Settings")
ma1 = ta.ema(close, len1)

plot(ma1, title='EMA', color=color.new(color.yellow, 0))

if ts_n == true
    strategy.exit("Trailing-Stop","Entry",loss= stop_tick, stop= stop_loss_price, limit= take_price, trail_points = stop_trl_price_cond, trail_offset = stop_trl_price_offset_cond, comment_loss="Stop-Loss!!",comment_profit ="CASH!!", comment_trailing = "TRL-Stop!!", alert_message = mess_sell)
else
    strategy.exit("TP-SL", "Entry",loss= stop_tick, stop=stop_loss_price, limit= take_price, comment_loss= "Stop-loss!!!", comment_profit = "CASH!!", alert_message = mess_sell)

if close_ema == true and ta.crossunder(close,ma1)
    strategy.close("Entry",comment = "Close" , alert_message = mess_sell)

Published by ChaoZhang on the FMZ strategy square · last modified 2023-11-06. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/Yesterdays-High-Breakout-Strategy.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open