Ну, если вы присмотритесь, у вас действительно есть одна сделка. Условие входа было выполнено 2000-04-24 по цене 12,80. Состояние выхода по-прежнему Открыто , что означает, что ваше условие выхода еще не выполнено, а вы все еще длинны.
Я постараюсь показать вам, что происходит с вашей стратегией, показывая вамкак отлаживать.
Во-первых, давайте превратим вашу стратегию в индикатор. Я всегда начинал с индикатора и конвертировал его в стратегию позже, когда меня это устраивает.
Чтобы показать, есть ли у нас сигнал ПОКУПКИ или ПРОДАЖА, мы будем использовать функцию plotshape()
и некоторыедополнительные переменные.
//@version=4
study("Darshan 52 week low", overlay=true)
var isLong = false // Flag to see if we are currently long
var isShort = false // Flag to see if we are currently short
var highAfterPurchase = 0.0
// Get 52 week low value
weekly_lc = security(syminfo.tickerid,"W", lowest(close,52), lookahead=barmerge.lookahead_on)
buySignal = not isLong and (close < weekly_lc) // Buy only if not already long
highAfterPurchase := iff(buySignal, close, nz(highAfterPurchase[1])) // If we are already long, update highAfterPurchase with the current close
// else, keep the old value
// is close price 15% lesser than high then exit
closeHighDelta = highAfterPurchase - (highAfterPurchase * 0.15)
sellSignal = not isShort and (close < closeHighDelta) // Sell only if not alread short
if (buySignal) // Reset signals
isLong := true
isShort := false
if (sellSignal) // Reset signals
isLong := false
isShort := true
plotshape(series=buySignal, text="BUY", style=shape.triangleup, color=color.green, location=location.belowbar, size=size.small)
plotshape(series=sellSignal, text="SELL", style=shape.triangledown, color=color.red, location=location.abovebar, size=size.small)
Теперь, чтобы отладить это, мы создадим еще один индикатор с единственным отличием, overlay=false
и различными plot
с. Здесь мы хотим построить сигналы, которые нас интересуют. Сигналы, которые мы хотим видеть их значения.
//@version=4
study("Darshan 52 week low Debug", overlay=false)
var isLong = false // Flag to see if we are currently long
var isShort = false // Flag to see if we are currently short
var highAfterPurchase = 0.0
// Get 52 week low value
weekly_lc = security(syminfo.tickerid,"W", lowest(close,52), lookahead=barmerge.lookahead_on)
buySignal = not isLong and (close < weekly_lc) // Buy only if not already long
highAfterPurchase := iff(buySignal, close, nz(highAfterPurchase[1])) // If we are already long, update highAfterPurchase with the current close
// else, keep the old value
// is close price 15% lesser than high then exit
closeHighDelta = highAfterPurchase - (highAfterPurchase * 0.15)
sellSignal = not isShort and (close < closeHighDelta) // Sell only if not alread short
if (buySignal) // Reset signals
isLong := true
isShort := false
if (sellSignal) // Reset signals
isLong := false
isShort := true
plot(series=close, title="close", color=color.green, linewidth=2)
plot(series=weekly_lc, title="weekly_lc", color=color.blue, linewidth=2)
plot(series=highAfterPurchase, title="highAfterPurchase", color=color.orange, linewidth=2)
plot(series=closeHighDelta, title="closeHighDelta", color=color.red, linewidth=2)
Теперь ваше Условие покупки есть, когда зеленая линия (закрывается)идет ниже синей линии (weekly_lc), а ваше условие продажи - это когда зеленая линия (закрытие) опускается ниже красной линии (closeHighDelta).
Если вы посмотрите на графики (вы можете сделать некоторые из них невидимыми в настройках, если не можете четко видеть), ваше условие покупки наступает только один раз, а ваше условие продажи никогда не становится TRUE
. Итак, вы всегда ДОЛГО .
Вот модифицированная стратегия:
//@version=4
strategy("Darshan 52 week low", overlay=true)
// Time inputs that the strategy is going to apply on
FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth = input(defval = 08, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 2019, title = "To Year", minval = 2017)
// Time frame calculations
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
var isLong = false // Flag to see if we are currently long
var isShort = false // Flag to see if we are currently short
var highAfterPurchase = 0.0
// Get 52 week low value
weekly_lc = security(syminfo.tickerid,"W", lowest(close,52), lookahead=barmerge.lookahead_on)
buySignal = not isLong and (close < weekly_lc) // Buy only if not already long
highAfterPurchase := iff(buySignal, close, nz(highAfterPurchase[1])) // If we are already long, update highAfterPurchase with the current close
// else, keep the old value
// is close price 15% lesser than high then exit
closeHighDelta = highAfterPurchase - (highAfterPurchase * 0.15)
sellSignal = not isShort and (close < closeHighDelta) // Sell only if not alread short
if (buySignal) // Reset signals
isLong := true
isShort := false
if (sellSignal) // Reset signals
isLong := false
isShort := true
strategy.entry(id="darshan-long", long=strategy.long, when=buySignal and window())
strategy.close(id="darshan-long", when=sellSignal and window())
В качестве примечания, вы должны использовать :=
оператор, если вы хотите переназначить значения переменным.
![enter image description here](https://i.stack.imgur.com/JDgjc.png)
![enter image description here](https://i.stack.imgur.com/06kme.png)