Максимизатор прибыли PMax

Автор:Чао Чжан, Дата: 2022-05-25 17:13:45
Тэги:SMAЕМАWMATMAATRЗЛЕМА

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

Максимизатор прибыли - PMax пытается решить эту проблему. PMax объединяет в одном индикаторе мощные стороны MOST (Moving Average Trend Changer) и SuperTrend (ATR price detection).

Результаты обратных тестов и оптимизации PMax намного лучше по сравнению с его предшественниками MOST и SuperTrend.

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

Первым параметром показателя PMax, установленным тремя параметрами, является период/длительность ATR.

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

Лично я считаю, что самый важный параметр - Длина и тип скользящей средней.

PMax будет очень чувствителен к движениям тренда, если Длина Движущейся Средней меньше.

По мере увеличения периода он становится менее чувствительным к незначительным тенденциям и ценовым изменениям.

Таким образом, ваш выбор периода будет тесно связан с тем, какая из тенденций вас интересует.

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

Встроенный тип скользящей средней по умолчанию установлен как EMA, но пользователи могут выбирать из 8 различных типов скользящей средней, как:

SMA: Простая скользящая средняя EMA: Экспоненциальное среднее движение WMA: Взвешенная скользящая средняя TMA: Треугольная скользящая средняя VAR: переменный индекс динамическая скользящая средняя WWMA: Движущийся средний Уэллса Уайлдера ZLEMA: экспоненциальный скользящий средний с нулевым отставанием TSF: Настоящая сила силы

Совет: в боковой стороне VAR был бы хорошим выбором

Вы можете использовать PMax по умолчанию сигналы тревоги и купить продать сигналы, как:

1- Купить, когда скользящая средняя пересекает PMax Продать, когда скользящая средняя пересекает PMax

2- Купить, когда цены перепрыгнули линию Pmax. Продайте, когда цены опустится ниже линии Pmax.

обратная проверка

img


/*backtest
start: 2022-04-24 00:00:00
end: 2022-05-23 23:59:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

study("Profit Maximizer","PMax", overlay=true, format=format.price, precision=2, resolution="")
src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
Normalize= input(title="Normalize ATR ?", type=input.bool, defval=false)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = Normalize ? MAvg - Multiplier*atr/close : MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = Normalize ? MAvg + Multiplier*atr/close : MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)
alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")

buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)

sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)


if buySignalk
    strategy.entry("Enter Long", strategy.long)
else if sellSignallk
    strategy.entry("Enter Short", strategy.short)

Связанные

Больше