ZIG ZAG指標

  •   1.1K 
  • 最後發表   風期會  2025 五月 30
風期會 發文於   2024/04/08

小幫手請教,我透過內建的Zig Zag指標腳本想要轉換成自動交易,但因為對語法理解有限,想請問在polotlin裡頭的pv_start_price和pv_end_price,我該怎樣表達進出訊號呢?煩請教導,感謝

{
    PlotLine(PlotIndex, x1, y1, x2, y2, add:=0);
        PlotIndex為 1 ~ 999,作用如同 Plot 的序列編號
        x1 為起點的 Bar Number (可用 CurrentBar 確認)
        y1 為起點的 Y 軸數值 (ex. 價格)
        x2 為終點的 Bar Number
        add 為非必要參數,預設為 0,執行後會先清除之前的趨勢線,若不希望清除的話則可以設為 1。

    繪製zigzag指標

    指標參數:

    zz_deviation: 單位是%, 代表每一個波段的滿足幅度, 也就是當某個低點到某個高點的價差%大於這個數值時, 這個就視為一個完整的上漲/下跌波段
    zz_depth: 多少根bar. 這個數值代表指標區間的高點/低點必須比他的左邊/右邊各zz_depth根bar都來的大/小, 才可以視為一個區間高點/低點

    一個ZigZag指標, 就是連結區間高點/低點的波段, 且每一個波段的價差必須滿足指定的價差%

}
input: zz_deviation(0.1, "每個波段的滿足幅度(%)");
input: zz_depth(5, "判斷頂點的左右bar間隔");


// 底下pv_開頭的這幾個變數, 用來紀錄已經找到的波段
//
var: pv_count(0);           // 目前總共找倒了幾個波段(pivot), 0表示還沒有找到
var: pv_start_index(0);     // pivot的起點位置, 1-based的barIndex
var: pv_start_price(0);     // pivot的起點價格
var: pv_end_index(0);       // pivot的終點位置, 1-based的barIndex
var: pv_end_price(0);       // pivot的終點價格  
var: pv_is_high(false);     // pivot的方向, true=上升, false=下降

array: maxmin[2](0);        // 紀錄每根bar所找到的區間高點/低點的bar的位置, maxmin[1]是高點, maxmin[2]是低點

var: pivot_updated(false);  // 這次洗價是否異動了pivot (pv_...)

pivot_updated = false;

// 找最近一個區間高點/區間低點
//
maxmin[1] = SwingHighBar(High, zz_depth + 1, zz_depth, zz_depth, 1);
maxmin[2] = SwingLowBar(Low, zz_depth + 1, zz_depth, zz_depth, 1);

var: _i(0);

var: p_index(0);
var: p_price(0);
var: is_high(false);
var: dev(0);

// 當遇到一個新的區間高點/低點時, 判斷這個點跟目前的波段(pivot)的關係, 更新pivot, 或是產生新的pivot
//
for _i = 1 to 2 begin
    if maxmin[_i] >= 0 then begin
        if _i = 1 then is_high = true else is_high = false;

        if is_high then 
            p_price = High[maxmin[_i]]
        else
            p_price = Low[maxmin[_i]];

        p_index = CurrentBar - maxmin[_i];    // 轉換成1-based的barIndex

        // Print("(FindPoint)", NumToStr(Date[maxmin[_i]], 0), NumToStr(p_price, 2), is_high);

        if pv_count = 0 then begin
            // 目前還沒有pivot: 先產生一個只有一個點的pivot, 這是第一個pivot
            //
            pv_count = 1;
            pv_start_index = p_index;
            pv_start_price = p_price;
            pv_end_index = p_index;
            pv_end_price = p_price;
            pv_is_high = is_high;

            pivot_updated = true;

        end else begin      
            if pv_is_high = is_high then begin
                // 如果同方向, 而且新的點的價格比上一個pivot的價格更高/更低, 就更新pivot(延伸pivot的長度)
                //
                if (is_high and p_price > pv_end_price) or (not is_high and p_price < pv_end_price) then begin

                    if pv_count = 1 then begin
                        // 如果是第一個pivot, 而且還只有一個點, 則讓start/end都挪到新的那個點
                        //
                        pv_start_index = p_index;
                        pv_start_price = p_price;
                    end;

                    pv_end_index = p_index;
                    pv_end_price = p_price;

                    pivot_updated = true;
                end;

            end else begin
                // 如果反方向, 而且新的點產生了價格的轉折, 則產生一個新的pivot(波段)
                //
                dev = 100 * (p_price - pv_end_price) / pv_end_price;
                if (not pv_is_high and dev >= zz_deviation) or (pv_is_high and dev <= -1 * zz_deviation) then begin
                    // 產生新的pivot
                    //
                    pv_count = pv_count + 1;
                    pv_start_index = pv_end_index;
                    pv_start_price = pv_end_price;
                    pv_end_index = p_index;
                    pv_end_price = p_price;
                    pv_is_high = is_high;

                    pivot_updated = true;
                end;
            end;       

            if pivot_updated then begin
                //Print(
                //  Text("PLOT(", NumToStr(pv_count, 0), ")"),
                //  "from", NumToStr(Date[CurrentBar - pv_start_index], 0), NumToStr(pv_start_price, 2),
                //  "to", NumToStr(Date[CurrentBar - pv_end_index], 0), NumToStr(pv_end_price, 2),
                //  pv_is_high
                //);

                // 畫出最新一段pivot
                //
                if pv_start_index <> pv_end_index then
                    PlotLine(1, pv_start_index, pv_start_price, pv_end_index, pv_end_price, "波浪線", add:=1);

                // 只要有更新pivot, 就不再處理另一個方向的區間高點/低點
                //
                break;
            end;
        end;
    end;
end;

排序方式: 標準 | 最新
風期會 發文於   2024/04/08
XS小編 發文於   2024/04/10

 Hello 風期會,

 

小編不知道您打算怎麼撰寫交易邏輯,不過需注意 Zig Zag 是事後才知道轉折點,然後由前面開始向當根Bar畫。

所以最快也只能夠在轉折點確定後 (可能是轉折點之後的好幾根Bar) 才能夠進出場。

至於轉折點何時確定的則是依據 pivot_updated 變數,或許您可以以此當作判斷條件。

  • 按讚來自於
  • greg750
Hsyih 發文於   2025/05/30

不好意思 我想詢問 最後自動交易腳本有寫出來嗎?
 Zig Zag參數怎麼改 在自動交易那邊都會有問題跑不出訊號

發表回覆
Close