Strategi perdagangan kuantitatif yang efisien berdasarkan rentang harga dan terobosan

Pivot CONSOLIDATION ZONE BREAKOUT
Tanggal Pembuatan: 2025-02-20 11:41:51 Akhirnya memodifikasi: 2025-02-27 17:46:06
menyalin: 2 Jumlah klik: 363
2
fokus pada
319
Pengikut

Strategi perdagangan kuantitatif yang efisien berdasarkan rentang harga dan terobosan Strategi perdagangan kuantitatif yang efisien berdasarkan rentang harga dan terobosan

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang efisien berdasarkan pada kisaran harga dan breakout. Strategi ini terutama dilakukan dengan mengidentifikasi kisaran penutupan di pasar dan melakukan perdagangan ketika harga menembus kisaran tersebut. Strategi ini menggunakan indikator ZigZag untuk mengidentifikasi titik harga penting, menggabungkan zona penutupan yang didefinisikan oleh titik tinggi dan rendah, dan mengirimkan sinyal perdagangan ketika harga menembus zona tersebut.

Prinsip Strategi

Logika inti dari strategi ini mencakup beberapa langkah penting berikut:

  1. Identifikasi titik-titik penting dengan harga tertinggi dan terendah dalam periode loopback
  2. Menggunakan algoritma ZigZag untuk melacak pergerakan harga dan menentukan titik-titik dukungan dan resistensi utama
  3. Mengkonfirmasi interval konsolidasi yang valid dengan menetapkan panjang konsolidasi minimum
  4. Pembaruan batas atas dan bawah secara dinamis, dan pelacakan real-time dari perubahan wilayah yang dihitung
  5. Mencetak sinyal perdagangan saat harga menembus batas

Keunggulan Strategis

  1. Adaptif - Strategi dapat secara dinamis mengidentifikasi dan memperbarui periode pencatatan untuk menyesuaikan dengan kondisi pasar yang berbeda
  2. Risiko terkontrol - memberikan posisi stop loss yang jelas untuk perdagangan dengan batasan jangkauan yang jelas
  3. Dukungan visualisasi - memberikan tampilan visual dari area yang dihitung untuk membantu pedagang memahami kondisi pasar
  4. Perdagangan dua arah - Mendukung peluang perdagangan yang terobosan ke atas dan ke bawah, memaksimalkan peluang pasar
  5. Parameter yang dapat disesuaikan - menyediakan beberapa parameter yang dapat disesuaikan untuk memudahkan pengoptimalan sesuai dengan karakteristik pasar yang berbeda

Risiko Strategis

  1. Risiko False Breakout - Pasar dapat mengalami False Breakout yang menyebabkan kegagalan perdagangan
  2. Risiko tergelincir - kemungkinan tergelincir lebih besar dalam perjalanan yang cepat
  3. Kepercayaan pada kondisi pasar - strategi dapat berkinerja baik di pasar yang bergolak, tetapi mungkin berkinerja buruk di pasar yang sedang tren
  4. Sensitivitas parameter - pengaturan parameter yang tidak tepat dapat mempengaruhi kinerja kebijakan
  5. Manajemen risiko dana - perlu kontrol yang masuk akal atas jumlah dana yang digunakan untuk setiap transaksi

Arah optimasi strategi

  1. Memperkenalkan indikator volume transaksi - validasi terobosan melalui volume transaksi
  2. Optimalkan waktu masuk - menambah mekanisme konfirmasi panggilan balik untuk meningkatkan kualitas masuk
  3. Meningkatkan mekanisme penghentian kerugian - merancang strategi penghentian kerugian yang lebih fleksibel
  4. Menambahkan filter lingkungan pasar - menambahkan penilaian tren, beroperasi dalam lingkungan pasar yang tepat
  5. Adaptasi parameter optimasi - menyesuaikan parameter secara otomatis sesuai dengan volatilitas pasar

Meringkaskan

Ini adalah strategi perdagangan kuantitatif yang dirancang secara rasional dan logis. Ini menyediakan pedagang dengan sistem perdagangan yang andal dengan identifikasi dan penangkapan sinyal penembusan pada interval penyesuaian. Efek visualisasi strategi dan fleksibilitas parameter membuatnya memiliki kepraktisan yang baik. Dengan pengoptimalan dan pengendalian risiko yang berkelanjutan, strategi ini diharapkan menghasilkan keuntungan yang stabil dalam perdagangan aktual.

Kode Sumber Strategi
/*backtest
start: 2024-09-01 00:00:00
end: 2025-02-18 08:00:00
period: 5d
basePeriod: 5d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

// This code is released under the Mozilla Public License 2.0
// More details at: https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue

//@version=5
strategy("Consolidation Zones - Live [Strategy]", overlay=true, max_bars_back=1100)

//-----------------------------------------------------------------------//
//                        Input Variables
//-----------------------------------------------------------------------//
prd       = input.int(defval=10, title="Loopback Period", minval=2, maxval=50)
conslen   = input.int(defval=5,  title="Min. Consolidation Length", minval=2, maxval=20)
paintcons = input.bool(defval=true, title="Color Consolidation Zone?")
zonecol   = input.color(defval=color.new(color.blue, 70), title="Zone Color")

//-----------------------------------------------------------------------//
//                  Variables and Calculations for ZZ (ZigZag) Detection
//-----------------------------------------------------------------------//

// Check if the bar has the highest High or lowest Low in the last prd bars
float hb_ = ta.highestbars(prd) == 0 ? high : na
float lb_ = ta.lowestbars(prd)  == 0 ? low  : na

// Convert to bool to check if hb_ and lb_ are valid (not na)
bool hasHb = not na(hb_)
bool hasLb = not na(lb_)

// Direction variable to determine the trend, based on the last high or low pivot
var int dir = 0

// ZigZag value and last pivot
float zz = na
float pp = na

// 1) Determine direction based on whether a high or low pivot occurred
dir := if hasHb and not hasLb
    1
else if hasLb and not hasHb
    -1
else
    dir  // unchanged direction

// 2) If both a high and low pivot occurred in the same bar
bool sameBar = hasHb and hasLb
if sameBar
    if dir == 1
        zz := hb_
    else
        zz := lb_
else
    zz := hasHb ? hb_ : (hasLb ? lb_ : na)

// 3) Storing last pivots (pp) - iterate over older bars
for x = 0 to 1000
    if na(close) or dir != dir[x]
        break
    if not na(zz[x])  // if zz[x] is a valid value
        if na(pp)
            pp := zz[x]
        else
            if dir[x] == 1 and zz[x] > pp
                pp := zz[x]
            if dir[x] == -1 and zz[x] < pp
                pp := zz[x]

//-----------------------------------------------------------------------//
//                Logic for Consolidation Zone Detection
//-----------------------------------------------------------------------//
var int   conscnt    = 0
var float condhigh   = na
var float condlow    = na

float H_ = ta.highest(conslen)
float L_ = ta.lowest(conslen)

var line upline      = na
var line dnline      = na

bool breakoutup    = false
bool breakoutdown  = false

// Check if pp has changed
bool changedPP = ta.change(pp) != 0

if changedPP
    // If enough candles are in consolidation, check for breakout
    if conscnt > conslen and not na(condhigh) and not na(condlow) and not na(pp)
        if pp > condhigh
            breakoutup := true
        if pp < condlow
            breakoutdown := true
    
    // Check if we are still "in the zone"
    bool inZone = conscnt > 0 and not na(pp) and not na(condhigh) and not na(condlow) and (pp <= condhigh) and (pp >= condlow)
    if inZone
        conscnt += 1
    else
        conscnt := 0
else
    // No change in pivot -> continue consolidation
    conscnt += 1

if conscnt >= conslen
    // At the first "touch" of the required number of candles
    if conscnt == conslen
        condhigh := H_
        condlow  := L_
    else
        condhigh := math.max(condhigh, high)
        condlow  := math.min(condlow, low)
    

//-----------------------------------------------------------------------//
//                          Drawing Fill
//-----------------------------------------------------------------------//
// Declare two plot variables (just ordinary assignment)
condHighPlot = plot(condhigh, color=na, style=plot.style_stepline)
condLowPlot  = plot(condlow,  color=na, style=plot.style_stepline)

// bool to check if we want to color the zone
bool doFill = paintcons and (conscnt > conslen)

// Calling fill
fill(condHighPlot, condLowPlot, color= doFill ? zonecol : color.new(color.white, 100))

//-----------------------------------------------------------------------//
//                          Alerts & STRATEGY
//-----------------------------------------------------------------------//
alertcondition(breakoutup,   title="Breakout Up",   message="Breakout Up")
alertcondition(breakoutdown, title="Breakout Down", message="Breakout Down")

if breakoutup
    // Close short first
    if strategy.position_size < 0
        strategy.close("Breakout Short")
    // Open LONG
    strategy.entry("Breakout Long", strategy.long)

if breakoutdown
    // Close long first
    if strategy.position_size > 0
        strategy.close("Breakout Long")
    // Open SHORT
    strategy.entry("Breakout Short", strategy.short)