0bps

Strategy vault / Breakout

Pre Market Breakout Trading Strategy

This strategy trades breakouts during the pre-market hour, using moving average and momentum indicators to determine short-term trends to trade at peak volatility. It is a typical short scalping strategy. Strategy…

Author
ChaoZhang
Complexity
Intermediate · 111 lines
Parameters
9
Backtest bar
4d · position
Tested on
BTC/USDT · futures

This strategy trades breakouts during the pre-market hour, using moving average and momentum indicators to determine short-term trends to trade at peak volatility. It is a typical short scalping strategy.

Strategy Logic:

  1. Define pre-market range as within 1 hour of open.

  2. Use 50-period EMA to gauge fair price range.

  3. SMI crossover at lows signals long entry.

  4. Closing below EMA is stop loss signal.

  5. Take fixed profit target for short-term scalping.

Advantages:

  1. Breaking short-term EMA shows intraday trend.

  2. SMI confirms bottom reversals.

  3. Limited backtest parameters make live trading simple.

Risks:

  1. Breakouts prone to pre-market traps, beware reversals.

  2. Single daily session Unable to defend against gaps.

  3. Tight stops inclined to premature exit if calibrated poorly.

In summary, this is a typical pre-market short scalping strategy using EMA/SMI to ride high volatility breakouts. But the risk of pre-market traps is high, requiring small position sizing and disciplined stop loss.

Parameters

NameDefaultWhat it controls
v_input_1StartDateStart of trading
v_input_2EndDateEnd of trading
v_input_3100Quantity
v_input_45Percent K Length
v_input_53Percent D Length
v_input_float_140Over Bought
v_input_6-40Over Sold
v_input_750EMA50Len
v_input_810Take Profit %

Source Pine Script

/*backtest
start: 2022-09-12 00:00:00
end: 2023-09-12 00:00:00
period: 4d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_7",65]]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Trading_Bites
//@version=5

// strategy('Morning Scalp', overlay=false, pyramiding=2, initial_capital=3000, default_qty_value=0, commission_value=0.02, max_labels_count=500)

                    // Initial Inputs

StartDate =         timestamp('15Aug 2022 14:00 +0000')
EndDate =           timestamp('15Aug 2022 20:00 +0000')
testPeriodStart =   input(StartDate, 'Start of trading')
testPeriodEnd =     input(EndDate, 'End of trading')
QuantityOnLong =    input(title="Quantity", defval=100,  minval=1)
QuantityOnClose =   QuantityOnLong

//////////////////////////////////////////////////////////////////////
//-- Time In Range
timeinrange(res, sess) =>
    not na(time(res, sess))

                //Market Open//
marketopen = '0930-1600'
MarketOpen = timeinrange(timeframe.period, marketopen)
//////////////////////////////////////////////////////////////////////
                //Market Hour//
morning =   '1000-1210'
Morning =   timeinrange(timeframe.period, morning)


//////////////////////////////////////////////////////////////////////////
               //STOCK MOMENTUM INDEX//
a = input(5, 'Percent K Length')
b = input(3, 'Percent D Length')
ovrsld = input.float(40, 'Over Bought')
ovrbgt = input(-40, 'Over Sold')
//lateleave = input(14, "Number of candles", type=input.integer)

// Range Calculation
ll = ta.lowest(low, a)
hh = ta.highest(high, a)
diff = hh - ll
rdiff = close - (hh + ll) / 2
// Nested Moving Average for smoother curves
avgrel = ta.ema(ta.ema(rdiff, b), b)
avgdiff = ta.ema(ta.ema(diff, b), b)
// SMI calculations
SMI = avgdiff != 0 ? avgrel / (avgdiff / 2) * 100 : 0
SMIsignal = ta.ema(SMI, b)

CrossoverIndex = ta.crossover(SMI, SMIsignal)
CrossunderIndex = ta.crossunder(SMI, SMIsignal)

plot1 = plot(SMI, color=color.new(color.aqua, 0), title='Stochastic Momentum Index', linewidth=1, style=plot.style_line)
plot2 = plot(SMIsignal, color=color.new(color.red, 0), title='SMI Signal Line', linewidth=1, style=plot.style_line)
hline = plot(ovrsld, color=color.new(color.red, 0), title='Over Bought')
lline = plot(ovrbgt, color=color.new(color.green, 0), title='Over Sold')

plot(CrossoverIndex ? close : na, color=color.new(color.aqua, 0), style=plot.style_cross, linewidth=2, title='RSICrossover')

mycol1 = SMIsignal > -ovrbgt ? color.red : na
mycol2 = SMIsignal < -ovrsld ? color.green : na

fill(plot1, hline, color=color.new(mycol1, 80))
fill(plot2, lline, color=color.new(mycol2, 80))

//////////////////////////////////////////////////////////////////////
                // Input EMA9 and EMA21 
EMA50Len      = input( 50 )
EMA50         = ta.ema(close, EMA50Len)
//////////////////////////////////////////////////////////////////////////

                // -------- VWAP  ----------//
vwapLine =      ta.vwap(close)
////////////////////////////////////////////////////////////////////////

                        //PROFIT TARGET//

longProfitPer   = input(10.0, title='Take Profit %') / 100
TargetPrice     = strategy.position_avg_price * (1 + longProfitPer) 
//plot              (strategy.position_size > 0 ? TargetPrice : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Price Target") 
 
                    //BUY STRATEGY CONDITION//

condentry =     ta.crossover(SMI, SMIsignal) and SMI < 0
profittarget =  TargetPrice
stoploss =     close < EMA50

///////////////////////////STRATEGY BUILD//////////////////////////////////////

if MarketOpen
    
    if close > EMA50 

        if (condentry) and Morning
            strategy.entry('Long', strategy.long)
            
        if profittarget and strategy.position_size > 0 
            strategy.exit(id="Long", limit=TargetPrice) 
                
if stoploss
    strategy.close('Long' )

Published by ChaoZhang on the FMZ strategy square · last modified 2023-09-13. 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/Pre-Market-Breakout-Trading-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