Strategi ini menggabungkan indikator stochastic untuk menilai titik balik overbought dan oversold dan indikator MACD untuk mengenal pasti trend berbalik, untuk mencapai strategi perdagangan berbalik dengan harga rendah dan tinggi. Ia juga menetapkan tracking stop loss untuk mengunci keuntungan, dan dapat mengawal risiko dengan berkesan.
Garis hari 9 di bawah 20 adalah kawasan jual-beli, di atas 80 adalah kawasan beli-beli, membentuk isyarat pembalikan.
Indeks MACD berhadapan dengan putaran tinggi dan putaran rendah. Garis MACD berhadapan dengan putaran rendah dan putaran rendah. Garis MACD berhadapan dengan putaran rendah dan putaran rendah.
Apabila isyarat pembalikan stochastic dan isyarat pembalikan MACD muncul pada masa yang sama, buat lebih banyak blanja.
Tetapkan Tracking Stop. Setelah memasuki trend, Tracking Stop akan dimulakan apabila harga mencapai peratusan keuntungan tertentu; kemudian Stop Line akan mengikuti kenaikan harga.
Apabila isyarat berbalik muncul, tutup kedudukan asal dan tetapkan semula garis henti rugi.
Penggabungan pelbagai pengukuran dapat meningkatkan ketepatan isyarat
Penunjuk stochastic berkesan mengenal pasti kawasan yang terlalu banyak dibeli dan dijual
MACD dapat menangkap perubahan garis purata lebih awal, dan mengesan perubahan trend
Tetapan Tracking Stop Loss boleh melindungi keuntungan dengan baik
Data pengesanan mencukupi, isyarat strategi dihasilkan jelas
Parameter boleh dioptimumkan, mudah untuk menyesuaikan parameter
Lebih sukar untuk mengoptimumkan gabungan pelbagai indikator
Isyarat pembalikan boleh menyebabkan kesilapan dan memerlukan pengesahan indikator
Lebih banyak data diperlukan untuk mengoptimumkan ujian untuk mengesan kehilangan
Stochastic dan MACD mempunyai masalah lag
Perdagangan yang kerap boleh menyebabkan kos yang lebih tinggi
Cuba untuk menambah lebih banyak penunjuk untuk membentuk sistem perdagangan yang lebih kukuh
Uji parameter kitaran yang berbeza untuk mencari kombinasi parameter terbaik
Membangunkan tetapan parameter yang sesuai dan mengemas kini parameter optimum dalam masa nyata
Tetapkan tolak balik untuk mengawal tolak balik maksimum
Menambah Indeks Jumlah Dagangan untuk Mengelakkan Kesilapan yang Berpunca daripada Ketidakseimbangan Harga
Mengambil kira kesan kos urus niaga, menetapkan penangguhan minimum
Strategi ini menggabungkan kelebihan indikator stochastic dan indikator MACD, mempunyai kemampuan pengesanan yang kuat untuk memilih masa perdagangan berbalik. Mekanisme penangguhan kerugian juga dapat mengunci keuntungan dengan berkesan. Tetapi perdagangan berbalik sendiri masih mempunyai risiko tertentu, perlu menggunakan lebih banyak indikator untuk disahkan, dan terus mengoptimumkan parameter untuk ujian.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
////////////////////////////////////////////////////////////
// @CoinDigger
//
// Credits for the base strategy go to HPotter
//
// I've just added a trail stop, basic leverage simulation and stop loss
//
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 28/01/2021
// This is combo strategies for get a cumulative signal.
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50.
// The strategy sells at market, if close price is lower than the previous close price
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// MACD – Moving Average Convergence Divergence. The MACD is calculated
// by subtracting a 26-day moving average of a security's price from a
// 12-day moving average of its price. The result is an indicator that
// oscillates above and below zero. When the MACD is above zero, it means
// the 12-day moving average is higher than the 26-day moving average.
// This is bullish as it shows that current expectations (i.e., the 12-day
// moving average) are more bullish than previous expectations (i.e., the
// 26-day average). This implies a bullish, or upward, shift in the supply/demand
// lines. When the MACD falls below zero, it means that the 12-day moving average
// is less than the 26-day moving average, implying a bearish shift in the
// supply/demand lines.
// A 9-day moving average of the MACD (not of the security's price) is usually
// plotted on top of the MACD indicator. This line is referred to as the "signal"
// line. The signal line anticipates the convergence of the two moving averages
// (i.e., the movement of the MACD toward the zero line).
// Let's consider the rational behind this technique. The MACD is the difference
// between two moving averages of price. When the shorter-term moving average rises
// above the longer-term moving average (i.e., the MACD rises above zero), it means
// that investor expectations are becoming more bullish (i.e., there has been an
// upward shift in the supply/demand lines). By plotting a 9-day moving average of
// the MACD, we can see the changing of expectations (i.e., the shifting of the
// supply/demand lines) as they occur.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
vFast = sma(stoch(close, high, low, Length), KSmoothing)
vSlow = sma(vFast, DLength)
pos = 0.0
pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0)))
pos
MACD(fastLength,slowLength,signalLength) =>
pos = 0.0
fastMA = ema(close, fastLength)
slowMA = ema(close, slowLength)
macd = fastMA - slowMA
signal = sma(macd, signalLength)
pos:= iff(signal < macd , 1,
iff(signal > macd, -1, nz(pos[1], 0)))
pos
strategy(title="Combo Backtest 123 Reversal & MACD Crossover with Trail and Stop", shorttitle="ComboReversal123MACDWithStop", overlay = false, precision=8,default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, currency="USD", commission_type=strategy.commission.percent, commission_value=0.075)
leverage=input(2,"leverage",step=1)
percentOfEquity=input(100,"percentOfEquity",step=1)
sl_trigger = input(10, title='Stop Trail Trigger %', type=input.float)/100
sl_trail = input(5, title='Stop Trail %', type=input.float)/100
sl_inp = input(10, title='Stop Loss %', type=input.float)/100
Length = input(100, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(2, minval=1)
Level = input(1, minval=1)
//-------------------------
fastLength = input(10, minval=1)
slowLength = input(19,minval=1)
signalLength=input(24,minval=1)
xSeria = input(title="Source", type=input.source, defval=close)
reverse = input(false, title="Trade reverse")
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2015, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2999, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
////////////////////////////////////////////////////////////////////////////////
////////////////////// STOP LOSS CALCULATIONS //////////////////////////////
///////////////////////////////////////////////////
cond() => barssince(strategy.position_size[1] == 0 and (strategy.position_size > 0 or strategy.position_size < 0)) > 0
lastStopLong = 0.0
lastStopLong := lastStopLong[1] != strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) and lastStopLong[1] != 0.0 ? lastStopLong[1] : strategy.position_size > 0 ? (cond() and close > strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price + (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))) : 0
lastStopShort = 0.0
lastStopShort := lastStopShort[1] != strategy.position_avg_price + (strategy.position_avg_price * (sl_inp)) and lastStopShort[1] != 9999999999.0 ? lastStopShort[1] : strategy.position_size < 0 ? (cond() and close < strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price - (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))) : 9999999999.0
longStopPrice = 0.0
longStopPrice2 = 0.0
longStopPrice3 = 0.0
shortStopPrice = 0.0
longStopPrice := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice[1])
else
0
longStopPrice2 := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*2))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*2))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice2[1])
else
0
longStopPrice3 := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*4))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*3))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice3[1])
else
0
shortStopPrice := if strategy.position_size < 0
originalStop = strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger))
trail = strategy.position_avg_price - (strategy.position_avg_price * (sl_trail))
stopValue = low < trigger ? trail : 999999
min(stopValue, originalStop, shortStopPrice[1])
else
999999
///////////////////////////////////////////////////
///////////////////////////////////////////////////
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posMACD = MACD(fastLength,slowLength, signalLength)
pos = iff(posReversal123 == 1 and posMACD == 1 , 1,
iff(posReversal123 == -1 and posMACD == -1, -1, 0))
possig = pos
quantity = max(0.000001,min(((strategy.equity*(percentOfEquity/100))*leverage/open),100000000))
if (possig == 1 and time_cond)
strategy.entry("Long", strategy.long, qty=quantity)
if (possig == -1 and time_cond)
strategy.entry("Short", strategy.short, qty=quantity)
if (strategy.position_size > 0 and possig == -1 and time_cond)
strategy.close_all()
if (strategy.position_size < 0 and possig == 1 and time_cond)
strategy.close_all()
if ((strategy.position_size < 0 or strategy.position_size > 0) and possig == 0)
strategy.close_all()
//EXIT TRADE @ TSL
if strategy.position_size > 0
strategy.exit(id="Long", stop=longStopPrice)
if strategy.position_size < 0
strategy.exit(id="Short", stop=shortStopPrice)