Стратегия отслеживания перемещающейся средней

Автор:Чао Чжан, Дата: 2023-10-24 11:21:57
Тэги:

img

Обзор

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

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

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

  2. Пользователи должны установить период скользящей средней.

  3. Как только скользящая средняя будет выбрана, стратегия будет рассчитывать ее в режиме реального времени.

  4. Стратегия использует механизм отслеживания стоп-лосса. После открытия позиции она будет постоянно отслеживать взаимосвязь между скользящей средней и ценой и динамически корректировать уровень стоп-лосса. В частности, стоп-лосс устанавливается на скользящей средней плюс/минус процент стоп-лосса, установленный пользователем.

  5. Пользователи могут установить процент стоп-лосса. Более высокий процент означает более широкий диапазон стоп-лосса и меньшую чувствительность. Меньший процент означает более узкий стоп-лосс и более низкий риск. Процент стоп-лосса обычно устанавливается в пределах от 2% до 5%.

  6. После открытия позиции, если цена пройдет через скользящую среднюю, позиция будет закрыта.

Преимущества

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

Риски

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

Риски можно оптимизировать и контролировать:

  • Использование стратегии в продуктах и сроках с очевидными тенденциями
  • Корректировка скользящей средней за период с использованием долгосрочных скользящих средних
  • Соответствующее снижение процента стоп-лосса для более строгого контроля рисков
  • Испытания отдельно на каждом изделии для поиска оптимальных параметров
  • Прекратите торговать до крупных новостей

Возможности для расширения

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

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

  2. Например, 5-дневный MA и 20-дневный MA можно использовать вместе, так что сделки принимаются только тогда, когда оба выстраиваются в одном направлении.

  3. Испытать параметры отдельно на каждом продукте и установить оптимальные параметры. параметры различаются в зависимости от продуктов и временных рамок, поэтому необходимо отдельное тестирование.

  4. Добавьте правила размещения позиции. Например, фиксированное количество для начальной позиции, а затем добавьте к позиции на основе расстояния остановки потери.

  5. Установите максимальное количество сделок в день или минимальное время между сделками. Это ограничивает чрезмерную торговлю.

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

  7. Включить модели глубокого обучения для прогнозирования тенденции цен, помогая в определении направления тренда.

Заключение

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


/*backtest
start: 2023-01-01 00:00:00
end: 2023-03-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//attoCryp, @HikmetSezen58
strategy("MOST Multi MAs", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
sx=input(defval = "close" ,title="Fiyat sec", options=[ "close", "high", "low", "open", "hl2", "hlc3", "hlco4", "hlcc4", "hlccc5"])
smox=input(defval = "HulleMA", title = "Hareketli Ortalama: ", options=["T3", "SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "EVWMA", "HullMA", "HulleMA", "LSMA", "ALMA", "TMA", "SSMA"])
timeFramemost = input(title="++++++++++++++++++++++++++++++++++++", defval="MOST Ayarlari:")
yuzde=input(defval=3.8, minval=0, step=0.1, title="Yuzde Oran")/100
ortalamauzunluk=input(defval=28, title="Periyot Uzunlugu", minval=1)
f=input(defval=0.4, step=0.1, title="T3 icin Factor", minval=0.01)
timeFrameadd=input(title="++++++++++++++++++++++++++++++++++++", defval="Diger Orta.Ayar:")
offsig=input(defval=4, title="LSMA icin Offset veya ALMA icin Sigma", minval=0)
offalma=input(defval=0.6, title="ALMA icin Offset", minval=0, step=0.01)
timeFramess=input(title="++++++++++++++++++++++++++++++++++++", defval="Baslangic-Bitis:")
gun_baslangic=input(defval=1, title="Baslangic Gunu", minval=1, maxval=31)
ay_baslangic=input(defval=1, title="Baslangic Ayi", minval=1, maxval=12)
yil_baslangic=input(defval=2017, title="Baslangic Yili", minval=2010)
gun_bitis=input(defval=1, title="Bitis Gunu", minval=1, maxval=31)
ay_bitis=input(defval=1, title="Bitis Ayi", minval=1, maxval=12)
yil_bitis = input(defval=2019, title="Bitis Yili", minval=2010)

// backtest icin baslangic ve bitis zamanlarini belirleme
baslangic=timestamp(yil_baslangic, ay_baslangic, gun_baslangic, 00, 00)
bitis=timestamp(yil_bitis, ay_bitis, gun_bitis, 23, 59) 
zamanaraligi() => true

//guncel fiyatti belirleme
guncelfiyat=sx=="high"?high : sx=="close"?close : sx=="low"?low : sx=="open"?open : sx=="hl2"?(high+low)/2 : sx=="hlc3"?(high+low+close)/3 : sx=="hlco4"?(high+low+close+open)/4 : sx=="hlcc4"?(high+low+close+close)/4 : sx=="hlccc5"?(high+low+close+close+close)/5 : close 

/////Ortalama Hesaplamalari/////
// Tillson T3
sm0(guncelfiyat,ortalamauzunluk,f) =>
    t3e1=ema(guncelfiyat, ortalamauzunluk)
    t3e2=ema(t3e1, ortalamauzunluk)
    t3e3=ema(t3e2, ortalamauzunluk)
    t3e4=ema(t3e3, ortalamauzunluk)
    t3e5=ema(t3e4, ortalamauzunluk)
    t3e6=ema(t3e5, ortalamauzunluk)
    c1=-f*f*f
    c2=3*f*f+3*f*f*f
    c3=-6*f*f-3*f-3*f*f*f
    c4=1+3*f+f*f*f+3*f*f
    s0=c1 * t3e6 + c2 * t3e5 + c3 * t3e4 + c4 * t3e3

// Basit ortalama
sm1(guncelfiyat,ortalamauzunluk) =>
    s1=sma(guncelfiyat, ortalamauzunluk)

// Ustel ortalama
sm2(guncelfiyat,ortalamauzunluk) =>
    s2=ema(guncelfiyat, ortalamauzunluk)

// Cift Ustel ortalama
sm3(guncelfiyat,ortalamauzunluk) =>
    s3=2*ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)

// Uclu Ustel ortalama
sm4(guncelfiyat,ortalamauzunluk) =>
    s4=3*(ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)) + ema(ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk), ortalamauzunluk)

// Agirlikli Ortalama  
sm5(guncelfiyat,ortalamauzunluk) =>
    s5=wma(guncelfiyat, ortalamauzunluk)

// Hacim Agirlikli Ortalama
sm6(guncelfiyat,ortalamauzunluk) =>
    s6=vwma(guncelfiyat, ortalamauzunluk)

// Smoothed
sm7(guncelfiyat,ortalamauzunluk) =>
    s7=0.0
    s7:=na(s7[1]) ? sma(guncelfiyat, ortalamauzunluk) : (s7[1] * (ortalamauzunluk - 1) + guncelfiyat) / ortalamauzunluk

// Hull Ortalama
sm8(guncelfiyat,ortalamauzunluk) =>
    s8=wma(2 * wma(guncelfiyat, ortalamauzunluk / 2) - wma(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))
    
// Hull Ustel Ortalama
sm81(guncelfiyat,ortalamauzunluk) =>
    s8=ema(2 * ema(guncelfiyat, ortalamauzunluk / 2) - ema(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))

// Least Square
sm9(guncelfiyat,ortalamauzunluk,offsig) =>
    s9=linreg(guncelfiyat, ortalamauzunluk, offsig)

// Arnaud Legoux
sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) =>
    s10=alma(guncelfiyat, ortalamauzunluk, offalma, offsig)

// Triangular
sm11(guncelfiyat, ortalamauzunluk) =>
    s11=sma(sma(guncelfiyat, ortalamauzunluk),ortalamauzunluk)

// SuperSmoother filter
sm12(guncelfiyat,ortalamauzunluk) =>
    a1=exp(-1.414*3.14159 / ortalamauzunluk)
    b1=2*a1*cos(1.414*3.14159 / ortalamauzunluk)
    c2=b1
    c3=(-a1)*a1
    c1=1 - c2 - c3
    s12=0.0
    s12:=c1*(guncelfiyat + nz(guncelfiyat[1])) / 2 + c2*nz(s12[1]) + c3*nz(s12[2])
    
//Elastic Volume Weighted Moving Average
sm13(guncelfiyat,ortalamauzunluk) =>
    hacimtoplam=sum(volume, ortalamauzunluk)
    s13=0.0
    s13:=(nz(s13[1]) * (hacimtoplam - volume)/hacimtoplam) + (volume*guncelfiyat/hacimtoplam)

ortalamafiyat=smox=="T3"?sm0(guncelfiyat,ortalamauzunluk,f) : smox=="SMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="EMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="DEMA"?sm3(guncelfiyat,ortalamauzunluk) : smox=="TEMA"?sm4(guncelfiyat,ortalamauzunluk) : smox=="WMA"?sm5(guncelfiyat,ortalamauzunluk) : smox=="VWMA"?sm6(guncelfiyat,ortalamauzunluk) : smox=="SMMA"?sm7(guncelfiyat,ortalamauzunluk) : smox=="HullMA"?sm8(guncelfiyat,ortalamauzunluk) : smox=="HulleMA"?sm81(guncelfiyat,ortalamauzunluk) : smox=="LSMA"?sm9(guncelfiyat,ortalamauzunluk,offsig) : smox=="ALMA"?sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) : smox=="TMA"?sm11(guncelfiyat,ortalamauzunluk) : smox=="SSMA"?sm12(guncelfiyat,ortalamauzunluk) : smox=="EVWMA"?sm13(guncelfiyat,ortalamauzunluk) : guncelfiyat

/////MOST'u hesaplama/////
stopfiyat=ortalamafiyat*yuzde
mostfiyat=0.0
mostfiyat:=iff(ortalamafiyat>nz(mostfiyat[1],0) and ortalamafiyat[1]>nz(mostfiyat[1],0),max(nz(mostfiyat[1],0),ortalamafiyat-stopfiyat),iff(ortalamafiyat<nz(mostfiyat[1],0) and ortalamafiyat[1]<nz(mostfiyat[1],0),min(nz(mostfiyat[1],0),ortalamafiyat+stopfiyat),iff(ortalamafiyat>nz(mostfiyat[1],0),ortalamafiyat-stopfiyat,ortalamafiyat+stopfiyat)))

mostcolor=ortalamafiyat>mostfiyat?lime:fuchsia
plot(mostfiyat, color=mostcolor, linewidth=4, title="Most-fiyat")

/////AL-SAT LONG-SHORT girislerini belirleme/////
long=ortalamafiyat>mostfiyat and ortalamafiyat[1]<mostfiyat[1]
short=ortalamafiyat<mostfiyat and ortalamafiyat[1]>mostfiyat[1]
if (long) 
    strategy.entry("AL-Long", strategy.long, when = zamanaraligi())
if (short) 
    strategy.entry("SAT-Short", strategy.short, when = zamanaraligi())

Больше