請問getfield("時間", "1") 資料是否有誤?

  •   318 
  • 最後發表   樂兒  2024 六月 11
樂兒 發文於   2024/05/24

管理員好

簡單寫了一個指標,發現 getfield("時間", "1"), getfield("時間", "tick") 資料錯誤

如果是我寫錯,請麻煩糾正我,如果是系統資料錯誤,麻煩請告訴我 怎樣能取得正確的時間資料,

謝謝管理員 附上 語法與圖片  謝謝

 

 

 

排序方式: 標準 | 最新
XS小編 發文於   2024/05/28

 Hello 樂兒,

 

因為您的變數並非 intrabarpersist,所以變數只會保存最近一根K棒結束時價格符合條件的資訊。

另外需注意XS指標是運算在1分鐘頻率上,所以若是在盤中盤後才掛上的話,當下以前的資料都會用1分鐘Bar的資料來運算 (非逐筆Tick)。 

樂兒 發文於   2024/05/31

敬愛的管理員,

感謝您回應,我可否理解為,如果沒有用  intrabarpersist 宣告變數,必須要在開盤前 開啟程式 執行指標,上述案例的數字就會正確。

 

如果,我使用intrabarpersist 宣告上述案例的變數,就算開盤後才打開XQ,執行指標,上述案例的數字也會因為宣告方式 而顯示出正確的當日高低點出現的時間

 

請問我這樣的理解,觀念上是否正確,如果我有錯誤,煩請指正我喔,  感恩感恩!

虎科大許教授 發文於   2024/05/31

逐筆洗價時,加不加intrabarpersist,會影響變數行為。你的程式兩個紀錄時間的變數,若不加intrabarpersist,則每次洗價時兩個變數會恢復到前一根一分K收盤時的值。以5月24日的凌群為例,盤中的最高價69.90出現在093800,但你紀錄的最高價時間卻是091300,為什麼會這樣呢?因為091300的收盤價正好是該分鐘的最高價,也是當天開盤以來14根一分K的最高價,所以最高價出現的時間被紀錄到_Htime。由於直到收盤之前,沒有任何K棒符合收盤價等於當天最高價的條件,_Htime一直是091300,所以最後_Htime顯示的時間是091300。若你宣告_Htime時加上intrabarpersist,則任何一個Tick價格等於當天最高價時,_Htime就會被更新,這樣就可以得到正確的答案。

樂兒 發文於   2024/06/03

許教授:謝謝您的的精彩解答,為了確認我的理解正確,能否讓我舉一個例子向您請益

假設我要使用變數,記錄 日頻率,逐筆洗價 時,股票今天第一次Close =漲停價 的時間,並且監控 此時間一個小時後,漲停打開 則通知我

想要請教您的是,此時,我的變數,就不該加intrabarpersist,對嗎?

 

setBackBar(5, "D");

variable: _Highesttime(0);

 

condition1= GetQuote("股本(億)")>50;

 

if c=GetField("漲停價","D") then _Highesttime=getfield("時間", "1");

 

if condition1

and time>timeAdd(_Highesttime,"H",1) 

and c< GetField("漲停價","D") then 

ret=1;

另外想請教許教授的是,在上述案例中,要紀錄到正確的 股票今天第一次Close =漲停價 的時間 ,還需要在程式的開始 加上

if getinfo("isrealtime")=0 then return; 

這個敘述式嗎

 

非常感謝許教授的精彩回答! 祝您 快樂 順心 福氣滿盈!

虎科大許教授 發文於   2024/06/03

(1)變數仍然需要加intrabarpersist。

(2)一樣需要加 if getinfo("isrealtime")=0 then return; 以避免歷史資料干擾變數。

(3)建議不要用if c=GetField("漲停價","D") then,而改用if h=GetField("漲停價","D") then,這樣可避免漏接TICK時,時間紀錄錯誤的問題。

 

樂兒 發文於   2024/06/03

謝謝許教授的指導,想釐清一個困惑:如果上述案例加了 intrabarpersist

假設,股票今天鎖住漲停的時間是 9:05~10點, 加了 intrabarpersist之後

 

variable:  intrabarpersist_Highesttime(0);  紀錄到的時間, 是否會變成 100000

不加intrabarpersist 的情況 Variable:_Highesttime(0);  紀錄到的時間, 是否為 090500

主要是想確認 逐筆洗價時,加不加intrabarpersist,對變數 行為的影響

 

感謝許教授解惑,非常感恩,不好意思,因為對於變數 使用或不使用 intrabarpersist 

總覺得認知上有卡住的地方

 

感恩許教授,祝您身體健康 平安快樂

虎科大許教授 發文於   2024/06/03

這裡要先更正漲停的時間。若你希望記錄「第一次」出現漲停的時間,則需要再使用另一個變數isUplimit控制。

var: intraBarPersist isUplimit(false);

var: intraBarPersist _HighestTime(0);

if getinfo("isrealtime")=0 then return; 

if isUplimit=false and h=GetField("漲停價","D") then

begin

_HighestTime=getfield("時間", "1");

isUplimit=true;

end;

_HighestTime不加intrabarpersist,則可能計算的時間無法十分準確。例如090530漲停,但090559打開且價格低於漲停價,在沒有加intrabarpersist的情況下,則漲停開始的時間不會被記錄為090500。

加不加intrabarpersist不只困擾初學者,老手可能在撰寫程式時,發現結果不如預期時才想起忘記加intrabarpersist。這部份的概念需要多加練習才會搞清楚。若將來有機會上我基礎班的課程,我會有幾個練習,讓大家了解加不加intrabarpersist的差異。練習過後,你就會很清楚該不該加。還有,並不是所有變數都可以加intrabarpersist,有些情況不能加,加了之後結果反而不如預期。

樂兒 發文於   2024/06/03

感謝許教授指正,請問哪裡可以找到許教授的課程資訊,關於加不加intrabarpersist的差異,還有程式語言的觀念,有機會應該多向您學習才好!

 

此外,我剛剛想到,如果以此案例,要紀錄「第一次」出現漲停的時間,能否用 Once,來解決這個需求,一樣要搭配使用 intrabarpersist 來宣告變數,對嗎?

var: intraBarPersist _HighestTime(0);

 

if getinfo("isrealtime")=0 then return; 

 

Once(h=GetField("漲停價","D")) begin _HighestTime=getfield("時間", "1");

End;

請問許教授,使用Once的情況下,如果沒有加intrabarpersist 來宣告變數,一樣會遇到您上述提到的問題,這樣理解對嗎?

 

感覺許教授功力深厚,很多細節的疑難可能都有對應的解決方案了!很佩服!

 

虎科大許教授 發文於   2024/06/03

課程資訊應該會在XQ的相關網頁公告。可使用ONCE結構處理,但變數一樣要加intrabarpersist。若不加,一樣有相同的問題。

樂兒 發文於   2024/06/04

謝謝許教授,希望能看見您的課程!

 

顯示更多回應 發表回覆
Close