Вопрос или проблема
Я работаю над стратегией индексного инвестирования, в которой я хочу добавлять X сумму каждый раз, когда цена закрытия падает на Y% от максимума за месяц. Это всего лишь эксперимент, в целом это своего рода умная стратегия по покупке на спаде, я выйду из позиции только в последний торговый день, чтобы проверить результативность. Я пытался найти образцы скриптов, где я мог бы продолжать добавлять деньги, но продавать только один раз за день, но без успеха. Может кто-нибудь помочь мне с этим? Ниже приведён скрипт, над которым я работаю.
//@version=5
strategy(title="Стратегия индексного SIP", shorttitle="Стратегия индексного SIP", overlay = true, pyramiding=1, default_qty_type=strategy.percent_of_equity,default_qty_value=100, precision=2, process_orders_on_close = true)
// ====== ЛОГИКА ПОКУПКИ
length = input.int(22, minval=1)
h = ta.highest(high, length)
percDip = input.int(5, minval=1)
source = close
downPer= ((h - close)/h)*100
diffConditionBuy = false
if downPer > percDip
diffConditionBuy := true
// ТОЧКА ДОПОЛНЕНИЯ --
if diffConditionBuy == true
strategy.entry("x", strategy.long, comment="Покупка")
// ====== ЛОГИКА ПРОДАЖИ
isLastTradingDay = ((timenow-time)<300000000)
diffConditionSell = isLastTradingDay
// ТОЧКА ВЫХОДА
if diffConditionSell == true
strategy.close_all("Выход сегодня")
Ответ или решение
Ваша стратегия "умного падения" (Smart DIP Strategy) основана на добавлении средств в индекс при сниженном уровне закрытия. Давайте улучшить ваш код, чтобы он продолжал добавлять средства при выполнении условий и продавал только в последний торговый день месяца.
Приведенный вами код уже близок к желаемой реализации, однако, чтобы реализовать функционал добавления средств в позицию (покупку) при каждом сигнале, нужно внести несколько изменений. Четче определим параметры и условия для добавления и выхода.
Вот обновленный код:
//@version=5
strategy(title="Index SIP Strategy", shorttitle="Index SIP Strategy", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=10, precision=2, process_orders_on_close=true)
// ====== BUY LOGIC
length = input.int(22, minval=1) // Период для нахождения максимума
h = ta.highest(high, length) // Находим максимум за период
percDip = input.int(5, minval=1) // Процент падения
source = close
downPer = ((h - close) / h) * 100 // Рассчитываем процент снижения от максимума
// Условия для добавления позиции
if downPer > percDip
strategy.entry("Buy", strategy.long, comment="Добавить средства")
// ====== SELL LOGIC
isLastTradingDay = (dayofweek(timenow) == dayofweek.monday and hour(timenow) == 15 and minute(timenow) == 30) // Здесь указываем последний день торговли
diffConditionSell = isLastTradingDay
// EXIT POINT
if diffConditionSell
strategy.close_all("Продажа в последний день")
Объяснение внесенных изменений:
-
Изменение параметров для pyramiding: Увеличил параметр
pyramiding
до 100. Это число определяет, сколько раз можно увеличивать позицию. Заметьте, что в вашем случае лучше установить его достаточно высокой, чтобы вы могли добавлять позиции в соответствии с вашим подходом. -
Условия для входа в сделку: Теперь каждая ошибка (сигнал) о покупке добавляется к одной и той же позиции при выполнении условия. Таким образом, вы будете добавлять к своему капиталу каждый раз, когда цена упадет на более чем указанный процент от недавнего максимума.
-
Условия для выхода из сделки: Я улучшил условие для последнего торгового дня, чтобы было более понятно, что продажа происходит в определённое время последнего дня (вы можете настроить, в какой день вы хотите продавать, например, за несколько минут до закрытия рынка).
-
Корректировка параметров на вход: Настройте
default_qty_value
, чтобы он определял, какая часть капитала используется для каждой новой покупки.
Этот код обслуживает стратегию добавления средств по сигналам падения и продажу в определенные дни. Подкорректируйте дополнительные элементы под ваш рынок и брокеры, так как правила могут отличаться.