Почему моя стратегия не показывает никаких данных?

Я пишу простую стратегию на сосновом скрипте для тестирования на истории в TradingView. Логика проста. Если сегодняшнее закрытие меньше 52-недельного минимума, тогда купите акции на 10000 индийских рупий. Мой код выглядит следующим образом:

//@version=4
strategy("Darshan 52 week low", overlay=true)

// Get 52 week low value
weekly_lc = security(syminfo.tickerid,"W", lowest(close,52), lookahead=barmerge.lookahead_on)

// is close/open/high/low is less than 52 week low
if (close < weekly_lc)
    // if yes buy INR 10000 worth of stocks
    quantityToBuy = 10000/close
    strategy.entry("long", strategy.long, quantityToBuy)

Это не дает никаких данных при сравнении с акциями NSE:ITC. Я не уверен, почему, и нет доступного отладчика для просмотра построчного поведения. Я попытался построить график weekly_lc, и он работал нормально.

Обновление 1: я помещаю сюда весь свой скрипт с условием выхода.

    //@version=4
strategy("Darshan 52 week low", overlay=true)

// Get 52 week low value
weekly_lc = security(syminfo.tickerid,"W", lowest(close,52), lookahead=barmerge.lookahead_on)

highAfterPurchase=0

// is close/open/high/low is less than 52 week low
if (close <= weekly_lc)
    // if yes buy INR 10000 worth of stocks
    quantityToBuy = 10000/close
    strategy.entry("darshan-long", strategy.long, quantityToBuy)

    // Set the purchase price as high
    highAfterPurchase = close

if (close > highAfterPurchase)
    highAfterPurchase = close

// is close price 15% lesser than high then exit 
closeHighDelta = highAfterPurchase - highAfterPurchase * 0.15
if (close < closeHighDelta)
    strategy.exit("exit", "darshan-long")

Экран тестера стратегий выглядит следующим образом:

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


person Darshan Puranik    schedule 03.11.2019    source источник
comment
Может ли быть так, что вы не получаете никаких результатов, потому что у вас нет условия выхода? Вы видите нулевые записи на вкладке Список сделок?   -  person Baris Yakut    schedule 03.11.2019
comment
@BarisYakut Список сделок равен нулю. Я поставил условие выхода, также безрезультатно.   -  person Darshan Puranik    schedule 04.11.2019
comment
Не совсем, я подготовил ответ для вас.   -  person Baris Yakut    schedule 04.11.2019


Ответы (1)


Ну, если вы внимательно посмотрите, у вас действительно есть одна сделка. Условие входа было выполнено 24 апреля 2000 г. по цене 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. Итак, вы всегда LONG.

Вот модифицированная стратегия:

//@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())

В качестве примечания: вы должны использовать оператор :=, когда хотите переназначить значения переменным.

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

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

person Baris Yakut    schedule 04.11.2019
comment
Я попробовал вашу модифицированную стратегию, и у меня не было ни одной сделки, которую я получал. Я изменил критерии продажи с 15% до 1%. - person Darshan Puranik; 04.11.2019
comment
Какой таймфрейм вы используете? - person Baris Yakut; 04.11.2019
comment
Я не указал никаких временных рамок. Честно говоря, я не знаю, как указать временные рамки. Я удалил свой код и вставил ваш код. В рамках своего исследования я нашел акции, которые должны немедленно генерировать сигнал к продаже. Название акции — IRB Infrastructure. Но обе наши стратегии не дают сигнала на выход. - person Darshan Puranik; 04.11.2019
comment
Посмотрите на мой первый скриншот. Рядом с символом (ITC) в левом верхнем углу есть M. Это указывает на то, что временной интервал графика — Ежемесячно. Или вы можете посмотреть на верхнюю левую строку графика, где вы видите значения баров открытия, закрытия, минимума и максимума. ITC- 1M - NSE. Что ты там видишь? - person Baris Yakut; 04.11.2019
comment
У меня была W. Я изменил ее на M и получил одну длинную сделку. Я использовал ту же конфигурацию и код вашей стратегии для IRB, который должен немедленно генерировать выход. Я не уверен, где обе наши логики ошибаются. - person Darshan Puranik; 04.11.2019
comment
Извините моя ошибка. Пожалуйста, взгляните на последнюю строку скрипта стратегии. Я использовал strategy.close(), и теперь вы также получаете приказ на выход. - person Baris Yakut; 04.11.2019
comment
Без проблем. Спасибо за помощь. Моя стратегия не дает мне данных, которые я ищу. Могу ли я запустить свою стратегию, скажем, с 1 января 2010 года по настоящее время. Я верю, что это будет более полезно. В настоящее время я вхожу где-то в 2005 году и остаюсь на долго, что не является плохим признаком, но я хочу увидеть результат в ближнем бою. - person Darshan Puranik; 04.11.2019
comment
Да, ты можешь. Взгляните на новый сценарий стратегии. В самом начале есть часть, чтобы получить какое-то временное окно от пользователя. Сразу после этого идет расчет временных рамок. window() - это ваш флаг, который вы должны проверить перед размещением заказа, чтобы увидеть, происходит ли заказ в желаемом временном окне. Я добавил эту проверку в условие when для strategy.entry() и strategy.close(). Вы можете изменить эти значения временного окна в настройках стратегии или просто изменить значения по умолчанию в коде. - person Baris Yakut; 04.11.2019