Количественная стратегия «Золотой крест» и «Мертвый крест» на торговых парах


Дата создания: 2023-12-27 14:28:21 Последнее изменение: 2023-12-27 14:28:21
Копировать: 0 Количество просмотров: 566
1
Подписаться
1621
Подписчики

Количественная стратегия «Золотой крест» и «Мертвый крест» на торговых парах

Обзор

Эта стратегия создает сигналы покупки и продажи, сравнивая перекрестные линии быстрого и медленного движения 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)