Стратегия следования за трендом, основанная на показателях объема


Дата создания: 2023-10-10 14:51:13 Последнее изменение: 2023-10-10 14:51:13
Копировать: 0 Количество просмотров: 1032
1
Подписаться
1617
Подписчики

Обзор

Эта стратегия основана на индикаторе объема торгов (VFI) для осуществления трендовых сделок. Стратегия определяет направление рыночных тенденций путем расчета колебаний цен на акции и изменений объема торгов, чтобы достичь низких покупок и высоких продаж.

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

  1. Расчет показателя VFI: значение VFI рассчитывается на основе логистических изменений цен на акции и объемов сделок, устраняя колебания с помощью плавной обработки.

  2. Определение направления тренда: проход по оси 0 на VFI является положительным сигналом, а по оси 0 - отрицательным сигналом.

  3. Торговый сигнал: быстрый EMA с медленным EMA, и VFI с большим при покупке входящей линии; при продаже выходящей линии VFI с равным положением.

  4. Способ остановки убытков: установить фиксированную остановку убытков.

Эта стратегия основывается на VFI-индикаторе для определения направления тенденции, который в сочетании с равнолинейной системой посылает торговые сигналы. VFI-индикатор отражает рыночные настроения через колебания цен на акции и изменения объема торгов.

Стратегические преимущества

  1. Индекс VFI оценивает тенденции лучше, чем единый ценовой индикатор, который эффективно отфильтровывает рыночные колебания и ложные прорывы.

  2. Система равнолинейной оценки помогает избежать ошибочных сигналов от VFI-индекса в условиях колебаний.

  3. Установление фиксированной точки остановки контроля риска, полезное для управления рисками.

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

  5. Настройка параметров гибкая, параметры могут быть скорректированы в зависимости от рынка, чтобы адаптироваться к различным циклам и сортам.

Стратегический риск

  1. В условиях значительных колебаний на рынке, VFI может подавать ошибочные сигналы.

  2. Фиксированные точки остановки могут быть слишком большими или слишком маленькими, что приводит к преждевременной или поздней остановке.

  3. Если параметры покупки и продажи установлены неправильно, это может привести к частым сделкам или пропущенным бланкам.

  4. Тренд-трекерская стратегия не может уловить обратный ход, и нужно своевременно остановить убытки.

  5. Неправильные параметры могут привести к раннему или позднему зачислению.

Оптимизация стратегии

  1. Настройка параметров VFI, оптимизация расчета показателей.

  2. Регулирование цикла средней линии, оптимизация времени подачи сигнала.

  3. Динамическая настройка точки остановки, оптимизация способа остановки.

  4. В сочетании с другими индикаторами фильтрации, улучшение качества сигнала.

  5. Оптимизация параметров для больших и малых циклов.

  6. Тестирование жизнеспособности параметров различных сортов, повышение адаптивности параметров.

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

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

Исходный код стратегии
/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-06 21:00:00
period: 3m
basePeriod: 1m
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/
// © mohanee
//This strategy is based on VFI indicator published by  UTS.  
//more details of VFI indicator can be found at  [url=http://mkatsanos.com/VFI.html]http://mkatsanos.com/VFI.html[/url] 
// I have added buy line and sell line to the indicator  and tested  SPY stock/index on one hour chart

//@version=4
strategy(title="VFI  strategy [based on VFI indicator published by  UTS]", overlay=false,pyramiding=2, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)


// Const
kMaColor = color.aqua
kNeutralColor = color.gray
kBearColor = color.red
kBullColor = color.green

kAlma = "ALMA"
kEma = "EMA"
kSma = "SMA"
kWma = "WMA"


// Input

vfi_length = input(8, title="Length", minval=1)  //default 130
vfi_coef = input(0.2, title="Coef", minval=0.1)
vfi_volCutoff = input(2.5, title="Volume Cutoff", minval=0.1)
vfi_smoothLen = input(3, title="Smoothing Period", minval=1)
vfi_smoothType = input(kEma, title="Smoothing Type", options=[kAlma, kEma, kSma, kWma])

//These are adde by me for the strategy purpose  BEGIN
vfi_buyLine = input(-4, title="Buy Line", minval=-10)
vfi_sellLine = input(5, title="Sell Line", minval=-10)
stopLoss = input(title="Stop Loss%", defval=5, minval=1)
//These are adde by me for the strategy purpose  END

vfi_longEMA = input(200, title="Long EMA", minval=1)
vfi_shortEMA1 = input(50, title="short EMA1", minval=1)
vfi_shortEMA2 = input(9, title="short EM2A", minval=1)

vfi_showTrend = input(false, title="Visualize Trend")
vfi_showFill = input(true, title="Apply Filling")
vfi_showMa = input(true, title="Show Moving Average")
vfi_maType = input(kSma, title="Moving Average Type", options=[kAlma, kEma, kSma, kWma])
vfi_maLength = input(30, title="Moving Average Length", minval=1)
vfi_almaOffset = input(0.85, title="• ALMA - Offset (global setting)", minval=0.0, maxval=1.0, step=0.05) // more smoothness (closer to 1) vs. more responsiveness (closer to 0)
vfi_almaSigma = input(6.0, title="• ALMA - Sigma (global setting)", minval=0.0, step=0.05) // the larger sigma the smoother ALMA


// Functionality

isRising(sig) =>
    sig > sig[1]
    
isFlat(sig) =>
    sig == sig[1]

vfi_trendColor(sig) =>
    isFlat(sig) ? kNeutralColor : isRising(sig) ? kBullColor : kBearColor
    
vfi_color(sig) =>
    isFlat(sig) ? kNeutralColor : sig > 0 ? kBullColor : kBearColor
    
osc_color(sig) =>
    sig == 0 ? kNeutralColor : sig > 0 ? kBullColor : kBearColor

smooth(t, sig, len) =>
    ma = float(sig)         // None
    if t == kSma            // Simple
        ma := sma(sig, len)
    if t == kEma            // Exponential
        ma := ema(sig, len)
    if t == kWma            // Weighted
        ma := wma(sig, len)
    if t == kAlma           // Arnaud Legoux
        ma := alma(sig, len, vfi_almaOffset, vfi_almaSigma)
    ma

calc_vfi(fviPeriod, smoothType, smoothLen, coef, vCoef) =>
    avg = nz(hlc3)
    inter = log(avg) - log(avg[1])
    vInter = stdev(inter, 30)
    cutOff = coef * vInter * close
    vAve = smooth(kSma, volume[1], fviPeriod)
    vMax = vAve * vCoef
    vC = min(volume, vMax)
    mf = avg - avg[1]
    vCp = iff(mf > cutOff, vC, iff(mf < -cutOff, -vC, 0))
    sVfi = sum(vCp, fviPeriod) / vAve
    vfi = smooth(smoothType, sVfi, smoothLen)
    
value_vfi = calc_vfi(vfi_length, vfi_smoothType, vfi_smoothLen, vfi_coef, vfi_volCutoff)
value_ma = smooth(vfi_maType, value_vfi, vfi_maLength)

longEMAval= ema(close, vfi_longEMA)
shortEMAval1= ema(close, vfi_shortEMA1)
shortEMAval2= ema(close, vfi_shortEMA2)

color_vfi = vfi_showTrend ? vfi_trendColor(value_vfi) : vfi_color(value_vfi)
color_osc = vfi_showFill ? osc_color(value_vfi) : na
color_ma = vfi_showMa ? kMaColor : na


// Drawings

plot_vfi = plot(value_vfi, title="VFI", color=color_vfi, linewidth=1)
plot_fill = plot(0, color=color_vfi, editable=false)
fill(plot_vfi, plot_fill, title="Oscillator Fill", color=color_osc, transp=75) 
hline(vfi_buyLine, color=color.green, title="Buy Line", linewidth=2, linestyle=hline.style_dashed)
hline(vfi_sellLine, color=color.purple, title="Sell Line", linewidth=2, linestyle=hline.style_dashed)
plot(value_ma, title="MA", color=color_ma, linewidth=2)

strategy.entry(id="VFI LE", long=true,  when=crossover(value_vfi,vfi_buyLine)  and ( shortEMAval1 >= longEMAval  ))

//strategy.close(id="VFI LE", comment="Exit",   when=crossunder(value_vfi,vfi_sellLine))
strategy.close(id="VFI LE", comment="TP Exit",   when=crossunder(value_vfi,vfi_sellLine) and close>strategy.position_avg_price)
//strategy.close(id="VFI LE", comment="Exit",   when=  (shortEMAval1 > shortEMAval2 )  and crossunder(close, shortEMAval2))

//stoploss
stopLossVal =   strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01) 
strategy.close(id="VFI LE", comment="SL Exit",   when=crossunder(value_vfi,vfi_sellLine) and close < stopLossVal)