#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()
. Теперь все работает так, как и ожидалось.