TradingView-Warnungen für MT4 MT5 + dynamische Variablen

Schriftsteller:ChaoZhang, Datum: 2022-05-24 16:59
Tags:SMAMT4MT1

Zufälligerweise teile ich eine Open-Source profitable Forex-Strategie. Zufälligerweise, weil dies rein pädagogisches Material sein sollte. Vor ein paar Tagen veröffentlichte TradingView eine sehr leistungsstarke Funktion von dynamischen Werten aus PineScript, die nun in Alerts übergeben werden dürfen. Und dank TradingConnector konnten sie sofort in MT4 oder MT5 Plattform von jedem Broker der Welt ausgeführt werden. Also ja - TradingConnector funktioniert auch mit Indizes und Rohstoffen.

Die Logik dieser EURUSD 6h-Strategie ist sehr einfach - sie basiert auf Stochastic-Crossovers mit Stop-Loss unter dem jüngsten Pivot Point. Die Einstellung von Stop-Loss mit chirurgischer Präzision ist genau dank der Zulassung dynamischer Werte in Warnungen möglich. TradingConnector wurde ebenfalls aktualisiert, um diese dynamischen Werte zu nutzen und ermöglicht nun die Ausführung von Trades mit vorberechnetem Stop-Loss, Take-Profit sowie Stop- und Limit-Orders.

Eine weitere neue Funktion von TradingConnector ist das nur teilweise Schließen von Positionen - vorausgesetzt, der Broker erlaubt es, natürlich. Eine Position muss beim Eintrag trade_id angegeben haben, auf die in weiteren Warnungen mit teilweiser Schließung verwiesen wird. Detaillierte Spezifikationen der Warn-Syntax und Funktionalitäten finden Sie auf der Website von TradingConnector. Wie man dynamische Variablen in Warnmeldungen einbezieht, kann am Ende des Skripts in alertcondition ((() Aufrufen gesehen werden.

Die Strategie berücksichtigt auch die Provisionen.

Der Slippage wird absichtlich bei 0 gelassen. Aufgrund der weniger als 1 Sekunde Lieferzeit von TradingConnector ist der Slippage praktisch nicht vorhanden. Dies kann insbesondere erreicht werden, wenn Sie einen VPS-Server verwenden, der im gleichen Rechenzentrum wie Ihre Broker-Server gehostet wird. Ich verwende ein solches Setup, es ist machbar. Kleine Slippage und Spread sind bereits im Provisionswert enthalten.

Diese Strategie ist nicht nachvollziehbar und verwendet KEIN TRAILING-STOP oder irgendeine andere Funktion, von der bekannt ist, dass sie im TradingView-Backtester fehlerhaft ist. Macht sie diese Strategie bulletproof und 100% Erfolgsgarantie? Verdammt, nein! Denken Sie an die Regel Nr.1 des Backtests - egal wie profitabel und gut aussehend ein Skript ist, es erzählt nur über die Vergangenheit. Es gibt keine Garantie, dass die gleiche Strategie in Zukunft ähnliche Ergebnisse erzielt.

Um dieses Skript in eine Studie zu verwandeln, so dass Alarme erzeugt werden können, tun Sie 2 Dinge:

  1. Kommentar Strategie Linie am Anfang und Unkommentar Studie Linie
  2. Kommentarzeilen 54-59 und Unkommentarzeilen 62-65. Dann fügen Sie das Skript zum Diagramm hinzu und konfigurieren Sie Alarme.

Dieses Skript wurde nur für pädagogische Zwecke erstellt.

Jeder, der dieses Skript oder irgendeinen seiner Teile in irgendeiner Weise verwendet, muß sich der hohen Risiken im Zusammenhang mit dem Handel bewusst sein.

Danke @LucF und @a.tesla2018 für die Hilfe mit den Code-Fixes :)

Zurückprüfung

img


/*backtest
start: 2022-04-23 00:00:00
end: 2022-05-22 23:59:00
period: 15m
basePeriod: 5m
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/
// © Peter_O

//@version=5
strategy(title='TradingView Alerts to MT4 MT5 Strategy example', commission_type=strategy.commission.cash_per_order, commission_value=0.00003, overlay=false, default_qty_value=100000, initial_capital=1000)
//study(title="TradingView Alerts to MT4 MT5 Strategy example")  //uncomment this line and comment previous one to make it a study producing alerts
//
// This script was created for educational purposes only.
// It is showing how to use dynamic variables in TradingView alerts.
// And how to execute them in Forex, indices and commodities markets

TakeProfitDistance = input(400)
TakePartialProfitDistance = input(150)

// **** Entries logic **** {
periodK = input.int(13, title='K', minval=1)
periodD = input.int(3, title='D', minval=1)
smoothK = input.int(4, title='Smooth', minval=1)
k = ta.sma(ta.stoch(close, high, low, periodK), smoothK)
d = ta.sma(k, periodD)
plot(k, title='%K', color=color.new(color.blue, 0))
plot(d, title='%D', color=color.new(color.orange, 0))
h0 = hline(80)
h1 = hline(20)
fill(h0, h1, color=color.new(color.purple, 75))

GoLong = ta.crossover(k, d) and k < 80
GoShort = ta.crossunder(k, d) and k > 20
// } End of entries logic

// **** Pivot-points and stop-loss logic **** {
piv_high = ta.pivothigh(high, 1, 1)
piv_low = ta.pivotlow(low, 1, 1)
var float stoploss_long = low
var float stoploss_short = high

pl = ta.valuewhen(piv_low, piv_low, 0)
ph = ta.valuewhen(piv_high, piv_high, 0)

if GoLong
    stoploss_long := low < pl ? low : pl
    stoploss_long
if GoShort
    stoploss_short := high > ph ? high : ph
    stoploss_short
// } End of Pivot-points and stop-loss logic

strategy.entry('Long', strategy.long, when=GoLong)
strategy.exit('XPartLong', from_entry='Long', qty_percent=50, profit=TakePartialProfitDistance)
strategy.exit('XLong', from_entry='Long', stop=stoploss_long, profit=TakeProfitDistance)
strategy.entry('Short', strategy.short, when=GoShort)
strategy.exit('XPartShort', from_entry='Short', qty_percent=50, profit=TakePartialProfitDistance)
strategy.exit('XShort', from_entry='Short', stop=stoploss_short, profit=TakeProfitDistance)

if GoLong
    alertsyntax_golong = 'long slprice=' + str.tostring(stoploss_long) + ' tp1=' + str.tostring(TakePartialProfitDistance) + ' part1=0.5 tp=' + str.tostring(TakeProfitDistance)
    alert(message=alertsyntax_golong, freq=alert.freq_once_per_bar_close)
if GoShort
    alertsyntax_goshort = 'short slprice=' + str.tostring(stoploss_short) + ' tp1=' + str.tostring(TakePartialProfitDistance) + ' part1=0.5 tp=' + str.tostring(TakeProfitDistance)
    alert(message=alertsyntax_goshort, freq=alert.freq_once_per_bar_close)


if GoLong
    strategy.entry("Enter Long", strategy.long)
else if GoShort
    strategy.entry("Enter Short", strategy.short)

Verwandt

Mehr