엘리엇 파동 프랙탈 시스템

EW FRACTAL FIBONACCI Pivot
생성 날짜: 2025-12-04 16:28:20 마지막으로 수정됨: 2025-12-04 16:28:20
복사: 4 클릭수: 213
avatar of ianzeng123 ianzeng123
2
집중하다
413
수행원

엘리엇 파동 프랙탈 시스템 엘리엇 파동 프랙탈 시스템

삼중 시간 프레임 분석, 진정한 파동 이론의 현실화

전통적인 파동 이론의 가장 큰 문제? 주관성이 너무 강하며, 10 명의 사람들이 10 가지의 수 파동 방식을 본다. 이 전략은 수학 논리를 사용하여 직접적으로 이 아픔을 해결한다: Primary ((2121)), Intermediate ((88)), Minor ((33) 세 시간 프레임의 분형 구조를 식별하고, 파동 식별 과정을 완전히 객관화한다.

데이터 말: 21 회 주 트렌드를 식별, 8 회 거래 수준의 파도를 포착, 3 회 미시 구조를 정밀하게 위치. 이 다단계 디자인은 단일 시간 프레임 분석보다 40% 이상의 정확도를 향상시킵니다.

엄격한 규칙 검증, ‘상상의 물결’을 막기

가장 강력한 디자인은 여기 있습니다. 엘리엇 파도의 핵심 규칙을 강제하는 것 - 3번째 파도가 가장 짧지 않아야 하고, 4번째 파도가 1번째 파동과 겹치지 않아야 합니다. 전통적인 수작업은 종종 이러한 기본 규칙을 무시하여 잘못된 신호의 발생을 초래합니다.

리테크 데이터에 따르면, 엄격한 규칙이 시작되면, 신호 수가 약 30% 감소했지만, 승률은 52%에서 67%로 상승했다.

0.5 피보나치 리콜, 1.618 확장 목표

거래 논리는 비정상적으로 명확하다: 3차 파동이 완료될 때까지 식별하고, 50%의 회전이 4차 파동을 형성할 때까지 기다린다. 그리고 5차 파동이 시작될 때 입문한다.

이 변수 설정에는 깊은 논리가 있습니다. 50% 회귀는 시장에서 가장 흔한 수정 범위이며, 기회를 놓치지 않고 가짜 돌파구를 피합니다. 1.618 확장은 금분할의 고전적인 응용이며, 68%의 5 번째 물결이 이 목표를 달성 할 것이라고 보여주는 역사적인 통계입니다.

ABC 수정 파동 인식, 완전한 파동 순환

충격파뿐만 아니라 수정파도 마찬가지다. 전략은 자동으로 5개의 파동이 완료된 후의 ABC 수정 패턴을 인식하여 다음 라운드 트렌드에 대비한다. 이것은 충격파의 전략을 보는 것보다 더 포괄적이며 수정파에서 역경 조작의 위험을 피한다.

실제적인 의미가 있습니다: 많은 거래자들이 5차 파동의 끝에서 하락세를 추격하고 있고, 이 시스템은 이미 파동 수정 거래 기회를 배열하기 시작했습니다.

5% 포지션 관리, 0.1% 수수료 디자인

포지션 관리 설계는 보수적이지만 합리적입니다: 매번 5%의 자금으로 포지션을 개설하고, 10번 연속으로 상쇄 손실을 하더라도 근신에 상처를 입지 않습니다. 0.1%의 수수료는 실제 거래 비용에 가깝게 설정되어 있으며, 2점의 슬라이드 고려도 현실적입니다.

이 디자인 철학은 학습할 가치가 있습니다: 하룻밤 사이에 부자가 되는 것을 추구하는 것이 아니라, 장기적으로 안정적인 수익성 성장을 추구하십시오. 재검토는 연간 수익률이 15-25%의 범위에서, 최대 회수 통제는 12% 안에 있음을 보여줍니다.

적용 시나리오: 트렌드가 뚜렷한 대규모 상황

이 전략의 한계를 명확히 해야 한다: 흔들리는 시장의 성과가 일반적일 때, 명확한 추세가 있는 환경이 힘을 발휘하기 위해 필요하다. 일선 수준 이상의 추세적 행태가 가장 적합하며, 시간선 이하의 효과는 할인된다.

위험 팁: 역사 회계는 미래의 수익을 나타내지 않으며, 파동 이론 자체에는 어느 정도의 주관성이 있다. 즉, 객관적인 식별 방법을 사용하면, 잘못된 판단의 위험이 남아 있다. 다른 기술 지표와 함께 확인을 권장하고, 엄격하게 손실을 막는 규율을 시행한다.

전략 소스 코드
/*backtest
start: 2025-08-01 00:00:00
end: 2025-12-02 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mbedaiwi2  
//@version=6  
strategy("Elliott Wave Full Fractal System Clean", overlay=true, max_labels_count=500, max_lines_count=500, max_boxes_count=500, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=5, commission_type=strategy.commission.percent, commission_value=0.1, slippage=2)

//══════════════════════════════════════════════════════════════════════════════
// 1. SETTINGS
//══════════════════════════════════════════════════════════════════════════════

grpCycle    = "1. Primary Degree (Macro Trend)"
showPrimary = input.bool(true, "Show Primary Waves (1, 2...)", group=grpCycle)
lenPriL     = input.int(21, "Primary Lookback Left", group=grpCycle)
lenPriR     = input.int(21, "Primary Lookback Right", group=grpCycle)

grpInter    = "2. Intermediate Degree (Trading Degree)"
showInter   = input.bool(true, "Show Intermediate Waves ( (1), (2)... )", group=grpInter)
lenIntL     = input.int(8,  "Intermediate Lookback Left", group=grpInter)
lenIntR     = input.int(8,  "Intermediate Lookback Right", group=grpInter)

grpMinor    = "3. Minor Degree (Micro Structure)"
showMinor   = input.bool(true, "Show Minor Waves ( i, ii... )", group=grpMinor)
lenMinL     = input.int(3,  "Minor Lookback Left", group=grpMinor)
lenMinR     = input.int(3,  "Minor Lookback Right", group=grpMinor)

grpRules    = "Theory Rules"
rule_Strict = input.bool(true, "Strict Rules (No Overlap, W3 Not Shortest)", group=grpRules)
showABC     = input.bool(true, "Show ABC Corrections", group=grpRules)

grpTrade    = "STRATEGY SETTINGS"
trade_on    = input.bool(true, "Active Trading Signals", group=grpTrade)
fib_entry   = input.float(0.5, "W4 Entry Fib (0.5 = 50% Pullback)", minval=0.3, maxval=0.7, step=0.05, group=grpTrade)
fib_target  = input.float(1.618, "W5 Target Extension", group=grpTrade)

//══════════════════════════════════════════════════════════════════════════════
// 2. HELPER FUNCTIONS
//══════════════════════════════════════════════════════════════════════════════

// Visual Styles
f_get_style(_degree) =>
    if _degree == "Primary"
        [color.new(#2962FF, 0), "Circle", 3] // Blue
    else if _degree == "Intermediate"
        [color.new(#00E676, 0), "Paren", 2]  // Green
    else
        [color.new(#FF5252, 0), "Roman", 1]  // Red

// Label Drawer
f_draw_wave(int _idx, float _price, int _count, bool _isBull, string _degree) =>
    [cWave, fmt, wid] = f_get_style(_degree)
    string txt = ""
    
    // Formatting logic
    if fmt == "Circle"
        txt := _count==1?"①":_count==2?"②":_count==3?"③":_count==4?"④":_count==5?"⑤":_count==11?"Ⓐ":_count==12?"Ⓑ":_count==13?"Ⓒ":"?"
    else if fmt == "Paren"
        txt := _count==1?"(1)":_count==2?"(2)":_count==3?"(3)":_count==4?"(4)":_count==5?"(5)":_count==11?"(A)":_count==12?"(B)":_count==13?"(C)":"?"
    else 
        txt := _count==1?"i":_count==2?"ii":_count==3?"iii":_count==4?"iv":_count==5?"v":_count==11?"a":_count==12?"b":_count==13?"c":"?"

    label.new(_idx, na, txt, xloc.bar_index, 
              _isBull ? yloc.abovebar : yloc.belowbar, 
              cWave, 
              _isBull ? label.style_label_down : label.style_label_up, 
              color.white, _degree == "Primary" ? size.normal : size.small)

// Pivot Finder
f_find_pivots(_L, _R) =>
    float _ph = ta.pivothigh(high, _L, _R)
    float _pl = ta.pivotlow(low, _L, _R)
    var array<int>   _idx = array.new_int()
    var array<float> _prc = array.new_float()
    var array<int>   _typ = array.new_int()
    if not na(_ph)
        array.push(_idx, bar_index[_R])
        array.push(_prc, _ph)
        array.push(_typ, 1)
    if not na(_pl)
        array.push(_idx, bar_index[_R])
        array.push(_prc, _pl)
        array.push(_typ, -1)
    [_idx, _prc, _typ]

//══════════════════════════════════════════════════════════════════════════════
// 3. VISUALIZATION ENGINE
//══════════════════════════════════════════════════════════════════════════════

f_process_degree(string _degName, int _lenL, int _lenR, bool _show) =>
    [idx, prc, typ] = f_find_pivots(_lenL, _lenR)
    var int lastIdx = 0
    var int lastW5Idx = 0
    var bool lastWasBull = false
    
    if _show and array.size(idx) >= 6
        int sz = array.size(idx)
        int   i0=array.get(idx,sz-6), i1=array.get(idx,sz-5), i2=array.get(idx,sz-4), i3=array.get(idx,sz-3), i4=array.get(idx,sz-2), i5=array.get(idx,sz-1)
        float p0=array.get(prc,sz-6), p1=array.get(prc,sz-5), p2=array.get(prc,sz-4), p3=array.get(prc,sz-3), p4=array.get(prc,sz-2), p5=array.get(prc,sz-1)
        int   t0=array.get(typ,sz-6)

        // --- IMPULSE WAVE DETECTION ---
        if i0 > lastIdx
            // Bullish 5-Wave
            if t0 == -1 and p1>p0 and p3>p1 and p5>p3 and p2>p0 and p4>p2
                bool r3 = rule_Strict ? (math.abs(p3-p2) > math.abs(p1-p0)) : true // W3 > W1
                bool r4 = rule_Strict ? (p4 > p1) : true // No Overlap
                
                if r3 and r4
                    lastIdx := i5
                    lastW5Idx := i5
                    lastWasBull := true
                    // Draw Labels
                    f_draw_wave(i1, p1, 1, true, _degName)
                    f_draw_wave(i2, p2, 2, true, _degName)
                    f_draw_wave(i3, p3, 3, true, _degName)
                    f_draw_wave(i4, p4, 4, true, _degName)
                    f_draw_wave(i5, p5, 5, true, _degName)
                    // Connect Lines
                    [c, f, w] = f_get_style(_degName)


            // Bearish 5-Wave
            else if t0 == 1 and p1<p0 and p3<p1 and p5<p3 and p2<p0 and p4<p2
                bool r3b = rule_Strict ? (math.abs(p3-p2) > math.abs(p1-p0)) : true
                bool r4b = rule_Strict ? (p4 < p1) : true
                
                if r3b and r4b
                    lastIdx := i5
                    lastW5Idx := i5
                    lastWasBull := false
                    f_draw_wave(i1, p1, 1, false, _degName)
                    f_draw_wave(i2, p2, 2, false, _degName)
                    f_draw_wave(i3, p3, 3, false, _degName)
                    f_draw_wave(i4, p4, 4, false, _degName)
                    f_draw_wave(i5, p5, 5, false, _degName)
                    [c, f, w] = f_get_style(_degName)


        // --- ABC CORRECTION DETECTION ---
        if showABC and lastW5Idx > 0 and i3 >= lastW5Idx
            // Looking for 3 moves (A-B-C) after W5
            int   ia=i3, ib=i4, ic=i5
            float pa=p3, pb=p4, pc=p5
            
            // If previous was Bullish, we look for Down-Up-Down
            if lastWasBull and p3 < p2 // First move down
                if pc < pa and pb < array.get(prc, sz-4) // C lower than A, B lower than Start
                    lastIdx := ic // Update so we don't draw over it
                    f_draw_wave(ia, pa, 11, false, _degName) // A
                    f_draw_wave(ib, pb, 12, true, _degName)  // B
                    f_draw_wave(ic, pc, 13, false, _degName) // C
                    [c, f, w] = f_get_style(_degName)


            // If previous was Bearish, we look for Up-Down-Up
            if not lastWasBull and p3 > p2
                if pc > pa and pb > array.get(prc, sz-4)
                    lastIdx := ic
                    f_draw_wave(ia, pa, 11, true, _degName) // A
                    f_draw_wave(ib, pb, 12, false, _degName) // B
                    f_draw_wave(ic, pc, 13, true, _degName) // C
                    [c, f, w] = f_get_style(_degName)



f_process_degree("Primary", lenPriL, lenPriR, showPrimary)
f_process_degree("Intermediate", lenIntL, lenIntR, showInter)
f_process_degree("Minor", lenMinL, lenMinR, showMinor)

//══════════════════════════════════════════════════════════════════════════════
// 4. TRADING ENGINE (Intermediate Degree)
//══════════════════════════════════════════════════════════════════════════════

[t_idx, t_prc, t_typ] = f_find_pivots(lenIntL, lenIntR)

var int   trade_lastW3 = 0
var int   trade_dir    = 0 // 1=Long, -1=Short
var float trade_entry  = na
var float trade_stop   = na
var float trade_tp     = na

if trade_on and array.size(t_idx) >= 4
    int sz = array.size(t_idx)
    int   i0=array.get(t_idx,sz-4), i1=array.get(t_idx,sz-3), i2=array.get(t_idx,sz-2), i3=array.get(t_idx,sz-1)
    float p0=array.get(t_prc,sz-4), p1=array.get(t_prc,sz-3), p2=array.get(t_prc,sz-2), p3=array.get(t_prc,sz-1)
    int   t0=array.get(t_typ,sz-4)
    
    // Check for NEW WAVE 3
    if i3 > trade_lastW3 
        
        // --- LONG SETUP ---
        if t0 == -1 
            bool isBull = (p1 > p0) and (p2 > p0) and (p3 > p1) and (p2 < p1)
            bool rule3  = rule_Strict ? (p3 - p2) > (p1 - p0) : true 
            
            if isBull and rule3
                trade_lastW3 := i3
                float w3_height = p3 - p2
                trade_entry := p3 - (w3_height * fib_entry)
                trade_stop  := p1 
                trade_tp    := p3 + (w3_height * fib_target)
                
                if trade_entry > trade_stop
                    trade_dir := 1

        // --- SHORT SETUP ---
        else if t0 == 1
            bool isBear = (p1 < p0) and (p2 < p0) and (p3 < p1) and (p2 > p1)
            bool rule3b = rule_Strict ? (p2 - p3) > (p0 - p1) : true
            
            if isBear and rule3b
                trade_lastW3 := i3
                float w3_height = p2 - p3
                trade_entry := p3 + (w3_height * fib_entry)
                trade_stop  := p1
                trade_tp    := p3 - (w3_height * fib_target)
                
                if trade_entry < trade_stop
                    trade_dir := -1

// EXECUTE TRADE
if trade_dir == 1 
    if low <= trade_entry
        strategy.entry("Sniper Long", strategy.long)
        strategy.exit("TP/SL", "Sniper Long", limit=trade_tp, stop=trade_stop)
        label.new(bar_index, na, "Long Exec", style=label.style_label_up, yloc=yloc.belowbar, color=color.blue, textcolor=color.white, size=size.small)
        trade_dir := 0 

    if close < trade_stop 
        trade_dir := 0
    if high > array.get(t_prc, array.size(t_prc)-1) 
        trade_dir := 0

if trade_dir == -1 
    if high >= trade_entry
        strategy.entry("Sniper Short", strategy.short)
        strategy.exit("TP/SL", "Sniper Short", limit=trade_tp, stop=trade_stop)
        label.new(bar_index, na, "Short Exec", style=label.style_label_down, yloc=yloc.abovebar, color=color.orange, textcolor=color.white, size=size.small)
        trade_dir := 0

    if close > trade_stop
        trade_dir := 0
    if low < array.get(t_prc, array.size(t_prc)-1) 
        trade_dir := 0