已完成棒線與即時棒線

From FxCodeBaseWiki
Jump to: navigation, search

問題

您可能已注意到,應用於特定時間框架的大多數信號僅在棒線完全完成時才會檢查市場條件並且顯示提示。例如,當信號應用於 1 小時棒型圖時,在 15:00 的棒線上出現的信號將顯示在 16:00 的棒線上,換言之,該信號只會在 15:00 的棒線剛剛完成時顯示。這看起來非常不方便,因為看上去就像信號有一小時的延遲。

是這樣嗎?或許是的。但讓我們試試在即時棒線上檢查市場條件時,實際會發生什麼情況,每當出現新價格(亦稱為 tick,即價格點)時,即時棒線就會發生永久性的變化。讓我們建立一個簡單的指標,如果某根棒線的收盤價高於前一根棒線的收盤價,該指標就會在這根棒線上顯示一個箭頭。

function Init()
    indicator:name("Show bars where current close is higher than previous");
    indicator:description("");
    indicator:requiredSource(core.Bar);
    indicator:type(core.Indicator);

    indicator.parameters:addColor("clr", "Label Color", "", core.COLOR_LABEL);
end

local source;
local mark;
local first;

function Prepare()
    source = instance.source;
    local name = profile:id();
    instance:name(name);
    first = source:first() + 1;
    mark = instance:createTextOutput ("Mark", "Mark", "Wingdings", 10, core.H_Center, core.V_Top, instance.parameters.clr, 0);
end

function Update(period, mode)
    if period > first then
        if source.close[period] > source.close[period - 1] then
            mark:set(period, source.close[period], "\226");
        end
    end
end

然後在圖表上應用指標。建議選擇 1 分鐘時間框架,因為這樣只需幾分鐘您就可以得到我想展示給您的結果。剛剛應用指標時,看起來一切正常。收盤價更高的棒線具有箭頭標記。但現在觀察指標幾分鐘。哦...出現了奇怪的錯誤信號。為什麼?要弄清真相很容易。每當出現新價格時就會呼叫指標。在呼叫的那一刻,最新價格顯示為最後一根棒線的收盤價...因此,即使棒線在最後與市場條件不相符,在時間框架的中間部分,棒線還是有可能符合市場條件。請看抓圖:

Closeandlivebar zh-hant.png

(按一下查看實際大小的圖片)

將指標應用於即時資料後,您會立即看到錯誤信號。

那麼,讓我們來看看。將指標應用於歷史資料時,僅呼叫一次更新函數,並得到棒線的最終版本。但是對於即時棒線,在棒線期間,出現幾個價格點,就會呼叫幾次指標。如果想像一下在棒線未完成時棒線將是什麼樣的(請看上面截圖中最後一個錯誤信號)— 您將看到有時棒線的確是與信號條件相符的。

因此,簡言之,對幾乎所有信號和許多指標而言,指標會產生「雜訊」— 換言之,會產生錯誤信號,即使該信號並未出現在棒線的最終版本中。這種雜訊信號可能會使您做出錯誤的市場決策,因此,最好的做法就是等待棒線完成,這樣您可以穩妥地檢查在棒線期間是否符合信號條件。

如何處理這種情況?

在指標中

最好的方法是僅在棒線完成時處理棒線。要檢查棒線是否已完成,可以檢查棒線的「序號」,對於具有即時歷史資料的最後一根棒線,僅在該棒線完全完成時才處理該棒線(此時該棒線不再是最後一根棒線)。讓我們以這種方式變更上面的指標。

function Init()
    indicator:name("Show bars where current close is higher than previous");
    indicator:description("");
    indicator:requiredSource(core.Bar);
    indicator:type(core.Indicator);

    indicator.parameters:addColor("clr", "Label Color", "", core.COLOR_LABEL);
end

local source;
local mark;
local first;

function Prepare()
    source = instance.source;
    local name = profile:id();
    instance:name(name);
    first = source:first() + 1;
    mark = instance:createTextOutput ("Mark", "Mark", "Wingdings", 10, core.H_Center, core.V_Top, instance.parameters.clr, 0);
end

local serial = nil;

function Update(period, mode)
    if period > first then
        if source:isAlive() and                                 -- 如果我們應用的歷史資料是即時的
           period == source:size() - 1 then                     -- 且這是最後一個值(即時棒線)
           if serial ~= source:serial(source:size() - 1) then   -- 且最後一根棒線是一根新的棒線
                serial = source:serial(source:size() - 1);      -- 記住最後一根新棒線
                period = period - 1;                            -- 並強制處理前一根棒線(例如最近
                                                                -- 完成的棒線)
            else
                return;                                         -- 棒線未變化,因此
                                                                -- 不要處理它
            end
        end
        if source.close[period] > source.close[period - 1] then
            mark:set(period, source.close[period], "\226");
        end
    end
end


瞧,不再有雜訊了!

在策略中

如果使用 helper.lua 進行訂閱管理,您無需執行任何操作。僅當棒線完全完成時,helper 才會通知您。

如果您自己實現訂閱,操作方式與指標的操作方式相同 — 不要檢查市場條件,直到訂閱的時間框架內出現新的棒線。

其他語言版本

Language: English  • español • français • русский • 中文 • 中文(繁體)‎