вход и закрытие на одном и том же баре вызывают ошибку, не обнаруженную ошибку: Значение равно нулю

#pine-script

Вопрос:

введите описание изображения здесь

видео —> >https://imgur.com/UQi9HDN

Вопрос

Приведенный ниже код выдаст следующую ошибку: Неперехваченная ошибка: Значение равно null.

Это происходит, когда вход и закрытие происходят на одном и том же баре и только в режиме реального времени. Это на графике 1м.

Согласно фотографии, на свечах 1 и 2, как только произошел выход, эти ошибки начали происходить, и график стал пустым. Все, что я видел, — это свечи. Через минуту или на следующем баре все вернулось.

Ожидаемое Поведение

Чтобы иметь возможность покупать и продавать на одном и том же баре без проблем.

Код

 //@version=4
strategy(title="Real-time set up", overlay=true, calc_on_every_tick=true, pyramiding=0, currency="USD", initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// helpers
convertToTicks(num) => num / syminfo.mintick
convertTicksToClose(num) => num * syminfo.mintick
getProfitAndLossTargets(p, l) => 
    pt = p / 100
    lt = l / 100
    testProfitTargetTicks = convertToTicks(close * (1   pt))
    testProfitTarget = convertTicksToClose(testProfitTargetTicks)
    testLossTargetTicks = convertToTicks(close * (1 - lt))
    testLossTarget = convertTicksToClose(testLossTargetTicks)
    [testProfitTarget, testLossTarget]

inDateRange = (time >= timestamp(syminfo.timezone, 2021, 6, 8, 0, 0))
isAnOpenTrade = strategy.opentrades == 0 ? false : true

varip profitTarget = 0.0
varip stopTarget = 0.0
varip int posCloseTime = time

bars_elapsed = 2 * 60000 // 2 bars

if inDateRange and (time - posCloseTime) > bars_elapsed
    if isAnOpenTrade == false
        [profit, stop] = getProfitAndLossTargets(.1, .1) // 1 equals 1%
        profitTarget := profit
        stopTarget := stop
        strategy.entry("xx", strategy.long, comment="Test Entry")
    
    else if isAnOpenTrade and close >= profitTarget
        posCloseTime := time
        strategy.close("xx", strategy.long, comment="Test Profit")
        
    else if isAnOpenTrade and close <= stopTarget
        posCloseTime := time
        strategy.close("xx", strategy.long, comment="Test Stop Loss")
        
        
plot(profitTarget, title="profit", color=color.green)
plot(stopTarget, title="loss", color=color.red)
        
 

Ответ №1:

Это должно дать вам ту прохладу, которую вы хотите. Сохраните время, когда вы выходите, и оцените его как условие следующей записи.

 var int posCloseTime = time

if inDateRange and time - posCloseTime >= 900000
    if isAnOpenTrade == false
        strategy.entry("xx", strategy.long, comment="Test Entry")
    
    else if isAnOpenTrade and close >= close[10]
        posCloseTime := time
        strategy.close("xx", strategy.long, comment="Test Profit")
        
    else if isAnOpenTrade and close <= close[10]
        posCloseTime := time
        strategy.close("xx", strategy.long, comment="Test Stop Loss")
 

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

1. Привет, спасибо за отзыв. Похоже, ваш подход к охлаждению действительно работает. Я обновил исходный пост фотографией, обновил пример кода и описание ошибки, которая не исчезла. Пожалуйста, имейте в виду, что это происходит в режиме реального времени (calc_on_ever_tick=true). Поэтому, как только произойдет покупка, если на том же баре произойдет продажа, вы увидите ошибку в консоли, и график как бы взорвется. Не знаю почему… Есть какие-нибудь идеи?

2. Извините, к сожалению, похоже, что это известная ошибка, и исправление находится в стадии разработки