管理員好
簡單寫了一個指標,發現 getfield("時間", "1"), getfield("時間", "tick") 資料錯誤
如果是我寫錯,請麻煩糾正我,如果是系統資料錯誤,麻煩請告訴我 怎樣能取得正確的時間資料,
謝謝管理員 附上 語法與圖片  謝謝


 
        
        管理員好
簡單寫了一個指標,發現 getfield("時間", "1"), getfield("時間", "tick") 資料錯誤
如果是我寫錯,請麻煩糾正我,如果是系統資料錯誤,麻煩請告訴我 怎樣能取得正確的時間資料,
謝謝管理員 附上 語法與圖片  謝謝


Hello 樂兒,
因為您的變數並非 intrabarpersist,所以變數只會保存最近一根K棒結束時價格符合條件的資訊。
另外需注意XS指標是運算在1分鐘頻率上,所以若是在盤中盤後才掛上的話,當下以前的資料都會用1分鐘Bar的資料來運算 (非逐筆Tick)。
敬愛的管理員,
感謝您回應,我可否理解為,如果沒有用 intrabarpersist 宣告變數,必須要在開盤前 開啟程式 執行指標,上述案例的數字就會正確。
如果,我使用intrabarpersist 宣告上述案例的變數,就算開盤後才打開XQ,執行指標,上述案例的數字也會因為宣告方式 而顯示出正確的當日高低點出現的時間
請問我這樣的理解,觀念上是否正確,如果我有錯誤,煩請指正我喔, 感恩感恩!
逐筆洗價時,加不加intrabarpersist,會影響變數行為。你的程式兩個紀錄時間的變數,若不加intrabarpersist,則每次洗價時兩個變數會恢復到前一根一分K收盤時的值。以5月24日的凌群為例,盤中的最高價69.90出現在093800,但你紀錄的最高價時間卻是091300,為什麼會這樣呢?因為091300的收盤價正好是該分鐘的最高價,也是當天開盤以來14根一分K的最高價,所以最高價出現的時間被紀錄到_Htime。由於直到收盤之前,沒有任何K棒符合收盤價等於當天最高價的條件,_Htime一直是091300,所以最後_Htime顯示的時間是091300。若你宣告_Htime時加上intrabarpersist,則任何一個Tick價格等於當天最高價時,_Htime就會被更新,這樣就可以得到正確的答案。
許教授:謝謝您的的精彩解答,為了確認我的理解正確,能否讓我舉一個例子向您請益
假設我要使用變數,記錄 日頻率,逐筆洗價 時,股票今天第一次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;
這個敘述式嗎
非常感謝許教授的精彩回答! 祝您 快樂 順心 福氣滿盈!
(1)變數仍然需要加intrabarpersist。
(2)一樣需要加 if getinfo("isrealtime")=0 then return; 以避免歷史資料干擾變數。
(3)建議不要用if c=GetField("漲停價","D") then,而改用if h=GetField("漲停價","D") then,這樣可避免漏接TICK時,時間紀錄錯誤的問題。
謝謝許教授的指導,想釐清一個困惑:如果上述案例加了 intrabarpersist
假設,股票今天鎖住漲停的時間是 9:05~10點, 加了 intrabarpersist之後
variable: intrabarpersist_Highesttime(0); 紀錄到的時間, 是否會變成 100000
不加intrabarpersist 的情況 Variable:_Highesttime(0); 紀錄到的時間, 是否為 090500
主要是想確認 逐筆洗價時,加不加intrabarpersist,對變數 行為的影響
感謝許教授解惑,非常感恩,不好意思,因為對於變數 使用或不使用 intrabarpersist
總覺得認知上有卡住的地方
感恩許教授,祝您身體健康 平安快樂
這裡要先更正漲停的時間。若你希望記錄「第一次」出現漲停的時間,則需要再使用另一個變數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,有些情況不能加,加了之後結果反而不如預期。
感謝許教授指正,請問哪裡可以找到許教授的課程資訊,關於加不加intrabarpersist的差異,還有程式語言的觀念,有機會應該多向您學習才好!
此外,我剛剛想到,如果以此案例,要紀錄「第一次」出現漲停的時間,能否用 Once,來解決這個需求,一樣要搭配使用 intrabarpersist 來宣告變數,對嗎?
var: intraBarPersist _HighestTime(0);
if getinfo("isrealtime")=0 then return;
Once(h=GetField("漲停價","D")) begin _HighestTime=getfield("時間", "1");
End;
請問許教授,使用Once的情況下,如果沒有加intrabarpersist 來宣告變數,一樣會遇到您上述提到的問題,這樣理解對嗎?
感覺許教授功力深厚,很多細節的疑難可能都有對應的解決方案了!很佩服!
課程資訊應該會在XQ的相關網頁公告。可使用ONCE結構處理,但變數一樣要加intrabarpersist。若不加,一樣有相同的問題。
謝謝許教授,希望能看見您的課程!
11 評論