Простая количественная стратегия, основанная на пошаговом добавлении позиций


Дата создания: 2023-12-27 17:39:40 Последнее изменение: 2023-12-27 17:39:40
Копировать: 0 Количество просмотров: 684
1
Подписаться
1623
Подписчики

Простая количественная стратегия, основанная на пошаговом добавлении позиций

Обзор

Эта стратегия является простой стратегией количественной торговли с использованием временной лестницы. Основная идея этой стратегии заключается в том, чтобы открывать позиции в определенное время каждый день, а затем устанавливать различные условия стоп-стоп для каждой позиции, чтобы осуществить блокировку или остановку.

Стратегический принцип

Эта стратегия основана на трёх ключевых логиках:

  1. Временная лестница

ИспользованиеsessionTimeПараметры устанавливаются в течение суточного торгового периода, в течение которого каждый день открытия рынка происходит постепенное наращивание позиций в виде фиксированной лестницы, а количество наращиваемых позиций распределяется по среднему значению от максимального количества позиций в фонде.

  1. Индивидуальная стоп-убытка

Установите соответствующую точку остановки для каждого открытого ордераtakeProfitи остановкиstopLoss, что позволяет каждому заказу иметь независимую логику стоп-стоп, что позволяет реализовать серию стоп-стоп.

  1. Временный отрезок для закрытия позиции

По окончании внутридневного периода торгов вы можете выбрать, будет ли ликвидировано все ордера, которые не были остановлены в течение этого периода.

Стратегические преимущества

Эта стратегия имеет следующие преимущества:

  1. Распределение риска, распределение средств в фондовом пуле между различными заказами, эффективное управление потерями по отдельным заказам.

  2. Ограничение на стоп-потерей в партиях, отдельные заказы имеют независимую логику стоп-потерей, чтобы предотвратить одновременную потерю всех заказов.

  3. Гибкая конфигурация, максимальное количество пополнений, ежедневные торговые периоды, стоп-стоп-лосс и другие параметры.

  4. Это очень просто, логично и понятно.

Стратегический риск

Однако эта стратегия также несет в себе определенные риски:

  1. Существует риск покрытия, если все заказы не достигнут стоп-линии, то сначала будет вызвана соответствующая стоп-линия, что приведет к большим потерям. Можно избежать этого, используя разумную конфигурацию стоп-процентов.

  2. Нельзя ограничивать сумму, открываемую в день, если в исключительных случаях количество заказов может превышать финансовую выносливость. Можно рассмотреть вопрос о максимальном ограничении суммы, открываемой в день.

  3. Неправильная конфигурация временного отрезка может привести к упущенным возможностям. Рекомендуется конфигурировать торговые периоды в соответствии с активными периодами целевого торгового сорта.

Оптимизация стратегии

Эта стратегия может быть оптимизирована в следующих направлениях:

  1. Добавление логики определения условий открытия позиции, открытие позиции только при удовлетворении определенных сигналов технических показателей, чтобы избежать слепого наращивания позиций.

  2. Повышение лимита на сумму ежедневных вложений, чтобы предотвратить превышение возможностей фонда.

  3. Для различных заказов устанавливается разное соотношение стоп-лосса, чтобы достичь дифференцированного стоп-лосса.

  4. Логика увеличения количества заказов в зависимости от остатков в фондовом фонде, чтобы количество заказов было связано с доступными средствами.

Подвести итог

В целом, это очень простой шаблон стратегии для количественной торговли с использованием идеи временного лестничного наращивания, логика стратегии ясна, но в то же время существует определенный риск и пространство для оптимизации, разработчики могут на этой основе провести соответствующую оптимизацию, чтобы сделать ее более стабильной и надежной количественной стратегией.

Исходный код стратегии
/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © A3Sh

//@version=5
strategy("Simple_Pyramiding", overlay=true, pyramiding=99, initial_capital=500, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, close_entries_rule='FIFO')

// Study of a Simple DCA strategy that opens a position every day at a specified time.
// A position is opened at the start time of the Timeframe.
// Positions exit individually when the take profit level is triggered.
// Option to activate Stop Loss and/or Position exit at the end of the Timeframe


// Backtest Window
start_time   = input(defval=timestamp("01 April 2021 20:00"), group = "Backtest Window", title="Start Time")
end_time     = input(defval=timestamp("01 Aug 2022 20:00"),  group = "Backtest Window", title="End Time")
window() => true


// Inputs
posCount     = input.int    (6,           group = "Risk",         title = "Max Amount of DCA Entries")
takeProfit   = input.float  (2.5,         group = "Risk",         title = "Take Profit %")
slSwitch     = input.bool   (true,        group = "Risk",         title = "Activate Stop Loss")
stopLoss     = input.float  (9,           group = "Risk",         title = "Stop Loss %")
sessionTime =  input("1800-1700", group = "DCA Settings", title = "DCA Order Timeframe", tooltip="Open order at the start/If ativated, close order at the end")
exitDCA     =  input.bool   (false,       group = "DCA Settings", title = "Exit DCA Entry at end of Timeframe")


// Order size based on max amount of pyramid orders
q = (strategy.equity  / posCount) / open


// Timeframe for opening and closing a DCA order
// example taken from https://stackoverflow.com/questions/69230164/pinescript-basic-question-open-a-trade-at-a-set-time-each-day
t       = time("D", sessionTime)
isStart = na(t[1]) and not na(t) or t[1] < t
isEnd   = na(t) and not na(t[1]) or t[1] < t
bgcolor(t ? color.new(color.blue,95) : na, title = " TimeFrame Color")


// Create DCA Entries
entry_price = 0.0
if isStart and window() 
    for i = 0 to strategy.opentrades
        if strategy.opentrades == i
            entry_price := close
            entry_id = "PE_" + str.tostring(i + 1) 
            strategy.entry(id = entry_id, direction=strategy.long, limit=entry_price, qty=q)
        if strategy.opentrades == posCount
            break
            
 
//Exit DCA Entries when take profit or stop loss is triggered
if strategy.opentrades > 0 and window() 
    for i = 0 to strategy.opentrades 
        exit_from = "PE_" + str.tostring(i + 1)
        exit_id = "Exit_" + str.tostring(i + 1)
        strategy.exit(id= exit_id, from_entry= exit_from, profit = close * takeProfit / 100 / syminfo.mintick, loss = slSwitch ? close * stopLoss /100 / syminfo.mintick :na)
        

//Exit DCA Entries at end of DCA Timeframe
if strategy.opentrades > 0 and exitDCA and isEnd and window() 
    for i = 0 to strategy.opentrades 
        exit_from = "PE_" + str.tostring(i + 1)
        exit_id = "Exit_" + str.tostring(i + 1)
        strategy.exit(id= exit_id, from_entry= exit_from, stop = close)