Случайно, я делюсь с вами открытым исходным кодом прибыльной стратегии Форекс. Случайно, потому что это было предназначено для чисто образовательного материала. Несколько дней назад TradingView выпустил очень мощную функцию динамических значений из PineScript теперь разрешено передавать в предупреждениях. И благодаря TradingConnector, они могут быть мгновенно выполнены в MT4 или MT5 платформе любого брокера в мире. Так что да - TradingConnector работает с индексами и товарами, тоже.
Логика этой стратегии EURUSD 6h очень проста - она основана на стохастических кроссоверах со стоп-лосом, установленным под последней пивотной точкой. Настройка стоп-лоса с хирургической точностью возможна именно благодаря допуску динамических значений в предупреждениях. TradingConnector также был обновлен, чтобы воспользоваться этими динамическими значениями, и теперь позволяет выполнять сделки с предварительно рассчитанными стоп-лосом, получением прибыли, а также стоп- и лимитовыми ордерами.
Еще одна новая особенность TradingConnector, заключается в закрытии позиций только частично - при условии, что брокер разрешает это, конечно. Позиция должна иметь trade_id, указанный при входе, упоминается в дальнейших предупреждениях с частичным закрытием. Подробную спецификацию синтаксиса предупреждений и функциональности можно найти на веб-сайте TradingConnector. Как включить динамические переменные в предупредительные сообщения можно увидеть в самом конце сценария в вызовах alertcondition (().
Стратегия также учитывает комиссионные.
Из-за более короткого времени доставки TradingConnector, скольжение практически отсутствует. Это может быть достигнуто, особенно если вы используете VPS-сервер, размещенный в том же центре данных, что и серверы ваших брокеров. Я использую такую настройку, это осуществимо. Небольшое скольжение и распространение уже включены в стоимость комиссии.
Эта стратегия является НЕ-REPAINTING и использует НЕ TRAILING-STOP или любую другую функцию, которая, как известно, является неисправной в backtester TradingView. Это делает эту стратегию пуленепробиваемой и 100% гарантированным успехом? Черт возьми нет! Помните правило No1 backtesting - независимо от того, насколько прибыльным и красивым сценарий, он рассказывает только о прошлом. Нет никакой гарантии, что та же стратегия получит аналогичные результаты в будущем.
Чтобы превратить этот сценарий в исследование, так что предупреждения могут быть произведены, сделать 2 вещи:
Этот сценарий был создан только для образовательных целей.
Любой, кто использует этот сценарий или любую его часть каким-либо образом, должен знать о высоких рисках, связанных с торговлей.
Спасибо @LucF и @a.tesla2018 за помощь в исправлении кода :)
обратная проверка
/*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)