In diesem Artikel wird eine Strategie beschrieben, mit der der Stoch-Indikator und die EMA-Gewinnlinie kombiniert werden können, um den Handel zu quantifizieren. Die Strategie erzeugt Handelssignale auf Basis der Werte des Stoch-Indikators und nutzt die EMA-Regelung, es sei denn, die Signalrichtung ist die vorherrschende Richtung.
Die Strategie handelt hauptsächlich über folgende Instrumente und Logiken:
Berechnung eines Stoch-Indikators, bestehend aus K-Werten und D-Werten, wobei K-Werte schnelle Preisänderungen widerspiegeln und D-Werte glatter behandelt werden;
Setzen Sie eine Überkauf-Überverkauf-Zone für den Stoch-Indikator, um ein Handelssignal zu erzeugen, basierend auf der relativen Größe der K-D-Werte;
Berechnung der durchschnittlichen EMA für eine bestimmte Periode, um die vorherrschende Richtung der Preise zu bestimmen;
Der Handel erfolgt nur dann, wenn die Stoch-Signale mit der EMA-Mittellinie übereinstimmen.
Erstellen Sie eine Mehrkopf- oder Leerkopf-Position auf Basis des Signals und setzen Sie einen Stop-Loss-Punkt ein.
Auf diese Weise erfasst der Stoch-Indikator Überkauf-Oververkauf-Zonen und die EMA entfernt unvernünftige Signale, die in Kombination mit einer stabilisierenden Strategie gebildet werden.
Der größte Vorteil dieser Strategie besteht darin, dass die Indikatoren sich ergänzen, Stoch überkauft und die EMA die Richtung der Mainstream-Handlungen beurteilt, in Kombination mit der Verringerung von Fehlhandlungen.
Zweitens sind die K- und D-Werte anpassbar, um die Parameter für verschiedene Sorten zu optimieren.
Schließlich hilft die Stop-Loss-Einstellung auch bei der Geldverwaltung, die Gewinne und Risiken für jeden Handel klar zu erkennen.
Aber es gibt auch potenzielle Probleme mit dieser Strategie:
Zunächst kann es zu Verzögerungen bei den Stoch- und EMA-Indikatoren kommen, die zu einem Verlust der besten Handelszeiten führen.
Zweitens kann ein zu geringer Stop-Loss zu einem zu hohen und unwirksamen Stop-Loss führen.
Schließlich erfordert die Mehrparameter-Optimierung viel Arbeit, um eine Überpassung zu vermeiden.
Vier Inhalte, Zusammenfassung
In diesem Artikel wird eine quantitative Handelsstrategie beschrieben, die Stoch und EMA kombiniert. Sie identifiziert Überkauf-Überverkauf-Rückkehrmöglichkeiten und filtert die ungültigen Signale über die EMA. Die Strategie kann durch Parameteroptimierung zu stabilen Erträgen führen, aber auch darauf achten, dass die oben genannten Probleme verhindert und kontrolliert werden.
/*backtest
start: 2023-08-15 00:00:00
end: 2023-08-26 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/
//@version=5
strategy(title="EMA Stoch Strategy For ProfitView", overlay=true, calc_on_every_tick=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, initial_capital=1000)
// take profit e stop loss
TakeProfitPercent = input.float(defval = 0.0, title="Take Profit (%) [0 = Disabled]",minval = 0, step=.25,group='TP / SL')
StopLossPercent = input.float(defval = 0.0, title="Stop Loss (%) [0 = Disabled]",minval = 0, step=.25,group='TP / SL')
// Stoch
smoothK = input.int(1, title="K Smoothing", minval=1,group='Stochastic')
periodD = input.int(3, title="D Smoothing", minval=1,group='Stochastic')
lenghtRSI= input.int(14, "RSI Length", minval=1)
lenghtStoch = input.int(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = ta.rsi(src, lenghtRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lenghtStoch), smoothK)
d = ta.sma(k, periodD)
plot(k, title="K", color=#2962FF)
plot(d, title="D", color=#FF6D00)
// bgcolor(color=color.from_gradient(k, 0, 100, color.new(#2962FF, 100), color.new(#2962FF, 95)), title="K BG")
// bgcolor(color=color.from_gradient(d, 0, 100, color.new(#FF6D00, 100), color.new(#FF6D00, 95)), title="D BG")
// ema
src1= input(close,title='Source EMA ',group='EMA')
len1= input(200,title='Length EMA ',group='EMA')
ema1= ta.ema(src1,len1)
plot(ema1,title='EMA',color= color.blue ,linewidth=2)
// signals
LongVal= input(20,title='Stoch below/cross this value for Long signals',group='Signal Options')
scegliLong= input.string('Stoch Below Value', options= ['Stoch Below Value' , 'K&D Cross Below Value' , 'Stoch CrossUp the Value'] , title='Long Signal Type')
long1= scegliLong == 'Stoch Below Value' ? k < LongVal and d < LongVal and close > ema1 : na
long2= scegliLong == 'K&D Cross Below Value' ? ta.cross(k,d) and k < LongVal and d < LongVal and close > ema1 : na
long3= scegliLong == 'Stoch CrossUp the Value' ? ta.crossover(k,LongVal) and close > ema1 : na
shortVal= input(80,title='Stoch above/cross this value for Short signals',group='Signal Options')
scegliShort= input.string('Stoch Above Value', options= ['Stoch Above Value' , 'K&D Cross Above Value' , 'Stoch CrossDown the Value'] , title='Short Signal Type' )
short1= scegliShort == 'Stoch Above Value' ? k > shortVal and d > shortVal and close < ema1 : na
short2= scegliShort == 'K&D Cross Above Value' ? ta.cross(k,d) and k > shortVal and d > shortVal and close < ema1 : na
short3= scegliShort == 'Stoch CrossDown the Value' ? ta.crossunder(k,shortVal) and close < ema1 : na
// Strategy Backtest Limiting Algorithm/
i_startTime = input(defval = timestamp("01 Jan 2014 00:00 +0000"), title = "Backtesting Start Time", inline="timestart", group='Backtesting')
i_endTime = input(defval = timestamp("01 Jan 2100 23:59 +0000"), title = "Backtesting End Time", inline="timeend", group='Backtesting')
timeCond = true
pv_ex = input.string("deribit-testnet", title="Exchange", group='PV Settings')
pv_sym = input.string("btc-perpetual", title="Symbol", group='PV Settings')
pv_acc = input.string("", title="Account", group='PV Settings')
pv_alert_long = input.string("", title="PV Alert Name Longs", group='PV Settings')
pv_alert_short = input.string("", title="PV Alert Name Shorts", group='PV Settings')
pv_alert_cancel = input.string("", title="PV Alert Name TP/SL", group='PV Settings')
profit_abs = (close * (TakeProfitPercent / 100))
stop_abs = (close * (StopLossPercent / 100))
ProfitTarget = TakeProfitPercent > 0 ? profit_abs / syminfo.mintick : na
LossTarget = StopLossPercent > 0 ? stop_abs / syminfo.mintick : na
// Make sure we are within the bar range, Set up entries and exit conditions
var entryprice = 0.0
var profitprice = 0.0
var stopprice = 0.0
exsym = pv_ex == "" ? "" : "ex=" + pv_ex + ","
exsym := pv_sym == "" ? exsym : exsym + "sym=" + pv_sym
if ((long1 or long2 or long3) and timeCond and strategy.position_size <= 0)
strategy.entry("Long", strategy.long, when=barstate.isconfirmed)
entryprice := close
profitprice := entryprice+profit_abs
stopprice := entryprice-stop_abs
tpsl_str = TakeProfitPercent > 0 ? ",mytp=" + str.tostring(profitprice) : ""
tpsl_str := StopLossPercent > 0 ? tpsl_str + ",mysl=" + str.tostring(stopprice) : tpsl_str
alert(pv_alert_long + "(" + exsym + ",acc=" + pv_acc + tpsl_str + ")", alert.freq_once_per_bar_close)
if ((short1 or short2 or short3) and timeCond and strategy.position_size >= 0)
strategy.entry("Short", strategy.short, when=barstate.isconfirmed)
entryprice := close
profitprice := entryprice-profit_abs
stopprice := entryprice+stop_abs
tpsl_str = TakeProfitPercent > 0 ? ",mytp=" + str.tostring(profitprice) : ""
tpsl_str := StopLossPercent > 0 ? tpsl_str + ",mysl=" + str.tostring(stopprice) : tpsl_str
alert(pv_alert_short + "(" + exsym + ",acc=" + pv_acc + tpsl_str + ")", alert.freq_once_per_bar_close)
tpsl_hit_long = (strategy.position_size[1] > 0 and ((TakeProfitPercent > 0 and high > profitprice[1]) or (StopLossPercent > 0 and low < stopprice[1])))
tpsl_hit_short = (strategy.position_size[1] < 0 and ((TakeProfitPercent > 0 and low < profitprice[1]) or (StopLossPercent > 0 and high > stopprice[1])))
if (tpsl_hit_long or tpsl_hit_short)
alert(pv_alert_cancel + "(" + exsym + ",acc=" + pv_acc + ")", alert.freq_once_per_bar)
strategy.exit("Exit Long (TP/SL)", from_entry = "Long" , profit = ProfitTarget, loss = LossTarget)
strategy.exit("Exit Short (TP/SL)", from_entry = "Short", profit = ProfitTarget, loss = LossTarget)
plot(entryprice, title="Entry Price", color=strategy.opentrades > 0 ? color.gray : color.new(color.gray, 100))
plot(profitprice, title="Profit Price", color=strategy.opentrades > 0 and TakeProfitPercent > 0 ? color.green : color.new(color.green, 100))
plot(stopprice, title="Stop Price", color=strategy.opentrades > 0 and StopLossPercent > 0? color.red : color.new(color.red, 100))