Das ist die magische doppelte EMA-Gleichlinienstrategie von YouTube-Gott.

Schriftsteller:Kleine Träume, Erstellt: 2022-10-09 15:56:22, aktualisiert: 2023-09-15 20:50:38

img

Das ist die magische doppelte EMA-Gleichlinienstrategie von YouTube-Gott.

In dieser Ausgabe werden wir eine "magische doppelte EMA-Einheitlichkeitsstrategie" von YouTube untersuchen, die als "Stock- und Kryptowährungsmarkt-Killer-Scheiße" bezeichnet wird. Ich habe das Video gesehen und habe gelernt, dass diese Strategie eine Pine-Sprache-Strategie für die Trading View ist, die zwei Trading View-Indikatoren verwendet.

Indikatoren für die Strategie

1. EMA-Indikatoren

Für die Einfachheit des Designs verwenden wir nicht das Moving Average Exponential wie im Video aufgeführt. Wir verwenden das integrierte Ta.ema in der Trading View statt (fast das gleiche).

2. VuManChu Swing Free-Indikator

Das ist ein Indikator in Trading View, und wir müssen den Quellcode in Trading View herunterladen.

img

Der Code für VuManChu Swing Free:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")

Strategische Logik

EMA-Indikatoren: Die Strategie verwendet zwei EMA-Gleichlinien, eine schnelle ("kleine Zyklusparameter") und eine langsame ("große Zyklusparameter").

  • Mehrfach-Reihe Die schnelle Linie liegt über der langsamen.

  • Leerstand Die schnelle Linie ist unter der langsamen.

VuManChu Swing Free-Indikator: Der VuManChu Swing Free-Indikator wird verwendet, um ein Signal auszusenden, das in Kombination mit anderen Bedingungen bestimmt, ob ein Auftragsgeschäft durchgeführt wird. Aus der Quelle des VuManChu Swing Free-Indikators ist zu sehen, dass die LongCondition-Variable für ein Kaufsignal und die ShortCondition-Variable für ein Verkaufssignal steht.

Wir werden uns jetzt mit den folgenden strategischen Bedingungen befassen, die für die Auslösung von Handelssignalen notwendig sind:

1. Regeln für mehrere Beiträge: Der Schlusskurs der K-Linie muss oberhalb der EMA-Schnelllinie sein, die beiden EMA-Gleichlinien müssen mehrere Köpfe darstellen (Schnelllinie oberhalb der langsamen Linie), und der VuManChu Swing Free-Indikator muss ein Kaufsignal zeigen (longCondition ist wahr).

2. Die Regeln für die Einreise in den Leerlauf (im Gegensatz zu mehreren): Der Schlusskurs der K-Linie muss unterhalb der EMA-Schnelllinie liegen, die beiden EMA-Mittellinien müssen eine leere Kopfreihe darstellen (Schnelllinie unterhalb der langsamen Linie) und der VuManChu Swing Free-Indikator muss ein Verkaufssignal (short Condition true) zeigen. Drei Bedingungen sind erfüllt. Der Schlusskurs der K-Linie ist eine leere Einstiegsposition.

Die Handelslogik ist nicht sehr einfach. Da es in dem Video keine spezifische Anleitung zum Stop-Loss gibt, können Sie hier frei spielen. Verwenden Sie eine vergleichsweise mittlere Stop-Loss-Methode.

Codeentwicklung

Der Code für den VuManChu Swing Free-Indikator, den wir direkt in unseren Strategiecode einfügen.

img

Dann haben wir ein Stück Code in der Sprache Pine geschrieben, um die Transaktionsfunktionen zu realisieren:

// extend
fastEmaPeriod = input(50, "fastEmaPeriod")         // 快线周期
slowEmaPeriod = input(200, "slowEmaPeriod")        // 慢线周期
loss = input(30, "loss")                           // 止损点数
trailPoints = input(30, "trailPoints")             // 移动止盈触发点数
trailOffset = input(30, "trailOffset")             // 移动止盈偏移量(点数)
amount = input(1, "amount")                        // 下单量

emaFast = ta.ema(close, fastEmaPeriod)             // 计算快线EMA
emaSlow = ta.ema(close, slowEmaPeriod)             // 计算慢线EMA

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast         // 做多入场条件
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast       // 做空入场条件

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

A.可以看到,当buyCondition为真时即:

1, die Variable longCondition ist wahr (VuManChu Swing Free gibt mehr Signal aus). 2. EmaFast > emaSlow (eima mehrere Titel sortiert) 3, close > open (der aktuelle BAR ist die Sonnenlinie) und close > emaFast (der Preis liegt über der EMA-Schnelllinie).

Es gibt drei Bedingungen, die erfüllt werden müssen.

B.当sellCondition为真时,则做空的三个条件成立(这里不再赘述)。

Dann wird der Handel mit der Strategy.entry-Eingangsfunktion und der Strategy.exit-Stopp- und Tracking-Stopp-Funktion eingestellt, wenn ein If-Condition-Determination-Signal ausgelöst wird.

Vollständiger Code

/*backtest
start: 2022-01-01 00:00:00
end: 2022-10-08 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")


// extend
fastEmaPeriod = input(50, "fastEmaPeriod")
slowEmaPeriod = input(200, "slowEmaPeriod")
loss = input(30, "loss")
trailPoints = input(30, "trailPoints")
trailOffset = input(30, "trailOffset")
amount = input(1, "amount")

emaFast = ta.ema(close, fastEmaPeriod)
emaSlow = ta.ema(close, slowEmaPeriod)

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

Wiederholungstests

Der Testzeitraum für die Re-Test-Reihe wird von Januar 2022 bis Oktober 2022 gewählt. Der K-Line-Zyklus beträgt 15 Minuten und wird mit dem Closing-Price-Modell überprüft. Der Markt wählt den ETH_USDT-Permanenten-Vertrag von Binance. Die Parameter setzen sich nach dem in dem Video beschriebenen Fast-Line 50-Zyklus, Slow-Line 200-Zyklus und anderen Parametern.

img

img

Die Ergebnisse der Rechnerproben zeigen, dass diese Parameter die Ergebnisse beeinflussen. Es ist jedoch möglich, dass die Strategie-Signale die Gewinnrate nach dem Handel auslösen.

Wir versuchen es mit einem BTC_USDT-Permanent-Kontrakt:

img

Das Ergebnis bei BTC ist auch explodiert:

img

img

Die Strategie ist unter:https://www.fmz.com/strategy/385745

Es scheint, dass diese Handelsmethode für Trends noch verlässlicher ist, und man kann das Design weiter optimieren. In diesem Artikel haben wir nicht nur die Idee einer doppelten Gleichlinienstrategie gelernt, sondern auch gelernt, wie man die Strategie des obersten Gottes der Ölpipe verarbeitet und lernt. OK, der oben genannte Strategiecode ist nur eine Kleinigkeit.


Verwandt

Mehr

FantasieKann das auch für die Parameter von Y sein?

Hyc1743Drehbuch, warum ist das Signal auf dem Icon angezeigt, aber die Platte ist nicht geöffnet? Ich habe das Gefühl, dass ich das nicht kann. Das ist ein sehr schwieriges Problem. Ich habe das Gefühl, dass ich das nicht kann.

Leichte WolkenIch empfehle, zwei oder drei repräsentative Strategien aus der Ölpipe zu finden, die eine größere Schwierigkeit aufweisen und mehr Funktionen, Parameter und Berechnungsmethoden umschreiben. Ich habe jetzt mit dieser doppelten Gleichlinien-Strategie gelernt, einige nicht sehr komplexe Kombinationsstrategien zu ändern. Ich habe ein Dutzend Kombinationsstrategien geändert, von denen eine oder zwei wirklich 21 Jahre 22 Jahre Daten-Rücklauf-Ergebnisse sind. Ich bin ein großer Freund von Ihnen.

Der HagenZeitwahl 21. April - 10. Oktober: BTC ist schlimmer

YingsjunWenn Sie sich die Dokumentation anschauen und nicht verstehen, was das Stopp bedeutet, können Sie mir erklären, was das bedeutet? Zum Beispiel, wenn der Standardwert 30 ist, bedeutet das, dass BTC 30 Knife gesunken ist?

Leichte WolkenKann PINE eine etwas komplizierte Methode schreiben, wie z.B. eine hierarchische Methode? Wenn man es mit JS kombinieren kann, ist es beispielsweise einfacher, Indikatoren in PINE zu schreiben und den Transaktionsteil in JS zu schreiben.

YingsjunDie Echtplatte wird im Jahr 2022 fehlerhaft sein

fmzeroDie Speicherstrategie deutet darauf hin. REST: sql: keine Zeilen im Ergebnis-Set

fmzeroDie Träume sind hartnäckig.

Kleine TräumeHa-ha, die Trendstrategie selbst ist: "Huh, die Zukunft hat Trends, sonst ist es eine Schockstrategie".

Kleine TräumeDas ist unhöflich.

Hyc1743Ich danke Ihnen.

Kleine TräumeHallo, das liegt daran, dass die BUY-Kennzeichen auf dem Diagramm nur ein Signal für die Indikatoren in den Artikeln sind, hinter denen auch ein Gleichgewicht ist. Ich weiß. //Plot Kauf- und Verkaufsschilder plotshape ((longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0)) Plotshape (Schallschaltfläche, Titel = "Sell Signal", Text ="SELL", Textcolor = color.white, Style=shape.labeldown, Größe = size.normal, Location=location.abovebar, Farbe = color.new, 0)) Ich weiß. Plotshape ((longCondition, title = "Buy Signal", text ="BUY Die Grafik zeigt, dass nur die LongCondition-Bedingungen erfüllt sind. Die folgenden Bedingungen gelten für diesen Teil: Ich weiß. if buyBedingung und Strategie.position_size == 0 Strategy.entry (englisch für "lang", strategy.long, amount) Strategy.exit (("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) Das ist eine Strategie, die von den Benutzern des Netzwerks bereitgestellt wird. Wenn sie verkaufen bedingung und strategie.position_size == 0 Strategie.Eintrag Strategy.exit (("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) ist eine Strategie, die von den Benutzern der Webseite entwickelt wurde. Ich weiß.

Leichte WolkenDas ist nicht verwunderlich.

Kleine Träumeline ist in der FMZ nicht unterstützt, so dass einige Strips nicht geändert werden können. Einige Strategien nutzen das Objekt, um an den Berechnungen teilzunehmen.

Kleine TräumeEs ist wahrscheinlich, dass es zu lange dauert, um die Daten zu analysieren, und dass es zu viele Daten gibt.

Kleine TräumeDer Pine-Sprach-Tutorial enthält Kapitel mit Beschreibungen, die Sie unter: https://www.fmz.com/bbs-topic/9390#%E5%B8%A6%E8%B7%9F%E8%B8%AA%E6%AD%A2%E6%8D%9F%E6%AD%A2%E7%9B%88%E7%9A%84%E8%B6%85%E7%BA%A7%E8%B6%8B%E5%8A%BF%E7%AD%96%E7%95%A5

Leichte WolkenOh, ich setze es auf ein Jahr oder 10 Monate, und ich kann es im Grunde tun, und in einem Jahr wird es diesen Tipp oder eine ganze Reihe von anderen geben.

Kleine TräumeEs gibt keine Begrenzung, aber der Fehler sollte zu groß sein.

Leichte WolkenIch habe den 1. Januar 2021 bis zum 11. Oktober 2022 gewählt und habe einen Fehler angezeigt: RunError: abort(undefined) at Error at StackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096171) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096345) at abort (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :192xx:1478) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.onmessage (https://www.fmz.com/scripts/detours.f7.js:147), :192x:2096171) at stackTra Aber wenn die Zeitspanne nicht verändert wird, wird es normal wiedergegeben...... /upload/asset/5a09837c7498543a0c5c.jpg

Kleine TräumePine sollte ein komplexeres Stoppgerät entwerfen können, das in JS-Code eingebettet ist.

Kleine TräumeSie können ein Screenshot schicken, um die Fehler zu sehen.

Kleine TräumeOh, tut mir leid, die Adresspolitik war falsch und wurde geändert.