Стратегия относительной силы MACD


Дата создания: 2023-12-21 12:01:01 Последнее изменение: 2023-12-21 12:01:01
Копировать: 0 Количество просмотров: 633
1
Подписаться
1623
Подписчики

Стратегия относительной силы MACD

Обзор

Эта стратегия основана на двух известных показателях: MACD и относительной силе ((RS)). Объединив их вместе, мы получаем сильный сигнал к покупке. На самом деле особенность этой стратегии заключается в том, что она выводит другой показатель из одного показателя.

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

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

RS = текущая цена / максимальная цена в длине RS

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

MACD является одним из самых известных индикаторов, который измеряет расстояние между двумя показателями скользящих средних: быстрой линией и медленной линией. Чем шире расстояние, тем больше движение, и наоборот.

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

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

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

Кроме того, эта стратегия очень уникальна, поскольку она творчески повышает эффективность стратегии, производя показатели MACD из показателей RS. Такой инновационный дизайн, вероятно, принесет дополнительную прибыль, потому что мало кто делает это.

Наконец, стратегия имеет механизмы управления капиталом и остановки потерь, которые позволяют эффективно контролировать риски и ограничивать потери от отдельных сделок.

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

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

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

Направление оптимизации

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

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

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

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

Эта стратегия использует два показателя MACD и RS для обеспечения сильного сигнала покупки. Инновация заключается в том, что из показателя RS выводится показатель MACD, который сочетается с показателем, чтобы повысить эффективность. У стратегии есть четкий механизм входа, остановки убытков и управления капиталом, который позволяет эффективно контролировать риск.

Исходный код стратегии
/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 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/
// © gsanson66


//This strategy calculates the Relative Strength and plot the MACD of this Relative Strenght
//We take only buy signals send by MACD
//@version=5
strategy("MACD OF RELATIVE STRENGHT STRATEGY", shorttitle="MACD RS STRATEGY", precision=4, overlay=false, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18, slippage=3)


//------------------------------TOOL TIPS--------------------------------//

t1 = "Relative Strength length i.e. number of candles back to find the highest high and compare the current price with this high."
t2 = "Relative Strength fast EMA length used to plot the MACD."
t3 = "Relative Strength slow EMA length used to plot the MACD."
t4 = "Macdline SMA length used to plot the MACD."
t5 = "The maximum loss a trade can incur (in percentage of the trade value)"
t6 = "Each gain or losse (relative to the previous reference) in an amount equal to this fixed ratio will change quantity of orders."
t7 = "The amount of money to be added to or subtracted from orders once the fixed ratio has been reached."


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, loc) =>
    label.new(bar_index, loc, text=txt, color=color, style=label.style_label_lower_right, textcolor=color.black, size=size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
rs_lenght = input.int(defval=300, minval=1, title="RS Length", group="Technical parameters", tooltip=t1)
fast_length = input(title="MACD Fast Length", defval=14, group="Technical parameters", tooltip=t2)
slow_length = input(title="MACD Slow Length", defval=26, group="Technical parameters", tooltip=t3)
signal_length = input.int(title="MACD Signal Smoothing",  minval=1, maxval=50, defval=10, group="Technical parameters", tooltip=t4)
//Risk Management
slMax = input.float(8, "Max risk per trade (in %)", minval=0, group="Risk Management", tooltip=t5)
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management", tooltip=t6)
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management", tooltip=t7)
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Relative Strenght Calculation
rs = close/ta.highest(high, rs_lenght)
//MACD of RS Calculation
[macdLine, signalLine, histLine] = ta.macd(rs, fast_length, slow_length, signal_length)
//Money management
equity = math.abs(strategy.equity - strategy.openprofit)
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=macdLine)


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size>0 and histLine<0
    strategy.close("Long")


//-------------------------------BUY CONDITION-------------------------------------//

if histLine>0 and not (strategy.position_size>0) and inRange
    qty = cashOrder/close
    stopLoss = close*(1-slMax/100)
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop=stopLoss)


//---------------------------------PLOTTING ELEMENT----------------------------------//

hline(0, "Zero Line", color=color.new(#787B86, 50))
plot(macdLine, title="MACD", color=color.blue)
plot(signalLine, title="Signal", color=color.orange)
plot(histLine, title="Histogram", style=plot.style_columns, color=(histLine>=0 ? (histLine[1] < histLine ? #26A69A : #B2DFDB) : (histLine[1] < histLine ? #FFCDD2 : #FF5252)))
plotchar(rs, "Relative Strenght", "", location.top, color=color.yellow)