Количественная стратегия кросс-паров Bollinger Band Crossover

Автор:Чао Чжан, Дата: 2023-12-27 14:28:21
Тэги:

img

Обзор

Эта стратегия генерирует сигналы покупки и продажи путем сравнения перекрестного действия быстрой линии и медленной линии индикатора MACD. Когда генерируется сигнал покупки, он откроет позицию с определенным процентом собственного капитала счета. Затем дополнительные позиции будут добавлены в конкретных точках ретрекшемента. Когда накопленная прибыль позиций достигнет конфигурированной точки получения прибыли, все позиции будут закрыты. Логика сигналов продажи аналогична сигналам покупки.

Логика стратегии

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

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

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

Анализ преимуществ

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

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

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

  3. Добавление к позициям может увеличить потенциал прибыли с помощью принципа Мартингейла.

  4. Конфигурирование точки получения прибыли для ограничения потерь.

Анализ рисков

Эта стратегия также сопряжена с некоторыми рисками:

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

  2. Существует риск того, что ретрексейн будет расширяться с добавлением полной позиции.

  3. Установка точки получения прибыли слишком низкой может ограничить потенциал прибыли.

  4. Необходимость установить разумный процент капитала для открытия позиций на продукт, чтобы избежать превышения лимитов счета.

Руководство по оптимизации

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

  1. Проверьте параметры MACD, найдите параметры, которые лучше подходят для конкретных торговых продуктов.

  2. Оптимизируйте процент денег и процент ретрекера для каждой добавленной позиции, найдите оптимальные комбинации параметров.

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

  4. Оценить возможности маржи счета, установить разумный максимальный лимит позиции на продукт.

  5. Добавьте логику стоп-лосса. Стоп-лосс может эффективно контролировать потери при резких изменениях на рынке.

Резюме

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


/*backtest
start: 2023-11-26 00:00:00
end: 2023-12-26 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingSoft_tech

//@version=5
strategy("MAPM-V1", overlay=true, default_qty_value=10, max_bars_back=5000,default_qty_type = strategy.percent_of_equity, commission_value=0.1, initial_capital = 100, pyramiding=6, currency=currency.USD)

///////// Options
SignalFast = input.int(300, step=10)
SignalSlow = input.int(600, step=10)
StepAddPurchases = input.float(2.5, step=0.1)
VolumePurchases = input.int(6,step=1)
Buy = input(true)
Sell = input(true)
longProfitPerc = input.float(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01
shortProfitPerc = input.float(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01
Martingale = input.float(1.6, minval = 1, step = 0.1)
VolumeDepo = input.int(100, step=1)
PercentOfDepo = input.float(10, step=1)
Close = (close)
EnterVolume = VolumeDepo*PercentOfDepo*0.01/Close

///////// Calculation indicator
fastAverage = ta.ema(close, 8)
slowAverage = ta.ema(close, 49)
macd = fastAverage - slowAverage
macdSignalF = ta.ema(macd,SignalFast)
macdSignalS = ta.ema(macd,SignalSlow)

// Test Start
startYear = input(2005, "Test Start Year")
startMonth = input(1, "Test Start Month")
startDay = input(1, "Test Start Day")
startTest = timestamp(startYear,startMonth,startDay,0,0)

//Test End
endYear = input(2050, "Test End Year")
endMonth = input(12, "Test End Month")
endDay = input(30, "Test End Day")
endTest = timestamp(endYear,endMonth,endDay,23,59)

timeRange = time > startTest and time < endTest ? true : false

///////// Plot Data
//plot(macd, style = plot.style_histogram)
//plot(macdSignalF*10000, style = plot.style_line, color=color.red)
//plot(macdSignalS*10000, style = plot.style_line, color=color.blue)
//plot(fastAverage, style = plot.style_line, color=color.red)
//plot(slowAverage, style = plot.style_line, color=color.blue)

///////// Calculation of the updated value
var x = 0.0
if strategy.opentrades>strategy.opentrades[1]
    x := x + 1
else if strategy.opentrades==0
    x := 0
y = x+1

///////// Calculation of reference price data
entryPrice = strategy.opentrades==0? 0 : strategy.opentrades.entry_price(0)
limitLong = strategy.position_avg_price * (1 + longProfitPerc)
limitShort = strategy.position_avg_price * (1 - shortProfitPerc)
SteplimitLong = entryPrice[0]*(1-StepAddPurchases*y/100)
SteplimitShort = entryPrice[0]*(1+StepAddPurchases*y/100)

///////// Conditions for a long
bool EntryLong = ta.crossover(macdSignalF, macdSignalS) and Buy and strategy.opentrades==0 and strategy.position_size==0
bool PurchasesLong = Buy and strategy.opentrades==x and strategy.position_size>0 and x<=VolumePurchases
bool CancelPurchasesLong = strategy.position_size==0 and strategy.opentrades==0
bool TPLong = strategy.position_size>0 and strategy.opentrades!=0
///////// Entry Long + add.purchases + cancel purchases + Take profit Long
switch 
    EntryLong => strategy.entry("Entry Long", strategy.long, qty = EnterVolume)
    PurchasesLong => strategy.entry("PurchasesLong", strategy.long, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitLong)
    CancelPurchasesLong => strategy.cancel("PurchasesLong")
switch
    TPLong => strategy.exit("TPLong", qty_percent = 100, limit = limitLong)

///////// Conditions for a Short
bool EntryShort = ta.crossunder(macdSignalF, macdSignalS) and Sell and strategy.opentrades==0 and strategy.position_size==0
bool PurchasesShort = Sell and strategy.opentrades==x and strategy.position_size<0 and x<=VolumePurchases
bool CancelPurchasesShort = strategy.position_size==0 and strategy.opentrades==0
bool TPShort = strategy.position_size<0 and strategy.opentrades!=0

///////// Entry Short + add.purchases + cancel purchases + Take profit Short
switch
    EntryShort => strategy.entry("Entry Short", strategy.short, qty = EnterVolume)
    PurchasesShort => strategy.entry("PurchasesShort", strategy.short, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitShort)
    CancelPurchasesShort => strategy.cancel("PurchasesShort")
switch
    TPShort => strategy.exit("TPShort", qty_percent = 100, limit = limitShort)
    
/////////Calculation of conditions and reference data for level drawing
InTradeLong = strategy.position_size<0
InTradeShort = strategy.position_size>0
PickInLong = strategy.opentrades.entry_price(0)*(1-StepAddPurchases*y/100)
PickInShort = strategy.opentrades.entry_price(0)*(1+StepAddPurchases*y/100)

/////////Displaying the level of Take Profit
plot(InTradeLong ? na : limitLong, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1)
plot(InTradeShort ? na : limitShort, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1)

/////////Displaying the level of add.purchases
plot(InTradeLong ? na : PickInLong, color=color.white, style=plot.style_linebr, linewidth=1)
plot(InTradeShort ? na : PickInShort, color=color.white, style=plot.style_linebr, linewidth=1)

Больше