стратегия.вход() не открывает позицию, когда она должна

#pine-script

Вопрос:

Я очень новичок в Pine Script и экспериментирую со своей первой стратегией. Я думал, что у меня это работает, но потом я заметил один исторический бар, на одном тикере, на одном временном интервале, где вызов strategy.entry(...) не открывает позицию, в то время как правильно работает во всех других случаях, которые я тщательно изучил. Я надеюсь получить некоторую помощь в выяснении того, что происходит, так как у меня нет идей.

Вот код, который отвечает за открытие и закрытие моей позиции:

 //@version=4
strategy('My Strategy', 
     overlay = false, 
     max_labels_count=500, 
     calc_on_every_tick=true, 
     initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,
     commission_type=strategy.commission.percent, commission_value=0.1)

var debugLong = array.new_int(1) // Using an array to enable setting of global variable from function
bgcolor(array.get(debugLong, 0) ? color.yellow : na)

go_long() =>
    if ( strategy.position_size <= 0 )
        array.set(debugLong, 0, 1) // Make background yellow
        strategy.entry("long", strategy.long)

close_long() =>
    array.set(debugLong, 0, 0) // Turn off background highlight
    strategy.close("long")
 

Таким образом, приведенный выше код настроен на то, чтобы начать окрашивать мой фон в желтый цвет, когда мы открываем позицию, а затем остановить покраску, когда мы выходим. Таким образом, я могу посмотреть на панель «Стратегия» и легко сопоставить желтые сегменты с маркерами позиций.

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

Таким образом, в последнем желтом сегменте отсутствует соответствующее открытие позиции… Я знаю, что strategy.entry(...) это было выполнено, b/c сегмент желтого фона есть, но почему нет маркера позиции, как для всех остальных желтых сегментов? Когда я смотрю на список сделок, моей позиции тоже нет в этом списке.

Это ошибка, или я делаю что-то не так?

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

1. Трудно сказать наверняка без всего кода для тестирования, но я бы больше подозревал метод отладки, чем условие, вызывающее изменение цвета, но не запускающее запись. Возможно, попробуйте избавиться от этих функций и не использовать массив в качестве обходного пути. Если вы хотите, чтобы функции возвращали значение true или false, и протестируйте их на основе этого. Кроме того, вам не нужны круглые скобки для оператора if,

Ответ №1:

У меня есть решение.

Похоже, что поведение, которое я наблюдал, — это то, что происходит, когда strategy.entry(...) вызывается более одного раза в одном и том же цикле вычислений.

У меня был оператор if для различных условий входа, каждый из которых вызывал мою go_long() функцию, когда она выполнялась. Проблемный бар, как оказалось, удовлетворял более чем одному из моих условий входа, поэтому go_long() мне позвонили дважды. Каким-то образом, вызов моей функции дважды приводит к отсутствию позиции, хотя у меня там была if ( strategy.position_size <= 0 ) строка… Я бы подумал, что первый вызов откроет позицию, а второй вызов вызовет оператор if, но это явно не то, что происходит на самом деле. Так, может быть, ошибка в языке?

В любом случае, моя проблема решается путем изменения моего оператора if на оператор if-else, чтобы гарантировать, что возможен только один вызов go_long() . Теперь все работает так, как и ожидалось.