Dies ist eine quantitative Handelsstrategie mit mehreren Faktoren, die RSI, MACD, OBV, CCI, CMF, MFI, VWMACD und andere technische Indikatoren kombiniert, um automatisierten quantitativen Aktienhandel umzusetzen.
Die Kernlogik dieser Strategie besteht darin, Urteile zu fällen, die auf den Mustern mehrerer technischer Indikatoren basieren.
Die Indikatoren wie RSI, MACD, OBV, CCI, CMF, MFI, VWMACD in der Strategie erkennen, ob sie ein Muster leichter Abwärtstrends zeigen, während die Werte der Indikatoren selbst nicht fallen. Wenn dies geschieht, kann dies einen bevorstehenden Rebound bedeuten. Dieses Muster wird im Code
Darüber hinaus führt die Strategie auch die Logik ein, um abnormales Handelsvolumen zu beurteilen. Wenn der Preis stark schwankt, ohne dass das Handelsvolumen signifikant ansteigt, ist es wahrscheinlich ein falscher Ausbruch. In diesem Fall wird auch ein Kaufsignal gesendet.
Zusammenfassend kann durch die Beobachtung der Umkehrsignale mehrerer technischer Indikatoren und die Kombination der abnormalen Einschätzung des Handelsvolumens die Genauigkeit der Entscheidungsfindung verbessert werden, was der Schlüssel zum Erfolg quantitativer Handelsstrategien ist.
Die Strategie weist folgende Vorteile auf:
Das Multifaktormodell, das Signale von 7 häufig verwendeten technischen Indikatoren kombiniert, verbessert die Genauigkeit von Handelsentscheidungen.
Durch die Einführung eines Handelsvolumen-Umkehrsignals kann vermieden werden, sich von falschen Ausbrüchen täuschen zu lassen und ungültige Signale zu filtern.
Früherkennung des Zeitpunktes des Aktienrückgangs durch Erkennung leichter Abwärtstrends.
Der automatische Handel ohne manuelle Eingriffe senkt die Betriebskosten erheblich.
Die Strategielogik ist einfach und klar, leicht zu verstehen, zu ändern und zu optimieren.
Diese Strategie birgt auch einige Risiken:
Eine unsachgemäße Kombination mehrerer Faktoren kann zu widersprüchlichen Handelssignalen führen. Die Parameter jedes Faktors müssen getestet und abgestimmt werden, um die optimale Konfiguration zu finden.
Der Umkehrhandel selbst birgt gewisse Risiken mit der Möglichkeit, wieder umgekehrt zu werden.
Der Volumenindikator kann für einige Aktien mit geringer Liquidität unterdurchschnittlich sein, in diesem Fall kann das Gewicht von Volumen reduziert oder diese Aktien ausgeschlossen werden.
Die Leistung im Live-Handel kann sich im Vergleich zum historischen Backtesting verschlechtern.
Die Strategie kann in folgenden Bereichen weiter optimiert werden:
Hinzufügen oder Verringern einiger technischer Indikatoren, um die optimale Multifaktormodellkonfiguration zu finden.
Für verschiedene Bestandsarten unterschiedliche Parameter oder Gewichte festlegen, damit die Strategie zielgerichteter sein kann.
Setzen Sie einen dynamischen Stop Loss, bewegen Sie den Stop Profit, um Gewinne zu erzielen und Risiken zu kontrollieren.
Kombination von Branchen, Konzepten und anderen Informationen zur Auswahl von Aktien für den Handel in bestimmten Sektoren.
Einführung von Algorithmen für maschinelles Lernen zur automatischen Optimierung von Strategieparametern.
Insgesamt ist dies eine sehr vielversprechende quantitative Handelsstrategie. Durch die Kombination von Signalen aus mehreren technischen Indikatoren und Volumenumkehrurteilen kann es effektiv Aktienumkehrmöglichkeiten für den automatisierten Handel identifizieren. Mit angemessener Parameter-Tuning und Risikokontrolle hat es das Potenzial, gute Renditen zu erzielen. Die Idee hinter der Strategie ist innovativ und lohnt sich für weitere Forschung und Anwendung.
/*backtest start: 2023-01-18 00:00:00 end: 2024-01-24 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © mkose81 //@version=5 strategy("MK future stopsuz 40 alım (Sadece Long)", overlay=true, max_bars_back=4000,use_bar_magnifier= true,pyramiding=40) // RSI Hesaplama rsi = ta.rsi(close, 14) float botRSI = na botRSI := ta.pivotlow(5, 5) botcRSI = 0 botcRSI := botRSI ? 5 : nz(botcRSI[1]) + 1 newbotRSI = ta.pivotlow(5, 0) emptylRSI = true if not na(newbotRSI) and newbotRSI < low[botcRSI] diffRSI = (newbotRSI - low[botcRSI]) / botcRSI llineRSI = newbotRSI - diffRSI for x = 1 to botcRSI - 1 by 1 if close[x] < llineRSI emptylRSI := false break llineRSI -= diffRSI emptylRSI // Pozitif Uyumsuzluk Alım Sinyali - RSI alRSI = 0 if emptylRSI and not na(newbotRSI) if rsi[botcRSI] < rsi alRSI := 1 // MACD Hesaplama [macd, signal, _] = ta.macd(close, 21, 55, 8) float botMACD = na botMACD := ta.pivotlow(5, 5) botcMACD = 0 botcMACD := botMACD ? 5 : nz(botcMACD[1]) + 1 newbotMACD = ta.pivotlow(5, 0) emptylMACD = true if not na(newbotMACD) and newbotMACD < low[botcMACD] diffMACD = (newbotMACD - low[botcMACD]) / botcMACD llineMACD = newbotMACD - diffMACD for x = 1 to botcMACD - 1 by 1 if close[x] < llineMACD emptylMACD := false break llineMACD -= diffMACD emptylMACD // Pozitif Uyumsuzluk Alım Sinyali - MACD alMACD = 0 if emptylMACD and not na(newbotMACD) if macd[botcMACD] < macd alMACD := 1 // OBV Hesaplama ve Uyumsuzluk Tespiti obv = ta.cum(ta.change(close) > 0 ? volume : ta.change(close) < 0 ? -volume : 0) float botOBV = na botOBV := ta.pivotlow(5, 5) botcOBV = 0 botcOBV := botOBV ? 5 : nz(botcOBV[1]) + 1 newbotOBV = ta.pivotlow(5, 0) emptylOBV = true if not na(newbotOBV) and newbotOBV < obv[botcOBV] diffOBV = (newbotOBV - obv[botcOBV]) / botcOBV llineOBV = newbotOBV - diffOBV for x = 1 to botcOBV - 1 by 1 if obv[x] < llineOBV emptylOBV := false break llineOBV -= diffOBV emptylOBV // Pozitif Uyumsuzluk Alım Sinyali - OBV alOBV = 0 if emptylOBV and not na(newbotOBV) if obv[botcOBV] < obv alOBV := 1 // CCI Hesaplama ve Uyumsuzluk Tespiti cci = ta.cci(close, 20) float botCCI = na botCCI := ta.pivotlow(5, 5) botcCCI = 0 botcCCI := botCCI ? 5 : nz(botcCCI[1]) + 1 newbotCCI = ta.pivotlow(5, 0) emptylCCI = true if not na(newbotCCI) and newbotCCI < cci[botcCCI] diffCCI = (newbotCCI - cci[botcCCI]) / botcCCI llineCCI = newbotCCI - diffCCI for x = 1 to botcCCI - 1 by 1 if cci[x] < llineCCI emptylCCI := false break llineCCI -= diffCCI emptylCCI // Pozitif Uyumsuzluk Alım Sinyali - CCI alCCI = 0 if emptylCCI and not na(newbotCCI) if cci[botcCCI] < cci alCCI := 1 // CMF Hesaplama length = 20 mfm = ((close - low) - (high - close)) / (high - low) mfv = mfm * volume cmf = ta.sma(mfv, length) / ta.sma(volume, length) float botCMF = na botCMF := ta.pivotlow(5, 5) botcCMF = 0 botcCMF := botCMF ? 5 : nz(botcCMF[1]) + 1 newbotCMF = ta.pivotlow(5, 0) emptylCMF = true if not na(newbotCMF) and newbotCMF < cmf[botcCMF] diffCMF = (newbotCMF - cmf[botcCMF]) / botcCMF llineCMF = newbotCMF - diffCMF for x = 1 to botcCMF - 1 by 1 if cmf[x] < llineCMF emptylCMF := false break llineCMF -= diffCMF emptylCMF // Pozitif Uyumsuzluk Alım Sinyali - CMF alCMF = 0 if emptylCMF and not na(newbotCMF) if cmf[botcCMF] < cmf alCMF := 1 // MFI Hesaplama lengthMFI = 14 mfi = ta.mfi(close, lengthMFI) float botMFI = na botMFI := ta.pivotlow(mfi, 5, 5) botcMFI = 0 botcMFI := botMFI ? 5 : nz(botcMFI[1]) + 1 newbotMFI = ta.pivotlow(mfi, 5, 0) emptylMFI = true if not na(newbotMFI) and newbotMFI < mfi[botcMFI] diffMFI = (newbotMFI - mfi[botcMFI]) / botcMFI llineMFI = newbotMFI - diffMFI for x = 1 to botcMFI - 1 by 1 if mfi[x] < llineMFI emptylMFI := false break llineMFI -= diffMFI emptylMFI // Pozitif Uyumsuzluk Alım Sinyali - MFI alMFI = 0 if emptylMFI and not na(newbotMFI) if mfi[botcMFI] < mfi alMFI := 1 // VWMACD Hesaplama fastLength = 12 slowLength = 26 signalSmoothing = 9 vwmacd = ta.ema(close, fastLength) - ta.ema(close, slowLength) signalLine = ta.ema(vwmacd, signalSmoothing) histogram = vwmacd - signalLine // VWMACD Uyumsuzluk Tespiti float botVWMACD = na botVWMACD := ta.pivotlow(histogram, 5, 5) botcVWMACD = 0 botcVWMACD := botVWMACD ? 5 : nz(botcVWMACD[1]) + 1 newbotVWMACD = ta.pivotlow(histogram, 5, 0) emptylVWMACD = true if not na(newbotVWMACD) and newbotVWMACD < histogram[botcVWMACD] diffVWMACD = (newbotVWMACD - histogram[botcVWMACD]) / botcVWMACD llineVWMACD = newbotVWMACD - diffVWMACD for x = 1 to botcVWMACD - 1 by 1 if histogram[x] < llineVWMACD emptylVWMACD := false break llineVWMACD -= diffVWMACD emptylVWMACD // Pozitif Uyumsuzluk Alım Sinyali - VWMACD alVWMACD = 0 if emptylVWMACD and not na(newbotVWMACD) if histogram[botcVWMACD] < histogram alVWMACD := 1 //Dipci indikator lengthd= 130 coef = 0.2 vcoef = 2.5 signalLength = 5 smoothVFI = false ma(x, y) => smoothVFI ? ta.sma(x, y) : x typical = hlc3 inter = math.log(typical) - math.log(typical[1]) vinter = ta.stdev(inter, 30) cutoff = coef * vinter * close vave = ta.sma(volume, lengthd)[1] vmax = vave * vcoef vc = volume < vmax ? volume : vmax //min( volume, vmax ) mf = typical - typical[1] iff_4 = mf < -cutoff ? -vc : 0 vcp = mf > cutoff ? vc : iff_4 vfi = ma(math.sum(vcp, lengthd) / vave, 3) vfima = ta.ema(vfi, signalLength) d = vfi - vfima // Kullanıcı girdileri volatilityThreshold = input.float(1.005, title="Volume Percentage Threshold") pinThreshold = input.float(1.005, title="Deep Percentage Threshold") // Hesaplamalar volatilityPercentage = (high - low) / open pinPercentage = close > open ? (high - close) / open : (close - low) / open // Volatilite koşulu ve VFI ile filtreleme voldip = volatilityPercentage >= volatilityThreshold or pinPercentage >= pinThreshold volCondition = voldip and vfi< 0 // VFI değeri 0'dan küçükse volCondition aktif olacak threeCommasEntryComment = input.string(title="3Commas Entry Comment", defval="") threeCommasExitComment = input.string(title="3Commas Exit Comment", defval="") takeProfitPerc = input.float(1, title="Take Profit Percentage (%)") / 100 fallPerc = input.float(5, title="Percentage for Additional Buy (%)") / 100 // Değişkenlerin tanımlanması var float lastBuyPrice = na var float tpPrice = na var int lastTpBar = na // Alım koşulları longCondition = alRSI or alMACD or alOBV or alCCI or alCMF or alMFI or alVWMACD or volCondition // Son alım fiyatını saklamak için değişken // İlk alım stratejisi if (longCondition and strategy.position_size == 0) strategy.entry("Long", strategy.long, comment=threeCommasEntryComment) lastBuyPrice := open // İkinci ve sonraki alım koşulları (son alım fiyatının belirlenen yüzde altında) if (open < lastBuyPrice * (1 - fallPerc) and strategy.position_size > 0) strategy.entry("Long Add", strategy.long, comment=threeCommasEntryComment) lastBuyPrice := open // Kar alma fiyatını hesaplama ve strateji çıkışı tp_price = strategy.position_avg_price * (1 + takeProfitPerc) if strategy.position_size > 0 strategy.exit("Exit Long", "Long", limit=tp_price, comment=threeCommasExitComment) strategy.exit("Exit Long Add", "Long Add", limit=tp_price, comment=threeCommasExitComment) tpPrice := na // Pozisyon kapandığında TP çizgisini sıfırla // Kar alma seviyesi çizgisi çizme plot(strategy.position_size > 0 ? tp_price : na, color=color.green, title="Take Profit Line")