Diese Strategie kombiniert die Stochastic-Anzeige, um die Überkauf-Überverkauf-Wendepunkte zu beurteilen, und die MACD-Anzeige, um die Trendwende zu erkennen, um eine Umkehrhandelsstrategie zu realisieren, die einen niedrigen Kauf-Hochverkauf ermöglicht. Die Stop-Loss-Verfolgung kann zur Gewinnsicherung eingerichtet werden, um das Risiko effektiv zu kontrollieren.
Der Stochastic-Indikator wird verwendet, um die Überkauf-Überverkauf-Zustände zu bestimmen. Die 9-Tage-Linie ist unter 20 Uhr die Überverkaufszone und über 80 Uhr die Überkaufszone, wodurch ein Umkehrsignal gebildet wird.
Der MACD-Indikator Goldfork zu viel, Deadfork zu wenig. Die MACD-Linie durchbrechen Signallinie Vorhersage der Mittellinie umzukehren, um den Trend umzukehren.
Wenn ein stochastischer Umkehrsignal und ein MACD-Umkehrsignal gleichzeitig erscheinen, werden zusätzliche Leerstellen vorgenommen.
Setzen Sie einen Tracking-Stop. Nach dem Eintritt in den Trend wird ein Tracking-Stop eingeleitet, wenn der Preis einen gewissen Prozentsatz des Gewinns erreicht hat; anschließend folgt eine Stop-Line dem Preissteigerungskanal.
Wenn ein Umkehrsignal erscheint, schließen Sie die ursprüngliche Position und stellen Sie die Stop-Line neu ein.
Die Integration mehrerer Indikatoren verbessert die Signalgenauigkeit
Stochastische Indikatoren sind sehr effektiv, um überkaufte und überverkaufte Bereiche zu erkennen.
Die MACD kann eine Umkehr der Durchschnittslinie vorzeitig erfassen und die Trendwende erfassen
Ein Stop-Loss-Tracker schützt die Gewinne
Die Rückmeldungen sind ausreichend, die Strategie-Signale sind klar.
Optimierbare Parameter, die leicht angepasst werden können
Mehrfache Portfolios sind schwieriger zu optimieren
Rückwärtssignale können zu Fehleinschätzungen führen und müssen mit anderen Kennzahlen überprüft werden.
Mehr Daten zur Optimierung von Tests zur Verfolgung von Verlust
Stochastische und MACD-Indikatoren haben Probleme mit der Lagerung
Häufige Transaktionen können zu höheren Transaktionskosten führen
Es ist ein Versuch, mehr Kennzahlen hinzuzufügen, um ein stabileres Handelssystem zu schaffen.
Verschiedene Periodenparameter testen, um die beste Kombination zu finden
Entwickeln Sie anpassungsfähige Parameter-Einstellungen und aktualisieren Sie die optimalen Parameter in Echtzeit
Setzen Sie den Rücknahme-Stopp, um die maximale Rücknahme zu steuern
Um den Fehler zu vermeiden, der durch die Abweichung von den Quantifizierungswerten verursacht wird, werden die Quantifizierungswerte hinzugefügt.
Berücksichtigung der Auswirkungen auf die Transaktionskosten und Setzung eines minimalen Stop-Ups
Die Strategie kombiniert die Vorteile der stochastic- und MACD-Indikatoren und hat eine starke Erkenntnis für die Auswahl des Umkehrhandelszeitpunkts. Die Verfolgung von Stop-Loss-Mechanismen kann auch die Gewinne effektiv sperren. Der Umkehrhandel selbst birgt jedoch immer noch ein gewisses Risiko, das mit mehr Indikatoren überprüft und die Parameter weiter getestet und optimiert werden muss.
/*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)