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

Автор:Чао Чжан, Дата: 2021-12-21 12:01:01
Тэги:

img

Обзор

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

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

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

RS = Текущая цена / Самый высокий максимум за период RS Длина

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

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

Важно отметить, что первые два МА построены с использованием значений RS в качестве источника. Поэтому мы только что создали индикатор индикатора. Этот вид метода очень эффективен, потому что он редко используется и приносит ценность стратегии.

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

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

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

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

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

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

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

Руководство по улучшению

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

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

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

Заключение

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


/*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)

Больше