У меня проблемы с синхронизацией двух ботов с одинаковыми входами. Они отлично работают с «позиция.средняя цена», но не синхронизируются с «закрыть».

#pine-script

Вопрос:

Здесь у меня есть пример обычного бота с позициями ВЫХОДА, основанными на ЗАКРЫТИИ, я попросил кого-то закодировать схему управления капиталом. 2 бота уважают результаты друг друга, когда я пишу strategy.position_avg_price в качестве входных данных. По какой-то причине, когда боты приблизились к входным данным, я не могу добиться от них одинаковых результатов. У меня есть 2 кода здесь о том, как я пытаюсь их сопоставить. Не могли бы вы, ребята, сказать мне, чего мне здесь не хватает? У них почти одинаковые результаты, но некоторые входы/выходы иногда отличаются.

БОТ1:

 strategy("ETHLONG1h", overlay=false, initial_capital = 100, currency = "USD", pyramiding = 1, calc_on_every_tick=true,  default_qty_type = strategy.fixed, default_qty_value = 0.02, commission_value = 0.08) //==========================================================================  // ALERT TEXT //SSP //========================================================================== alert_tip = "Place this code in the message box while creating/setting alerts" i_alert_box_code = input("{{strategy.order.comment}}", "Alert Box code", group="alerts", tooltip=alert_tip)  ========================================================================= // Initial inputs // Act_RSI_VWAP = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE") RSI_VWAP_length = input(1, "RSI-VWAP LENGTH") RSI_VWAP_overSold = input(1, "RSI-VWAP OVERSOLD", type=input.float) RSI_VWAP_overBought = input(1, "RSI-VWAP OVERBOUGHT", type=input.float)  // RSI with VWAP as source // RSI_VWAP = rsi(vwap(close), RSI_VWAP_length)  // Plotting, overlay=false // r = plot(RSI_VWAP, color = RSI_VWAP gt; RSI_VWAP_overBought ? color.red : RSI_VWAP lt; RSI_VWAP_overSold ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)  h1 = plot(RSI_VWAP_overBought, color = color.gray, style=plot.style_stepline) h2 = plot(RSI_VWAP_overSold, color = color.gray, style=plot.style_stepline)  fill(r,h1, color = RSI_VWAP gt; RSI_VWAP_overBought ? color.red : na, transp = 60) fill(r,h2, color = RSI_VWAP lt; RSI_VWAP_overSold ? color.lime : na, transp = 60)   // ENTRY SIGNALS //  strategy.entry("long", strategy.long, when = (crossover(RSI_VWAP, RSI_VWAP_overSold)), comment="00b033c2_ENTER-LONG_BYBIT_ETH/USDT_00b033c2-ETH1HLONG_1H") strategy.exit("long SL/TP/TSL", "long", loss = close * 0.018 / syminfo.mintick, trail_points = close *0.008 / syminfo.mintick, trail_offset = close * 0.0001 / syminfo.mintick, comment="00b033c2_EXIT-LONG_BYBIT_ETH/USDT_00b033c2-ETH1HLONG_1H")  

БОТ2:

 strategy("1hlongETH TRACING", overlay=true, initial_capital = 100, currency = "USD", pyramiding = 1, calc_on_every_tick=true,  default_qty_type = strategy.fixed, default_qty_value = 0.02, commission_value = 0.08)   // ALERT TEXT and Time stamps// bt_start = input(timestamp("01 jan 2015 00:00  0000"), "Start Date", input.time, group="backtesting period") bt_end = input(timestamp("31 dec 9999 00:00  0000"), "End Date", input.time, group="backtesting period")  bt_window = time gt;= bt_start and time lt;= bt_end // backtesting window  alert_tip = "Place this code in the message box while creating/setting alerts" i_alert_box_code = input("{{strategy.order.comment}}", "Alert Box code", group="alerts", tooltip=alert_tip)  //Trailing,Stoploss,Takeprofit inputs//  i_profit_perc = input(0, "Take Profit (in %)", group="risk reward", inline="profit") / 100 i_profit_clr = input(color.green, "", group="risk reward", inline="profit") i_loss_perc = input(1.8, "StopLoss (in %)", group="risk reward", inline="loss") / 100 i_loss_clr = input(color.red, "", group="risk reward", inline="loss") i_trail_act = input(0.8, "Activate Trail At (in %)", group="risk reward", inline="trailat") / 100 i_trailat_clr = input(color.yellow, "", group="risk reward", inline="trailat") i_trail_off = input(0.01, "Trail Offset (in %)", group="risk reward", inline="trailof") / 100 i_trailof_clr = input(color.fuchsia, "", group="risk reward", inline="trailof")  // ADDITIONAL FUNCTIONS // var float buy_en = na var float buy_sl = na var float buy_tp = na var float buy_tl = na var float trail_act_price = na var bool trail_activated = false buy_pos = strategy.position_size gt; 0 // ====================================================================== // Initial inputs // Act_RSI_VWAP = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE") RSI_VWAP_length = input(1, "RSI-VWAP LENGTH") RSI_VWAP_overSold = input(1, "RSI-VWAP OVERSOLD", type=input.float) RSI_VWAP_overBought = input(1, "RSI-VWAP OVERBOUGHT", type=input.float)  // RSI with VWAP as source // RSI_VWAP = rsi(vwap(close), RSI_VWAP_length)  // Plotting, overlay=false // r = plot(RSI_VWAP, color = RSI_VWAP gt; RSI_VWAP_overBought ? color.red : RSI_VWAP lt; RSI_VWAP_overSold ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)  // h1 = plot(RSI_VWAP_overBought, color = color.gray, style=plot.style_stepline) // h2 = plot(RSI_VWAP_overSold, color = color.gray, style=plot.style_stepline)  // fill(r,h1, color = RSI_VWAP gt; RSI_VWAP_overBought ? color.red : na, transp = 60) // fill(r,h2, color = RSI_VWAP lt; RSI_VWAP_overSold ? color.lime : na, transp = 60)   // ENTRY SIGNALS SL/TP/TSL // if bt_window  strategy.entry("long", strategy.long, when = (crossover(RSI_VWAP, RSI_VWAP_overSold)), comment="00b033c2_ENTER-LONG_BYBIT_ETH/USDT_00b033c2-LONG5MIN_5M")  if buy_pos  buy_en := close  buy_sl := buy_en * (1 - i_loss_perc)  buy_tp := i_profit_perc gt; 0.0 ? buy_en * (1   i_profit_perc) : na  trail_act_price := buy_en * (1   i_trail_act)  trail_off = (buy_en * i_trail_off) / syminfo.mintick  // if (high - (trail_off * syminfo.mintick)) gt; buy_tl  // buy_tl := high - (trail_off * syminfo.mintick)  strategy.exit("long SL/TP/TSL", "long", stop=buy_sl, limit=buy_tp, trail_price=trail_act_price, trail_offset=trail_off, comment="00b033c2_EXIT-LONG_BYBIT_ETH/USDT_00b033c2-LONG5MIN_5M")   if high gt;= trail_act_price and not trail_activated  buy_tl := (high - (trail_off * syminfo.mintick))  trail_activated := true  if (high - (trail_off * syminfo.mintick)) gt; buy_tl[1] and trail_activated  buy_tl := (high - (trail_off * syminfo.mintick))   if strategy.position_size == 0  buy_tl := na  trail_activated := false //========================================================================== // PLOT //========================================================================== ben = plot(buy_pos ? buy_en : na, "Buy entry", color.white, 1, plot.style_linebr) bsl = plot(buy_pos ? buy_sl : na, "Buy Sl", i_loss_clr, 1, plot.style_linebr) btp = plot(buy_pos ? buy_tp : na, "Buy TP", i_profit_clr, 1, plot.style_linebr) btl = plot(buy_pos ? buy_tl : na, "Buy Trail", i_trailof_clr, 1, plot.style_linebr) plot(buy_pos ? trail_act_price : na, "Trail Activate Price", i_trailat_clr, 1, plot.style_linebr) fill(ben, bsl, color.red, 90) fill(ben, btp, color.green, 90)  

Я действительно должен подчеркнуть здесь, что БОТЫ будут правильно синхронизированы вместе, если использовать strategy.position_avg_price вместо закрытия, например:

 //BOT1// strategy.exit("long SL/TP/TSL", "long", loss = strategy.position_avg_price * 0.018 / syminfo.mintick, trail_points = strategy.position_avg_price *0.008 / syminfo.mintick, trail_offset = strategy.position_avg_price * 0.0001 / syminfo.mintick, comment="00b033c2_EXIT-LONG_BYBIT_ETH/USDT_00b033c2-ETH1HLONG_1H")   //BOT2// if buy_pos  buy_en := strategy.position_avg_price  buy_sl := buy_en * (1 - i_loss_perc)  buy_tp := i_profit_perc gt; 0.0 ? buy_en * (1   i_profit_perc) : na  trail_act_price := buy_en * (1   i_trail_act)  trail_off = (buy_en * i_trail_off) / syminfo.mintick  // if (high - (trail_off * syminfo.mintick)) gt; buy_tl  // buy_tl := high - (trail_off * syminfo.mintick)  strategy.exit("long SL/TP/TSL", "long", stop=buy_sl, limit=buy_tp, trail_price=trail_act_price, trail_offset=trail_off, comment="00b033c2_EXIT-LONG_BYBIT_ETH/USDT_00b033c2-LONG5MIN_5M")   if high gt;= trail_act_price and not trail_activated  buy_tl := (high - (trail_off * syminfo.mintick))  trail_activated := true  if (high - (trail_off * syminfo.mintick)) gt; buy_tl[1] and trail_activated  buy_tl := (high - (trail_off * syminfo.mintick))  

Причина, по которой я хочу, чтобы это было ЗАКРЫТО, заключается в том, что боты показывают отличные результаты с несколькими живыми тестами, и я не хочу менять то, что хорошо работает.

Ответ №1:

БОТЫ будут правильно синхронизированы вместе, если использовать strategy.position_avg_price вместо close

Каждый экземпляр стратегии имеет свое собственное состояние (положение на рынке и прочее), которое не синхронизировано с другим экземпляром стратегии. Нет никакого способа синхронизировать его. Решение может заключаться в объединении кода двух стратегий (ботов) в единую стратегию.

Комментарии:

1. Я не совсем понимаю вашу причину awnser , как я уже упоминал, 2 кода будут правильно синхронизированы при использовании strategy.position_avg_price в качестве выхода ( уже протестирован ) Не могли бы вы разработать на awnser и объяснить, почему это так ? Большое вам спасибо за вашу помощь Андрей

2. Кроме того, 2 стратегии абсолютно одинаковы. Записи всегда синхронизированы, они основаны на простом пересечении rsi с vwap. Второй сценарий добавляет различные визуальные сюжеты, но на этом все… Только выход отличается по той причине, о которой я упоминал.

3. Может быть, я тебя неправильно понял. Не могли бы вы объяснить более подробно, что вы имели в виду, когда сказали «Я хочу, чтобы это было БЛИЗКО»?

4. Да, конечно, еще раз спасибо за вашу помощь, Андрей. Таким образом, есть два варианта, которые я могу написать для выходов. Я могу написать : Закрыть ИЛИ стратегия.position_avg_price. Например, для стоп-лосса это будет выглядеть так : убыток = закрытие * (число) ИЛИ убыток = стратегия.position_avg_price * (число).. Когда у этих 2 кодов pinescripts есть опция strategy.position.avg_price, выходы полностью синхронизированы. С опцией «закрыть» выходы теперь в некоторых местах отличаются. 2 входа в стратегии одинаковы, просто второй получил график трейлинга и стоп-лосса на графике.

5. Поэтому я пытаюсь понять разницу между ними , похоже, что опция «закрыть» обновляется вместе со свечами. Но почему два кода скрипта pine с одинаковыми входами не получают одинаковые выходы с помощью этой опции?. ( входы везде одинаковые ) еще раз спасибо за потраченное время, Андрей !!! я не могу найти много информации об этих вариантах в Интернете