MTF Stochastic

MTF Stochastic - free TradingView bot strategy and study.

Free crypto trading bot

To make our community more profitable we decided to start a series in which we will review open-source TradingView strategies. The aim of the review is to select a strategy (or a number of strategies) from TradingView and run a reality check on it, optimise them and convert into alerts, so you can set it up as a bot on Wunderbit Trading platform.

What we provide

  • Open-strategy source

  • Strategy adjustment for particular exchange, pair and timeframe

  • Backtest

  • Revised study script that you can apply in Wunderbit Trading platform for bot trading.

Description

This week we found a nice strategy for a 30 min time frame working for long and short entries for BTC-perpetual futures on FTX. The original idea was taken from: 03.freeman.You will find the original strategy code here: MTF stochastic strategy.

IMPORTANT!

  • This strategy was adjusted to make faster entry on lower time frames.

  • We added separate inputs for short conditions

  • You must set up trailing stops so the strategy can be executed according to backtest

  • We added inputs for the period selection, so you could see how the strategy is performing on a monthly basis.

Settings – Applicable to FTX: BTC-PERP 30 min

Settings

Revised strategy script code

You can copy this code and paste it into your TradingView.

//Updated by: Wunderbit Trading
//Original Idea by: 03.freeman

//@version=4
strategy("MTF stochastic strategy", overlay=false, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD )
//
len_long = input(20, minval=1, title="Long Length for Main Stochastic")
smoothK_long = input(8, minval=1, title="Long SmoothK for Main Stochastic")
smoothD_long = input(8, minval=1, title="Long SmoothD for Main Stochastic")
upLine_long = input(85, minval=50, maxval=90, title=" Long Upper Line Value?")

// current stochastic calculation long
k_long = sma(stoch(close, high, low, len_long), smoothK_long)
d_long = sma(k_long, smoothD_long)

//mtf stochastic calculation smoothed with period long
MTF_period_long= timeframe.period=='5'?'1':timeframe.period=='15'?'5':timeframe.period=='30'?'15':timeframe.period=='60'?'30':timeframe.period=='240'?'60':timeframe.period=='D'?'240':timeframe.period=='W'?'D':'M'
mtfK_long = linreg(security(syminfo.tickerid,MTF_period_long, sma(stoch(close, high, low, len_long), smoothK_long)),len_long,0)
mtfD_long = linreg(security(syminfo.tickerid,MTF_period_long, sma(k_long, smoothD_long)),len_long,0)

len_short = input(61, minval=1, title="Short Length for Main Stochastic")
smoothK_short = input(36, minval=1, title="Short SmoothK for Main Stochastic")
smoothD_short = input(15, minval=1, title="Short SmoothD for Main Stochastic")
lowLine_short = input(15, minval=10, maxval=50, title=" Short Lower Line Value?")

// current stochastic calculation long
k_short = sma(stoch(close, high, low, len_short), smoothK_short)
d_short = sma(k_short, smoothD_short)

//mtf stochastic calculation smoothed with period long
MTF_period_short= timeframe.period=='5'?'1':timeframe.period=='15'?'5':timeframe.period=='30'?'15':timeframe.period=='60'?'30':timeframe.period=='240'?'60':timeframe.period=='D'?'':timeframe.period=='W'?'D':'M'
mtfK_short = linreg(security(syminfo.tickerid,MTF_period_short, sma(stoch(close, high, low, len_short), smoothK_short)),len_short,0)
mtfD_short = linreg(security(syminfo.tickerid,MTF_period_short, sma(k_short, smoothD_short)),len_short,0)



//long_tp_inp = input(0.5, title='Long Take Profit %', step=0.1)/10
long_sl_inp = input(5, title='Long Stop Loss %', step=0.1)/100
long_trailing = input(1.3, title='Trailing Stop Long', step=0.1) / 100

//long_take_level = strategy.position_avg_price * (1 + long_tp_inp)
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)


//short_tp_inp = input(0.5, title='Short Take Profit %', step=0.1)/100
short_sl_inp = input(5, title='Short Stop Loss %', step=0.1)/100
short_trailing = input(1.3, title='Trailing Stop short', step=0.1) / 100

//short_take_level = strategy.position_avg_price * (1 - short_tp_inp)
short_stop_level = strategy.position_avg_price * (1 + short_sl_inp)


/// STRATEGY CONDITIONS ///

entry_long = crossover(mtfK_long, 50) and k_long > 50 and change(k_long, 1) > 0 and k_long > d_long and mtfK_long > mtfD_long
entry_price_long=valuewhen(entry_long,close,0)
exit_long = crossunder(mtfD_long, upLine_long)


entry_short = crossunder(mtfD_short, 50) and k_short < 50 and change(k_short, 1) < 0 and k_short < d_short and mtfK_short < mtfD_short
entry_price_short=valuewhen(entry_short,close,0)
exit_short = crossunder(mtfK_short, lowLine_short)


/// PERIOD ///
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

//// STRATEGY EXECUTION ////

if testPeriod()

    strategy.entry(id="Long", long=true, when=entry_long)
    strategy.exit("Take Profit/ Stop Loss","Long", stop=long_stop_level,trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close(id="Long", when=exit_long, comment = "Exit")

    strategy.entry(id="Short", long=false, when=entry_short)
    strategy.exit("Take Profit/ Stop Loss","Short", stop=short_stop_level, trail_points=entry_price_short * short_trailing / syminfo.mintick, trail_offset=entry_price_short * short_trailing / syminfo.mintick)
    strategy.close(id="Short", when=exit_short, comment = "Exit")

Revised study script code

You can copy this code and paste it into your TradingView.

//Created by: Wunderbit Trading

//@version=4
study("MTF stochastic strategy", overlay=true, max_bars_back=5000)
//
//this strategy is inspired to bobby thread in forexfactory forum
//
len_long = input(20, minval=1, title="Long Length for Main Stochastic")
smoothK_long = input(8, minval=1, title="Long SmoothK for Main Stochastic")
smoothD_long = input(8, minval=1, title="Long SmoothD for Main Stochastic")
upLine_long = input(85, minval=50, maxval=90, title=" Long Upper Line Value?")

// current stochastic calculation long
k_long = sma(stoch(close, high, low, len_long), smoothK_long)
d_long = sma(k_long, smoothD_long)

//mtf stochastic calculation smoothed with period long
MTF_period_long= timeframe.period=='5'?'1':timeframe.period=='15'?'5':timeframe.period=='30'?'15':timeframe.period=='60'?'30':timeframe.period=='240'?'60':timeframe.period=='D'?'240':timeframe.period=='W'?'D':'M'
mtfK_long = linreg(security(syminfo.tickerid,MTF_period_long, sma(stoch(close, high, low, len_long), smoothK_long)),len_long,0)
mtfD_long = linreg(security(syminfo.tickerid,MTF_period_long, sma(k_long, smoothD_long)),len_long,0)

len_short = input(61, minval=1, title="Short Length for Main Stochastic")
smoothK_short = input(36, minval=1, title="Short SmoothK for Main Stochastic")
smoothD_short = input(15, minval=1, title="Short SmoothD for Main Stochastic")
lowLine_short = input(15, minval=10, maxval=50, title=" Short Lower Line Value?")

// current stochastic calculation long
k_short = sma(stoch(close, high, low, len_short), smoothK_short)
d_short = sma(k_short, smoothD_short)

//mtf stochastic calculation smoothed with period long
MTF_period_short= timeframe.period=='5'?'1':timeframe.period=='15'?'5':timeframe.period=='30'?'15':timeframe.period=='60'?'30':timeframe.period=='240'?'60':timeframe.period=='D'?'240':timeframe.period=='W'?'D':'M'
mtfK_short = linreg(security(syminfo.tickerid,MTF_period_short, sma(stoch(close, high, low, len_short), smoothK_short)),len_short,0)
mtfD_short = linreg(security(syminfo.tickerid,MTF_period_short, sma(k_short, smoothD_short)),len_short,0)


/// LONG TAKE TAKE PROFIT / TRAILING STOP ///
long_sl_inp = input(5, title='Long Stop Loss %', step=0.1)/100
long_trailing_act_price = input(1.2,'Long Trailing Activation Price', step=0.1)/100
long_trailing_profit_input=input(1.2, title="Long Trailing Profit %", step=0.1)/100

/// SHORT TAKE TAKE PROFIT / TRAILING STOP ///
short_sl_inp = input(5, title='Short Stop Loss %', step=0.1)/100
short_trailing_act_price_inp = input(1.2,'Short Trailing Activation Price', step=0.1)/100
short_trailing_profit_input=input(1.2, title="Long Trailing Profit %", step=0.1)/100


/// STRATEGY CONDITIONS ///

/// LONG CONDITION ///
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)

isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)

entry_long = not isEntry_Long and (crossover(mtfK_long, 50) and k_long > 50 and change(k_long, 1) > 0 and k_long > d_long and mtfK_long > mtfD_long)
entry_price_long=valuewhen(entry_long,close,0)

long_traling_activation_price = entry_price_long * (1 + long_trailing_act_price)
//plot(long_traling_activation_price, color=color.green)


long_trailing_condition = open > long_traling_activation_price
highest_price = valuewhen(long_trailing_condition, high, 0)


highest_pine(src, len) =>
    max = src[0]
    for i = 1 to len by 1
        if src[i] > max
            max := src[i]
            max
    max

long_o = 0.0
long_o := highest_pine(high, barssince(entry_long))
//plot(long_o, color=color.orange)


long_valuewhen_1 = valuewhen(long_trailing_condition, high, 0)
long_valuewhen_2 = valuewhen(long_trailing_condition, high, 0)
highest_price := long_trailing_condition == false ? na :
  long_valuewhen_1 > long_o ? long_valuewhen_2 : highest_price[1]

long_trailing_profit = long_o * (1 - long_trailing_profit_input)
//plot(long_trailing_profit, color=color.white)
long_trailing = long_trailing_condition ? long_trailing_profit : na

SL_long = entry_price_long * (1 - long_sl_inp)
exit_long = not isExit_Long and (crossunder(mtfD_long, upLine_long) or low < SL_long or low < long_trailing)

if (entry_long)
    isEntry_Long := true
    isExit_Long := false

if (exit_long)
    isEntry_Long := false
    isExit_Long := true

//// SHORT CONDITION

isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)

isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entry_short =  not isEntry_Short and (crossunder(mtfD_short, 50) and k_short < 50 and change(k_short, 1) < 0 and k_short < d_short and mtfK_short < mtfD_short)
entry_price_short=valuewhen(entry_short,close,0)

short_traling_activation_price = entry_price_short * (1 - short_trailing_act_price_inp)
//plot(short_traling_activation_price, color=color.green)


short_trailing_condition = close < short_traling_activation_price
lowest_price = valuewhen(short_trailing_condition, low, 0)


lowest_pine(src, len) =>
    max = src[0]
    for i = 1 to len by 1
        if src[i] < max
            max := src[i]
            max
    max

short_o = 0.0
short_o := lowest_pine(low, barssince(entry_short))
//plot(short_o, color=color.orange)


short_valuewhen_1 = valuewhen(short_trailing_condition, low, 0)
short_valuewhen_2 = valuewhen(short_trailing_condition, low, 0)
lowest_price := short_trailing_condition == false ? na :
  short_valuewhen_1 > short_o ? short_valuewhen_2 : lowest_price[1]

short_trailing_profit = short_o * (1 + short_trailing_profit_input)
//plot(short_trailing_profit, color=color.white)

short_trailing = short_trailing_condition ? short_trailing_profit : na
SL_short = entry_price_short * (1 + short_sl_inp)
exit_short = not isExit_Short and (crossover(mtfK_short, lowLine_short) or high > SL_short or high > short_trailing)

if (entry_short)
    isEntry_Short := true
    isExit_Short := false

if (exit_short)
    isEntry_Short := false
    isExit_Short := true



//// STRATEGY EXECUTION ////
alertcondition(entry_long, title="Enter Long")
alertcondition(exit_long, title="Exit Long")

plotshape(series=entry_long, text="BUY", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(series=exit_long, text="EXIT BUY",style=shape.triangledown, location=location.abovebar, color=color.purple, size=size.small)


// SHORT
alertcondition(entry_short, title="Enter Short")
alertcondition(exit_short, title="Exit Short")

plotshape(series=entry_short, text="SELL", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
plotshape(series=exit_short, text="EXIT SELL",style=shape.triangleup, location=location.belowbar, color=color.purple, size=size.small)

Last updated