Strategi Penangkapan Rata-rata Pergerakan Eksponensial Ganda


Tanggal Pembuatan: 2023-12-13 15:28:50 Akhirnya memodifikasi: 2023-12-13 15:28:50
menyalin: 0 Jumlah klik: 618
1
fokus pada
1621
Pengikut

Strategi Penangkapan Rata-rata Pergerakan Eksponensial Ganda

Ringkasan

Strategi ini menggunakan indikator rata-rata indeks ganda untuk menentukan arah tren pasar, dikombinasikan dengan indikator Bollinger Bands untuk menentukan fenomena overbought oversold, mencapai low buy high sell, dan profit exit.

Prinsip Strategi

Strategi ini menggunakan rata-rata indeks ganda untuk menilai pergerakan pasar secara keseluruhan, dan Brin untuk menilai waktu masuk tertentu.

Cara operasi rata-rata indeks ganda adalah dengan menghitung rata-rata indeks jangka pendek dan jangka panjang, masing-masing, ketika garis jangka pendek dari bawah ke atas menembus garis jangka panjang menjadi sinyal bullish; ketika garis jangka pendek dari atas ke bawah menembus garis jangka panjang, menjadi sinyal bullish.

Indikator Brin-band menentukan apakah harga berada dalam keadaan overbought atau oversold. Brin-band adalah rata-rata bergerak dari harga penutupan n hari dan bandwidth adalah selisih standar dari n hari sebelum rata-rata bergerak. Harga mendekati tren atas sebagai overbought dan mendekati tren bawah sebagai oversold.

Aturan kebijakan ini adalah: Ketika garis rata-rata pendek dari bawah ke atas menembus garis rata-rata panjang, dan harga close breaks Brin band di atas rel, lakukan lebih banyak; Ketika garis rata-rata pendek dari atas ke bawah menembus garis rata-rata panjang, dan harga close breaks Brin band di bawah rel, lakukan kosong.

Stop loss setelah melakukan over adalah harga terendah dalam n hari sebelumnya, dan stop loss adalah 1,6 kali harga pembukaan posisi; stop loss setelah melakukan shorting adalah harga tertinggi dalam n hari sebelumnya, dan stop loss adalah 1,6 kali harga pembukaan posisi.

Selain itu, strategi ini juga mempertimbangkan indikator EMA overhead untuk menilai tren keseluruhan dan menghindari posisi berlawanan.

Analisis Keunggulan

  1. Dengan menggunakan rata-rata indeks ganda untuk menilai tren keseluruhan, Binance menilai titik jual beli tertentu, dan indikatornya sesuai.
  2. Membuat harga terendah n hari sebelum stop loss dan harga terendah n hari sebelum stop loss untuk mengurangi probabilitas stop loss yang dikejar;
  3. Stop-loss menggunakan harga 1,6 kali lipat dari harga bukaan, yang memungkinkan untuk mendapatkan keuntungan yang cukup;
  4. Mempertimbangkan indikator tren EMA secara keseluruhan, menghindari posisi berlawanan, dapat mengurangi kerugian sistemik.

Analisis risiko

  1. Optimasi parameter Brin-band yang tidak tepat dapat menyebabkan frekuensi transaksi yang terlalu tinggi atau sinyal yang jarang;
  2. Stop loss yang terlalu longgar dapat menyebabkan kerugian yang lebih besar.
  3. Jika Anda terlalu santai, Anda bisa melewatkan makanan yang lebih lezat.

Mengoptimalkan kombinasi parameter Brin untuk risiko tersebut, menguji berbagai tingkat stop loss, dan memilih parameter yang optimal.

Arah optimasi

  1. Optimalkan parameter Brin untuk mencari kombinasi parameter yang optimal;
  2. Pengujian parameter stop loss yang berbeda untuk mengurangi kemungkinan stop loss yang diderita.
  3. Uji berbagai parameter stop loss multiplier untuk mendapatkan keuntungan yang lebih besar.

Meringkaskan

Strategi ini menggunakan rata-rata indeks ganda untuk menilai tren pasar secara keseluruhan, Brin band untuk menilai waktu jual beli tertentu, dan berkinerja baik dalam data retrospeksi. Efek yang lebih baik diharapkan diperoleh melalui pengoptimalan parameter dan modifikasi aturan.

Kode Sumber Strategi
/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-06 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This close code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AugustoErni

//@version=5
strategy('Bollinger Bands Modified (Stormer)', overlay=true)

bbL                   = input.int(20, title='BB Length/Comprimento da Banda de Bollinger', minval=1, step=1, tooltip='Calculate the length of bollinger bands./Calcula o comprimento das bandas de bollinger.')
mult                  = input.float(0.38, title='BB Standard Deviation/Desvio Padrão da Banda de Bollinger', minval=0.01, step=0.01, tooltip='Calculate the standard deviation of bollinger bands./Calcula o desvio padrão das bandas de bollinger.')
emaL                  = input.int(80, title='EMA Length/Comprimento da Média Móvel Exponencial', minval=1, step=1, tooltip='Calculate the length of EMA./Calcula o comprimento da EMA.')
highestHighL          = input.int(7, title='Highest High Length/Comprimento da Alta Maior', minval=1, step=1, tooltip='Fetches the highest high candle from length input. Use to set stop loss for short position./Obtém a vela de maior alta com base na medida fornecida. Usa para definir o stop loss para uma posição curta.')
lowestLowL            = input.int(7, title='Lowest Low Length/Comprimento da Baixa Menor', minval=1, step=1, tooltip='Fetches the lowest low candle from length input. Use to set stop loss for long position./Obter a vela de menor baixa com base na medida fornecida. Usa para definir o stop loss para uma posição longa.')
targetFactor          = input.float(1.6, title='Target Take Profit/Objetivo de Lucro Alvo', minval=0.1, step=0.1, tooltip='Calculate the take profit factor when entry position./Calcula o fator do alvo lucro ao entrar na posição.')
emaTrend              = input.bool(true, title='Check Trend EMA/Verificar Tendência da Média Móvel Exponencial', tooltip='Use EMA as trend verify for opening position./Usa a EMA como verificação de tendência para abrir posição.')
crossoverCheck        = input.bool(false, title='Add Another Crossover Check/Adicionar Mais uma Verificação de Cruzamento Superior', tooltip='This option is to add one more veryfication attempt to check if price is crossover upper bollinger band./Esta opção é para adicionar uma verificação adicional para avaliar se o preço cruza a banda superior da banda de bollinger.')
crossunderCheck       = input.bool(false, title='Add Another Crossunder Check/Adicionar Mais uma Verificação de Cruzamento Inferior', tooltip='This option is to add one more veryfication attempt to check if price is crossunder lower bollinger band./Esta opção é para adicionar uma verificação adicional para avaliar se o preço cruza a banda inferior da banda de bollinger.')
insideBarPatternCheck = input.bool(true, title='Show Inside Bar Pattern/Mostrar Padrão de Inside Bar', tooltip='This option is to show possible inside bar pattern./Esta opção é para mostrar um possível padrão de inside bar.')

[middle, upper, lower] = ta.bb(close, bbL, mult)
ema                    = ta.ema(close, emaL)
highestHigh            = ta.highest(high, highestHighL)
lowestLow              = ta.lowest(low, lowestLowL)
isCrossover            = ta.crossover(close, upper) ? 1 : 0
isCrossunder           = ta.crossunder(close, lower) ? 1 : 0

isPrevBarHighGreaterCurBarHigh = high[1] > high ? 1 : 0
isPrevBarLowLesserCurBarLow    = low[1] < low ? 1 : 0
isInsideBar                    = isPrevBarHighGreaterCurBarHigh and isPrevBarLowLesserCurBarLow ? 1 : 0

isBarLong  = ((close - open) > 0) ? 1 : 0
isBarShort = ((close - open) < 0) ? 1 : 0

isLongCross  = crossoverCheck ? ((isBarLong and not isBarShort) and (open < upper and close > upper)) ? 1 : 0 : isCrossover ? 1 : 0
isShortCross = crossunderCheck ? ((isBarShort and not isBarLong) and (close < lower and open > lower)) ? 1 : 0 : isCrossunder ? 1 : 0

isCandleAboveEma = close > ema ? 1 : 0
isCandleBelowEma = close < ema ? 1 : 0

isLongCondition  = emaTrend ? isLongCross and isCandleAboveEma ? 1 : 0 : isLongCross
isShortCondition = emaTrend ? isShortCross and isCandleBelowEma ? 1 : 0 : isShortCross

isPositionNone  = strategy.position_size == 0 ? 1 : 0
isPositionLong  = strategy.position_size > 0 ? 1 : 0
isPositionShort = strategy.position_size < 0 ? 1 : 0

var float enterLong     = 0.0
var float stopLossLong  = 0.0
var float targetLong    = 0.0
var float enterShort    = 0.0
var float stopLossShort = 0.0
var float targetShort   = 0.0
var bool isLongEntry    = false
var bool isShortEntry   = false

if (isPositionNone)
    isLongEntry   := false
    isShortEntry  := false
    enterLong     := 0.0
    stopLossLong  := 0.0
    targetLong    := 0.0
    enterShort    := 0.0
    stopLossShort := 0.0
    targetShort   := 0.0
if (isPositionShort or isPositionNone)
    isLongEntry  := false
    enterLong    := 0.0
    stopLossLong := 0.0
    targetLong   := 0.0
if (isPositionLong or isPositionNone)
    isShortEntry  := false
    enterShort    := 0.0
    stopLossShort := 0.0
    targetShort   := 0.0
if (isPositionLong and isLongEntry)
    isLongEntry   := true
    isShortEntry  := false
    enterShort    := 0.0
    stopLossShort := 0.0
    targetShort   := 0.0
if (isPositionShort and isShortEntry)
    isShortEntry := true
    isLongEntry  := false
    enterLong    := 0.0
    stopLossLong := 0.0
    targetLong   := 0.0

if (isLongCondition and not isLongEntry)
    isLongEntry  := true
    enterLong    := close
    stopLossLong := lowestLow
    targetLong   := (enterLong + (math.abs(enterLong - stopLossLong) * targetFactor))
    alertMessage = '{ "side/lado": "buy", "entry/entrada": ' + str.tostring(enterLong) + ', "stop": ' + str.tostring(stopLossLong) + ', "target/alvo": ' + str.tostring(targetLong) + ' }'
    alert(alertMessage)
    strategy.entry('Long', strategy.long)
    strategy.exit('Exit Long', 'Long', stop=stopLossLong, limit=targetLong)

if (isShortCondition and not isShortEntry)
    isShortEntry  := true
    enterShort    := close
    stopLossShort := highestHigh
    targetShort   := (enterShort - (math.abs(enterShort - stopLossShort) * targetFactor))
    alertMessage = '{ "side/lado": "sell", "entry/entrada": ' + str.tostring(enterShort) + ', "stop": ' + str.tostring(stopLossShort) + ', "target/alvo": ' + str.tostring(targetShort) + ' }'
    alert(alertMessage)
    strategy.entry('Short', strategy.short)
    strategy.exit('Exit Short', 'Short', stop=stopLossShort, limit=targetShort)

plot(upper, title='Upper Band', color=color.blue)
plot(middle, title='Middle Band', color=color.gray)
plot(lower, title='Lower Band', color=color.blue)
plot(ema, title='EMA', color=color.white)

barcolor(insideBarPatternCheck and isInsideBar and isBarLong ? color.lime : insideBarPatternCheck and isInsideBar and isBarShort ? color.maroon : na, title='Inside Bar Color in Long Bar Long and in Short Bar Short/Cor do Inside Bar em Barra Longa Longa e em Barra Curta Curta')

tablePosition    = position.bottom_right
tableColumns     = 2
tableRows        = 5
tableFrameWidth  = 1
tableBorderColor = color.gray
tableBorderWidth = 1

tableInfoTrade = table.new(position=tablePosition, columns=tableColumns, rows=tableRows, frame_width=tableFrameWidth, border_color=tableBorderColor, border_width=tableBorderWidth)

table.cell(table_id=tableInfoTrade, column=0, row=0)
table.cell(table_id=tableInfoTrade, column=1, row=0)

table.cell(table_id=tableInfoTrade, column=0, row=1, text='Entry Side/Lado da Entrada', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=0, row=2, text=isLongEntry ? 'LONG' : isShortEntry ? 'SHORT' : 'NONE/NENHUM', text_color=color.yellow)

table.cell(table_id=tableInfoTrade, column=1, row=1, text='Entry Price/Preço da Entrada', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=1, row=2, text=isLongEntry ? str.tostring(enterLong) : isShortEntry ? str.tostring(enterShort) : 'NONE/NENHUM', text_color=color.blue)

table.cell(table_id=tableInfoTrade, column=0, row=3, text='Take Profit Price/Preço Alvo Lucro', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=0, row=4, text=isLongEntry ? str.tostring(targetLong) : isShortEntry ? str.tostring(targetShort) : 'NONE/NENHUM', text_color=color.green)

table.cell(table_id=tableInfoTrade, column=1, row=3, text='Stop Loss Price/Preço Stop Loss', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=1, row=4, text=isLongEntry ? str.tostring(stopLossLong) : isShortEntry ? str.tostring(stopLossShort) : 'NONE/NENHUM', text_color=color.red)