Эта стратегия генерирует сигналы покупки и продажи путем сравнения перекрестного действия быстрой линии и медленной линии индикатора MACD. Когда генерируется сигнал покупки, он откроет позицию с определенным процентом собственного капитала счета. Затем дополнительные позиции будут добавлены в конкретных точках ретрекшемента. Когда накопленная прибыль позиций достигнет конфигурированной точки получения прибыли, все позиции будут закрыты. Логика сигналов продажи аналогична сигналам покупки.
Основная логика этой стратегии заключается в сравнении перекрестка быстрой линии MACD и медленной линии для определения тренда. MACD - это разница между скользящими средними, рассчитывая разницу между краткосрочными и долгосрочными скользящими средними, он оценивает тенденцию и импульс рынка.
Когда быстрая линия пересекает медленную линию, генерируется золотой крест, указывающий на то, что рынок находится в восходящей тенденции, и стратегия откроет длинные позиции. Когда быстрая линия пересекает медленную линию, генерируется смертельный крест, указывающий на нисходящую тенденцию, и стратегия откроет короткие позиции.
После открытия позиций стратегия будет добавляться к существующим длинным или коротким позициям в определенных точках ретрассейнга. Это может увеличить потенциал прибыли с помощью принципа Мартингейла. Когда накопленная прибыль достигнет конфигурированной точки получения прибыли, стратегия закроет все позиции.
Эта стратегия имеет следующие преимущества:
Использует индикатор MACD для определения тенденции рынка, который является классическим и надежным индикатором технического анализа.
Принимает подход к открытию позиций по партиям, которые могут контролировать риск одной сделки.
Добавление к позициям может увеличить потенциал прибыли с помощью принципа Мартингейла.
Конфигурирование точки получения прибыли для ограничения потерь.
Эта стратегия также сопряжена с некоторыми рисками:
Индикатор MACD не может точно предсказать движения рынка, могут возникать ложные сигналы.
Существует риск того, что ретрексейн будет расширяться с добавлением полной позиции.
Установка точки получения прибыли слишком низкой может ограничить потенциал прибыли.
Необходимость установить разумный процент капитала для открытия позиций на продукт, чтобы избежать превышения лимитов счета.
Эта стратегия может быть оптимизирована в следующих аспектах:
Проверьте параметры MACD, найдите параметры, которые лучше подходят для конкретных торговых продуктов.
Оптимизируйте процент денег и процент ретрекера для каждой добавленной позиции, найдите оптимальные комбинации параметров.
Проверьте долгосрочные и краткосрочные точки прибыли соответственно, чтобы определить оптимальные уровни.
Оценить возможности маржи счета, установить разумный максимальный лимит позиции на продукт.
Добавьте логику стоп-лосса. Стоп-лосс может эффективно контролировать потери при резких изменениях на рынке.
В общем, это типичная стратегия, основанная на тренде. Он использует индикатор 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)