Количественная торговая стратегия с двунаправленным пересечением EMA


Дата создания: 2024-01-24 17:31:41 Последнее изменение: 2024-01-24 17:31:41
Копировать: 0 Количество просмотров: 602
1
Подписаться
1617
Подписчики

Количественная торговая стратегия с двунаправленным пересечением EMA

Обзор

Эта стратегия использует двусторонние показатели EMA для определения основных тенденций рынка и в сочетании с показателями RSI в качестве выбора времени входа в рынок.

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

  1. Вычисление средних линий ЭМА для нескольких групп различных периодов и определение основных направлений тенденций рынка в трех измерениях: краткосрочной, среднесрочной и долгосрочной
  2. Когда краткосрочная EMA пересекает средне- и долгосрочную EMA, она определяется как позитивный тренд.
  3. Когда краткосрочная EMA пересекает среднесрочную EMA, она определяется как нисходящая
  4. В сочетании с RSI, чтобы найти подходящий момент для входа, RSI может быть использован для определения зоны перепродажи
  5. При понижении RSI занимает позиции, а при повышении RSI - позиции

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

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

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

  1. Использование множества средних ниток EMA для определения основных направлений тенденций рынка в нескольких временных измерениях
  2. Простые в подсчете, менее шумные и надежные в определении основных тенденций рынка
  3. RSI эффективно определяет точки входа и остановки, что позволяет значительно оптимизировать стратегию прибыли и отступления
  4. Ясная структура алгоритмов, легко понятные изменения, типичные для стратегий слежения за тенденциями
  5. Гибкость в сочетании с другими техническими показателями для дальнейшего повышения эффективности стратегии

Анализ стратегических рисков

В этой стратегии есть определенные риски, которые проявляются в следующих аспектах:

  1. Стоп-стоп может быть слишком идеализированным, что приводит к увеличению убытков при обратном тренде.
  2. Невозможность эффективно оценить переломный момент, возможно, упущенная возможность вовремя остановить убыток
  3. EMA и RSI параметры требуют многократного тестирования и оптимизации, иначе могут привести к нестабильности
  4. Нельзя гарантировать, что каждый вход будет идеальным, что может привести к ненужным повторениям.
  5. Взрыв в воздухе под воздействием внезапных событий не может быть эффективно избегнут

Для оптимизации этих рисков используются следующие подходы:

  1. Разумная установка стоп-пойнтов для предотвращения чрезмерных одноразовых потерь
  2. Добавление других показателей для определения обратного тренда и обеспечения своевременного остановки убытков
  3. Оптимизация набора параметров для более широких рыночных условий
  4. Изменение логики входа и остановки, уменьшение количества повторных операций
  5. Повышение оценки аномальных ситуаций, чтобы избежать негативных последствий рыночных скачков

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

Из преимуществ и рисков данной стратегии можно вывести несколько оптимизируемых направлений:

  1. Введение других показателей, таких как MACD, BOLL и т. Д., на существующую структуру двойных EMA, которые могут быть использованы для определения точек обратного тренда и оптимизации стратегии стоп-стоп
  2. Внедрение моделей машинного обучения для прогнозирования вероятности обратного тренда и дальнейшего повышения эффективности стратегии
  3. Применение передовых фильтров, автоматически идентифицирующих аномальные ситуации, эффективно предотвращающих потери
  4. Использование генетических алгоритмов, глубокого реинструированного обучения и других методов для автоматической оптимизации параметров и адаптации стратегий к более широкому кругу рынков
  5. Добавление модуля автоматического остановки, который позволяет динамически регулировать остановку в зависимости от реальной ситуации

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

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

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

Исходный код стратегии
/*backtest
start: 2023-01-23 00:00:00
end: 2024-01-23 00:00:00
period: 4h
basePeriod: 15m
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/
// © Investoz
// Indikatorn är byggd som ett utbildningsyfte och är därför ingen rekommendation för köp/sälj av aktier. Tanken är att skapa en visuell form i en graf
// som visar om det finns någon trend såväl positiv som negativ. En dialogruta med en varning talar om vilken trend som råder. I koden finns en möjlighet
// att ta position eller gå ur position om man vill skapa en startegi kring denna trendindikator. Rekommenderar dock starkt att inte enbart förlita sig på denna
// indikator som beslut för köp/sälj då resultaten blir negativa om man köper på psoitiv trend och säljer på negativ trend. Det måste kombineras med andra idéer
// och därför fungerar denna skript mer som ett komplement till sin egen strategi.
// Det är fritt fram för vem som helst att använda sig av denna indikator.  
//@version=4
//Skapar en strategiskript med 5 % av eget kapital som ett exempel. Detta går att ändra i skriptets inställningar, välj egenskaper och sedan ändra orderstorlek
//till ett annat värde av % på eget kapital.
strategy("© Investoz trendvarningar", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
//Lägger till inmatningar till skriptindikatorn. Användaren kan se och redigera inmatningar i objektdialogen efter eget val.
ema1 = input(21, minval=1, maxval=500, title="Lila linje")
valema1=input(true, title="Visa lila linje")
ema2 = input(34, minval=1, maxval=500, title="Blå linje")
valema2=input(true, title="Visa blå linje")
ema3 = input(55, minval=1, maxval=500, title="Grön linje")
valema3=input(true, title="Visa grön linje")
ema4 = input(89, minval=1, maxval=500, title="Gul linje")
valema4=input(true, title="Visa gul linje")
ema5 = input(141, minval=1, maxval=500, title="Orange linje")
valema5=input(true, title="Visa orange linje")
ema6 = input(230, minval=1, maxval=500, title="Röd linje")
valema6=input(true, title="Visa röd linje")
ema7 = input(371, minval=1, maxval=500, title="Röd linje")
valema7=input(true, title="Visa röd linje")
//Inmatningar för antal staplar
startbar = input(1, minval=1, maxval=1, title="Första stapeln")
Endbar = bar_index
//Källa input, stängning. Användaren kan själv byta till vilken källa som önskas.
src = input(close, title="Source")
//Antal staplar sedan den längsta ema började och framåt. 
tid=Endbar + startbar - 371
//EMA loop
aema1 = ema(src, ema1)
bema2 = ema(src, ema2)
cema3 = ema(src, ema3)
dema4 = ema(src, ema4)
eema5 = ema(src, ema5)
fema6 = ema(src, ema6)
gema7 = ema(src, ema7)
//Skriver ut linjer i diagrammet om förhållandet är sant, annars falskt.
h=plot(valema1 ? aema1 : na, title="Lila linje", style=plot.style_line, linewidth=1, color=color.purple)
i=plot(valema2 ? bema2 : na, title="Blå linje", style=plot.style_line, linewidth=1, color=color.blue)
j=plot(valema3 ? cema3 : na, title="Grön linje", style=plot.style_line, linewidth=1, color=color.green)
k=plot(valema4 ? dema4 : na, title="Gul linje", style=plot.style_line, linewidth=1, color=color.yellow)
l=plot(valema5 ? eema5 : na, title="Orange linje", style=plot.style_line, linewidth=1, color=color.orange)
m=plot(valema6 ? fema6 : na, title="Röd linje", style=plot.style_line, linewidth=1, color=color.red)
n=plot(valema7 ? gema7 : na, title="Brun linje", style=plot.style_line, linewidth=1, color=color.maroon)
//Fyller bakgrunden mellan två linjer med en viss färg.
fill(h, i, color = color.purple,transp=34)
fill(i, j, color = color.blue,transp=34)
fill(j, k, color = color.green,transp=34)
fill(k, l, color = color.yellow,transp=34)
fill(l, m, color = color.orange,transp=34)
fill(m, n, color = color.red,transp=34)
//Skapa en algoritm för positiv trend
PositivTrend = crossover(aema1,gema7)?1:0
TrendPositiv = ema(close,1) > aema1 and aema1 > bema2?1:0
//Skapa en algoritm för negativ trend
NegativTrend = crossunder(aema1,gema7)?1:0
TrendNegativ = ema(close,1) < aema1 and aema1 < bema2?1:0
//Skapar en textruta med varningstext för positiv trend
varningtextpositiv = "Varning för positiv trend."+"\n" + "Leta efter att ta position!"
// if PositivTrend
//     varningpositiv=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.green,
//      text=varningtextpositiv,
//      style=label.style_label_down,
//      textalign=text.align_left)
//Skapar en textruta med varningstext för negativ trend
varningtextnegativ = "Varning för negativ trend."+"\n" + "Leta efter utgången!"
// if NegativTrend
//     varningnegativ=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.red,
//      text=varningtextnegativ,
//      style=label.style_label_up,
//      textalign=text.align_left)
//Köp om positiv trend
if (PositivTrend) 
    strategy.entry("Ta position", strategy.long, when = PositivTrend)
//Sälj om negativ trend
if (NegativTrend)
    strategy.close("Ta position", when = NegativTrend, comment="Gå ur position")
//Beräkning av positiv trend
vspositiv(positiv)=>valuewhen(Endbar==startbar,positiv,0)
vepositiv(positiv)=>valuewhen(Endbar==Endbar,positiv,0)
positivmean(TrendPositiv)=>
    csumpositiv = cum(TrendPositiv)
//Slut//   
    a = vepositiv(csumpositiv)
//Start//
    b = vspositiv(csumpositiv)
//Slut - Start// 
    (a - b)/(tid)
positivmeanpositiv = positivmean(TrendPositiv) 
//Beräkning av negativ trend
vsnegativ(negativ)=>valuewhen(Endbar==startbar,negativ,0)
venegativ(negativ)=>valuewhen(Endbar==Endbar,negativ,0)
negativmean(TrendNegativ)=>
    csumnegativ = cum(TrendNegativ)
//Slut//   
    a = venegativ(csumnegativ)
//Start//
    b = vsnegativ(csumnegativ)
//Slut - Start// 
    (a - b)/(tid)
negativmeannegativ = negativmean(TrendNegativ) 
//Inmatning av text som ska in i texruta som visar antal staplar i trend
logga = "© Investoz: Trend i tid"+ "\n"
streck = "--------------------------------------------------------"
totalastaplar = "\n" + "Dagar totalt: " + tostring(tid)+ " dagar "+"\n"+ streck + "\n"
totalpositiv = "Dagar totalt i positiv trend "+" 📈 : "  +tostring(positivmeanpositiv*tid, "##.##") +" dagar " + "\n"
totalnegativ = "\n" + "Dagar totalt i negativ trend" + " 📉 : "  +tostring(negativmeannegativ*tid, "##.##") +" dagar " 
//Textruta för antal staplar i trend
// if barstate.ishistory
//     barcountlbl=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.yellow,
//      text=logga+streck+totalastaplar+totalpositiv+streck+totalnegativ,
//      style=label.style_label_lower_left,
//      textalign=text.align_left)
//     label.delete(barcountlbl[1])
//////////////////////////////////