請問我想知道一檔股票在n個月前是否已上市,
舉例,我用 OpenM(120) > 0 來判斷,這樣是否能判斷出來?謝謝
我主要是想判斷它存在才進行ma的計算,可是這樣寫會造成

請問我想知道一檔股票在n個月前是否已上市,
舉例,我用 OpenM(120) > 0 來判斷,這樣是否能判斷出來?謝謝
我主要是想判斷它存在才進行ma的計算,可是這樣寫會造成

若你寫的是選股腳本,則可以使用GetFieldStartOffset("開盤價", "M")抓到該商品第一個月到目前總共距離有幾個月。若小於120個月,就不要計算120個月的平均。
value1=GetFieldStartOffset("開盤價", "M");
if value1>=120 then value2=average(GetField("收盤價", "M"), 120);
若你寫的是其他腳本,可以先setTotalBar(120); 然後使用GetFirstBarDate抓讀取資料的第一筆資料日期,並使用GetBarOffset傳回該日期距離距離現在有沒有超過120根K棒。
if BarFreq<>"M" then raiseRunTimeError("限用月頻率");
setTotalBar(120);
value1=GetBarOffset(GetFirstBarDate);
if value1>=120 then value2=average(GetField("收盤價", "M"), 120);
教授非常利害,竟然提示出有「GetFirstBarDate」可以用,有了這個我就比較好寫了,謝謝教授的提示,也祝週末愉快。
來回覆一下教授指導後測試的情況,
我暫時用最簡短方式來寫,預計寫在雷達,但先用指標測試,如下:
setTotalBar(120);
value1=GetBarOffset(GetFirstBarDate);
if value1 > 120 then Plot36( OpenM(120),"月開盤價[120]");
以上寫成指標測試一檔2024年上市的個股(6934),在k線圖導入此指標,
會發現當程式執行到這一行setTotalBar(120)就已經在k線圖上出現資料長度不足了,所以在圖上就沒有把Plot36執行成功了,不知我以上作法是否有誤或有更佳的寫法?
更新:
後來我改成這樣,雖沒跳出長度不足,但也不知這樣寫法是否正確
value1=GetBarOffset(GetFirstBarDate);
if value1 > 120 then begin
setTotalBar(120);
Plot36( OpenM(120),"月開盤價[120]");
end;
(1)我用我提供的程式測試6934是正常的。

(2)setTotalBar不受流程控制,不管你把它藏在哪裡,它都會被執行。
(3)用你的程式,也沒出現錯誤。

謝謝您的回覆,我再試試。
另請教一下情境 ,若有一檔個股只上市180日,但我想在日k下跨頻求得 日ma300、週ma30、月ma20,
在日k下我引用所需最大筆數 setTotalBar(20*30),但我想判斷若筆數不足的就略過計算均線,那麼「月、週」k的筆數是不足的,那麼連「日k」也會被略過計算了,如果用我上面的寫法,寫成三個if,每個if先判斷是否有足夠歷史筆數再進行均線計算,不知同一個腳本中能否個別setTotalBar ?還是說一個腳本中只能setTotalBar一次且只能以最大引用筆數來setTotalBar呢?
謝謝。
(1)一個腳本裡面若有多個SetTotalBar,則系統會選擇執行筆數最多的那個SetTotalBar。
(2)你可以用我前面建議的方法,計算有多少筆日資料,然後在程式裡面計算會有多少週,多少月的資料筆數,再決定要不要計算均線。
Hello 無情卻慈悲,
小編補充,SetTotalBar設定的是執行頻率的長度。
所以您使用在日頻率上的話,SetTotalBar(120) 會是將執行的長度設為120個工作天,因此當取用不同頻率的資料時需考慮到這點 (ex. 不會有120個月前的資料)。
好的,請問在雷達時,應用SetTotalBar或是SetbackBar?我有測試若用SetTotalBar,則雷達介面上的「資料讀取」欄位會以我寫的為主,但若用SetbackBar則雷達介面上的「資料讀取」欄位只會是可編輯狀態(預設是200),那麼若我SetbackBar(400)的話,但是「資料讀取」欄位就無法被程式控制?對嗎?

屬性設定畫面的『資料讀取』是SetTotalBar的數值。若沒有使用SetTotalBar,則策略雷達預設讀取200筆。你用SetBackBar不會影響這個數值。
9 評論