Strategi kombinasi pola rata-rata pergerakan dan pola kandil mengikuti tren


Tanggal Pembuatan: 2024-02-02 17:53:43 Akhirnya memodifikasi: 2024-02-02 17:53:43
menyalin: 0 Jumlah klik: 717
1
fokus pada
1617
Pengikut

Strategi kombinasi pola rata-rata pergerakan dan pola kandil mengikuti tren

Ringkasan

Strategi ini menggabungkan metode moving average untuk menentukan arah tren dan K-line shape untuk menentukan titik balik, dan memungkinkan perdagangan untuk melacak tren. Strategi ini pertama-tama menggunakan moving average untuk menentukan arah tren secara keseluruhan, dan kemudian mencari potensi K-line shape reversal di arah tren sebagai sinyal masuk, sehingga dapat melacak tren berjalan.

Prinsip Strategi

Strategi menggunakan rata-rata bergerak sederhana dengan panjang 10 hari untuk menentukan arah tren harga. Ketika harga lebih tinggi dari rata-rata bergerak, dianggap dalam tren naik; Ketika harga lebih rendah dari rata-rata bergerak, dianggap dalam tren turun.

Setelah menentukan arah tren, strategi akan menilai titik balik tren potensial berdasarkan serangkaian bentuk garis K dan garis K. Bentuk garis matahari yang umum meliputi bintang menyala, bintang pagi, tiga prajurit putih, dan lain-lain. Bentuk garis gelap yang umum meliputi bintang senja, tiga burung gagak, dan lain-lain.

Selain itu, strategi ini juga menggabungkan titik-titik dukungan dan resistensi utama untuk menentukan harga masuk yang spesifik. Jika Anda membeli di bawah tren naik, Anda akan membeli ketika Anda menembus dukungan pertama.

Keunggulan Strategis

Keuntungan terbesar dari strategi ini adalah kombinasi dari penilaian tren dan sinyal reversal, yang memungkinkan untuk menangkap titik-titik perubahan tren tepat waktu, dan memungkinkan untuk menjalankan pelacakan tren. Strategi ini dapat meningkatkan probabilitas keuntungan secara signifikan dibandingkan dengan strategi rata-rata bergerak sederhana.

Selain itu, strategi untuk memasukkan penilaian bentuk K juga meningkatkan kemampuan untuk menangani kejadian yang tidak terduga. Dalam pasar, bentuk K dapat berperan sebagai penyaring ketika terjadi peristiwa probabilitas rendah yang menyebabkan terobosan palsu, untuk menghindari perdagangan yang salah.

Risiko Strategis

Risiko utama dari strategi ini adalah keakuratan pengaturan parameter moving average dan penilaian K-line. Jika pengaturan siklus moving average tidak tepat, itu akan menyebabkan kesalahan dalam penilaian tren; Jika ada kesalahan dalam penilaian K-line, itu juga akan menyebabkan kesalahan dalam keputusan perdagangan.

Selain itu, reversal K-line tidak 100% memastikan bahwa tren akan berbalik, sehingga strategi ini memiliki risiko tertentu. Strategi ini mungkin akan membawa kerugian yang lebih besar ketika pasar mengalami reversal yang lebih luas.

Arah optimasi

Strategi ini masih memiliki ruang yang cukup besar untuk pengoptimalan. Misalnya, parameter untuk menyesuaikan rata-rata bergerak secara dinamis dapat dipertimbangkan, dengan siklus rata-rata bergerak yang berbeda pada tahap pasar yang berbeda.

Selain itu, Anda juga dapat mempertimbangkan untuk menambahkan lebih banyak faktor untuk menilai tren dan area panas, seperti perubahan volume perdagangan, indikator volatilitas, dan lain-lain, untuk membuat strategi lebih komprehensif dan solid.

Meringkaskan

Strategi ini secara keseluruhan sangat cocok untuk melacak tren pasar saham dalam jangka menengah, dan dapat menghasilkan keuntungan stabil yang lebih tinggi. Jika dioptimalkan lebih lanjut, ini diharapkan menjadi strategi kuantitatif yang bekerja dengan baik. Jika investor menguasai penggunaan strategi ini, mereka juga dapat menggunakannya untuk membangun portofolio jangka panjang, untuk mengendalikan risiko saham individu sambil mendapatkan keuntungan tambahan yang lebih baik.

Kode Sumber Strategi
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trend Following Strategy with Candlestick Patterns", overlay=true)

// Moving Average
ma_period = input(10, title="Moving Average Period")
moving_average = ta.sma(close, ma_period)

// Candlestick Patterns
// Custom Function
abs(x) => x >= 0 ? x : -x

// Candlestick Patterns
isDoji() =>
    (close - open) <= (high - low) * 0.1

isMarubozuWhite() =>
    close == high and open == low and close > open

isHammer() =>
    (high - low) >= 3 * abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and (open - low) / (0.001 + high - low) > 0.6

isInvertedHammer() =>
    (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

isLongLowerShadow() =>
    (low - close) > 2 * abs(open - close) and (low - open) / (0.001 + high - low) > 0.6

isUpsideTasukiGap() =>
    close[1] < open[1] and open > close and open > close[1] and close < open[1]

isRisingWindow() =>
    high[1] < low and close > open

isPiercing() =>
    close[1] < open[1] and close > open and close > ((open + low) / 2) and close < open[1] and open < close[1]

isBullishEngulfing() =>
    close[1] < open[1] and close > open and high > high[1] and low < low[1]

isTweezerBottom() =>
    low == ta.valuewhen(low == ta.lowest(low, 10), low, 0) and low == ta.valuewhen(low == ta.lowest(low, 20), low, 0)

isBullishAbandonedBaby() =>
    close[2] < open[2] and close[1] > open[1] and low[1] > ta.valuewhen(high == ta.highest(high, 2), high, 0) and open > close and close > ta.valuewhen(high == ta.highest(high, 2), high, 0)

isMorningStar() =>
    close[2] < open[2] and close[1] < open[1] and close > open[1] and open < close[2] and open > close[1]

isMorningDojiStar() =>
    close[2] < open[2] and close[1] < open[1] and isDoji() and close > open[1] and open < close[2] and open > close[1]

isDragonflyDoji() =>
    isDoji() and (high - close) / (0.001 + high - low) < 0.1 and (open - low) / (0.001 + high - low) > 0.6

isThreeWhiteSoldiers() =>
    close[2] < open[2] and close[1] < open[1] and close > open and open < close[2] and open < close[1] and close > open[1]

isRisingThreeMethods() =>
    close[4] < open[4] and close[1] < open[1] and close > open and open < close[4] and open < close[1] and close > open[1]

isMarubozuBlack() =>
    close == low and open == high and open > close

isGravestoneDoji() =>
    isDoji() and (close - low) / (0.001 + high - low) < 0.1 and (high - open) / (0.001 + high - low) > 0.6

isHangingMan() =>
    (high - low) >= 4 * abs(open - close) and (open - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

isLongUpperShadow() =>
    (high - open) > 2 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6

isDownsideTasukiGap() =>
    close[1] > open[1] and open < close and open < close[1] and close > open[1]

isFallingWindow() =>
    low[1] > high and close < open

isDarkCloudCover() =>
    close[1] > open[1] and close < open and close < ((open + high) / 2) and close > open[1] and open > close[1]

isBearishEngulfing() =>
    close[1] > open[1] and close < open and high > high[1] and low < low[1]

isTweezerTop() =>
    high == ta.valuewhen(high == ta.highest(high, 10), high, 0) and high == ta.valuewhen(high == ta.highest(high, 20), high, 0)

isAbandonedBaby() =>
    close[2] > open[2] and close[1] < open[1] and high[1] < ta.valuewhen(low == ta.lowest(low, 2), low, 0) and open < close and close < ta.valuewhen(low == ta.lowest(low, 2), low, 0)

isEveningDojiStar() =>
    close[2] > open[2] and close[1] > open[1] and isDoji() and close < open[1] and open > close[2] and open < close[1]

isEveningStar() =>
    close[2] > open[2] and close[1] > open[1] and close < open[1] and open > close[2] and open < close[1]

isThreeBlackCrows() =>
    close[2] > open[2] and close[1] > open[1] and close < open and open > close[2] and open > close[1] and close < open[1]

isFallingThreeMethods() =>
    close[4] > open[4] and close[1] > open

isShootingStar() =>
    (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

doji = isDoji()
marubozuWhite = isMarubozuWhite()
hammer = isHammer()
invertedHammer = isInvertedHammer()
longLowerShadow = isLongLowerShadow()
upsideTasukiGap = isUpsideTasukiGap()
risingWindow = isRisingWindow()
piercing = isPiercing()
bullishEngulfing = isBullishEngulfing()
tweezerBottom = isTweezerBottom()
bullishAbandonedBaby = isBullishAbandonedBaby()
morningStar = isMorningStar()
morningDojiStar = isMorningDojiStar()
dragonflyDoji = isDragonflyDoji()
threeWhiteSoldiers = isThreeWhiteSoldiers()
risingThreeMethods = isRisingThreeMethods()
marubozuBlack = isMarubozuBlack()
gravestoneDoji = isGravestoneDoji()
hangingMan = isHangingMan()
longUpperShadow = isLongUpperShadow()
downsideTasukiGap = isDownsideTasukiGap()
fallingWindow = isFallingWindow()
darkCloudCover = isDarkCloudCover()
bearishEngulfing = isBearishEngulfing()
tweezerTop = isTweezerTop()
abandonedBaby = isAbandonedBaby()
eveningDojiStar = isEveningDojiStar()
eveningStar = isEveningStar()
threeBlackCrows = isThreeBlackCrows()
fallingThreeMethods = isFallingThreeMethods()
shootingStar = isShootingStar()
isBullishPattern() =>
    (isMarubozuWhite() or isHammer() or isInvertedHammer() or isDoji() or isMorningStar() or isBullishEngulfing() or isThreeWhiteSoldiers() or isMarubozuBlack() or isHangingMan() or isDownsideTasukiGap() or isDarkCloudCover())

isBearishPattern() =>
    (isMarubozuBlack() or isInvertedHammer() or isLongUpperShadow() or isTweezerTop() or isGravestoneDoji() or isEveningStar() or isBearishEngulfing() or isThreeBlackCrows() or isShootingStar())

isBullishCandle = isBullishPattern()
isBearishCandle = isBearishPattern()

// Calculate Pivot Points
pivotPoint(high, low, close) =>
    (high + low + close) / 3

r1 = pivotPoint(high[1], low[1], close[1]) * 2 - low[1]
s1 = pivotPoint(high[1], low[1], close[1]) * 2 - high[1]

r2 = pivotPoint(high[1], low[1], close[1]) + (high[1] - low[1])
s2 = pivotPoint(high[1], low[1], close[1]) - (high[1] - low[1])

r3 = high[1] + 2 * (pivotPoint(high[1], low[1], close[1]) - low[1])
s3 = low[1] - 2 * (high[1] - pivotPoint(high[1], low[1], close[1]))
// Trend Identification
is_uptrend = close > moving_average
is_downtrend = close < moving_average
// Entry and Exit Conditions with Trend Identification
enterLong = is_uptrend and isBullishCandle and close > r1
exitLong = is_uptrend and (bearishEngulfing or doji or close < s1)

enterShort = is_downtrend and isBearishCandle and close < s1
exitShort = is_downtrend and (bullishEngulfing or doji or close > r1)



// Strategy Execution
if enterLong and strategy.position_size == 0 and strategy.position_size[1] == 0 and close > r1
    strategy.entry("Buy", strategy.long, qty=1)

if exitLong and strategy.position_size > 0
    strategy.close("Buy")

if enterShort and strategy.position_size == 0 and close < s1
    strategy.entry("Sell", strategy.short, qty=1)

if exitShort and strategy.position_size < 0
    strategy.close("Sell")


// Stop-Loss and Trailing Stop-Loss
stop_loss_pct = input(2.0, title="Stop Loss Percentage")
trailing_stop_loss_pct = input(1.0, title="Trailing Stop Loss Percentage")
trailing_stop_loss_active = input(true, title="Trailing Stop Loss Active")

// Stop-Loss
stop_loss_level = strategy.position_avg_price * (1 - stop_loss_pct / 100)
strategy.exit("Stop Loss", "Buy", loss=stop_loss_level)

// Trailing Stop-Loss


// Plotting Moving Average
plot(moving_average, color=color.blue, title="Moving Average", linewidth=2)

// Plotting Candlestick Patterns
plotshape(isBullishCandle, title="Bullish Candle", location=location.belowbar, color=color.green, style=shape.labelup)
plotshape(isBearishCandle, title="Bearish Candle", location=location.abovebar, color=color.red, style=shape.labeldown)

// Plotting Support and Resistance Levels
//hline(r1, "Resistance Level 1", color=color.red, linestyle=hline.style_dotted)
//hline(s1, "Support Level 1", color=color.green, linestyle=hline.style_dotted)