嘗試1分K印出前一天5MA和60MA的值

  •   531 
  • 最後發表   莊莊  2024 十二月 23
莊莊 發文於   2024/12/17

想要使用1分K的頻率,但是我怎麼樣都無法取出正確的前一天的 5MA 及 60MA 的值,應該要怎麼寫才會取出正確的值?例如 2024/12/17 的 2359 所羅門,昨天的 5MA 和 60MA 各為 147.7 和 143.33

if barfreq <> "Min" or Barinterval <> 1 then RaiseRuntimeError("請設定頻率為 1 分鐘");

variable: _bar_number(0);

if date <> date[1] then _bar_number = 1 else _bar_number += 1;
setTotalBar(3000);

value1 = average(CloseD(0), 5);
value2 = average(CloseD(0), 60);

print("-----");
print(NumToStr(_bar_number, 0));
print(time);
print("Day Close:" ,CloseD(1));   // 昨日收盤價
print("Day Open:", OpenD(1));     // 昨日開盤價
print("Close: ", Close);          // 當下收盤價
print("Open: ", Open);            // 當下開盤價
print("Day 5MA: ", value1[1]);    // 昨日 5MA
print("Day 60MA: ", value2[1]);   // 昨日 60MA

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/12/17

這裡不能使用CloseD,應該改用GetField("收盤價","D")。

請將

value1 = average(CloseD(0), 5);

value2 = average(CloseD(0), 60);

改成

value1 = average(GetField("收盤價","D"), 5);

value2 = average(GetField("收盤價","D"), 60);

莊莊 發文於   2024/12/17

setTotalBar(3000);

這一行的預先執行筆數請問是否也要改呢?因為是在 1 分鐘頻率執行,我嘗試加到 5000 也沒有印出資訊,再往上加就不能加了,似乎是有筆數最大限制。

虎科大許教授 發文於   2024/12/17

抓的是資料庫裡面的資料,用預設的讀取資料筆數即可。

若你要抓的是昨天的均價,要改成:

value1 = average(GetField("收盤價","D")[1], 5);

value2 = average(GetField("收盤價","D")[1], 60);

 

  • 按讚來自於
  • hohayo
莊莊 發文於   2024/12/17

仍然還是沒有 print 出來...,是因為用 1 分鐘頻率跑的關係嗎?我看一天有 270 根K棒,所以...資料筆數應該是 60 * 270 = 16200,才會跑出來對嗎..雖然試過了仍然不行。

虎科大許教授 發文於   2024/12/17

不需要自行設定讀取資料筆數。我在自動交易中心,使用預設的100筆,用1分鐘頻率,算出5日均價是147.7。

  • 按讚來自於
  • hohayo
莊莊 發文於   2024/12/17

原來,我都是在 XScript 編輯器上按『回測』,然後去 C:\SysJust\XQLite\XS\Print 這裡找,每次測完都要刪檔案再跑一次回測,想問那畫面是如何作回測?不是要有真正執行時才會有那畫面嗎?(很感謝 許教授一直不耐其煩地指導)

虎科大許教授 發文於   2024/12/18

"那畫面"指的是什麼?

莊莊 發文於   2024/12/19

指那一行一行列出來的截圖是怎麼作測試查看的呢?我不知道交易中心還可以這樣看,我至今仍試不出來,都是只有透過產生出來的 log 檔去開啟記事本查看。

 

昨天也有嘗試使用不同的語法想印出 5MA 及 60MA 也都是失敗沒叫出正確的數字...因為我想要在 1 分鐘頻率開盤的當下 只判斷一次 的昨日 5MA 要大於 60MA,在想 60MA 是不是在 1 分鐘頻率之下需要更多的預讀筆數....

{ 昨日 SMA5 / 昨日 SMA60 }

{方法1}
Value3 = Average(GetField("收盤價","D"), 5)[1];    
Value4 = Average(GetField("收盤價","D"), 60)[1]; 

{方法2}
Value3 = xf_XAverage("D", GetField("收盤價","D"), 5);
Value4 = xf_XAverage("D", GetField("收盤價","D"), 60);

{方法3}
Value3 = xfMin_XAverage("D", GetField("收盤價","D"), 5);
Value4 = xfMin_XAverage("D", GetField("收盤價","D"), 60);

condition1 = Value3 > Value4

虎科大許教授 發文於   2024/12/19

直接在自動交易中心執行交易腳本,Print的內容就會顯示在執行記錄分頁。

  • 按讚來自於
  • hohayo
XS小編 發文於   2024/12/19

Hello 莊莊,

 

小編建議您先觀看網站上的教學區教學影片,裡面有XS語法的基礎和應用可以閱覽。

關於資料讀取筆數 (settotalbar) 的部分,可以參考 資料讀取範圍與腳本執行的關係 裡的說明。

 

如同 虎科大許教授 所說,您要取昨日的收盤價平均值,用以下方式計算即可。

value1 = average(GetField("收盤價","D")[1], 5);

 

Average(GetField("收盤價","D"), 5)[1] 取得的會是上一根Bar的計算值 (也就是上一根1分鐘Bar運算得出的值),請注意變數的頻率是和腳本的執行頻率相同。

xf_XAverage("D", GetField("收盤價","D"), 5) 取得的會是當下日頻率的指數移動平均 (移動平均和指數移動平均並不相同)。

xfMin_XAverage("D", GetField("收盤價","D"), 5) 取得的也是當下日頻率的指數移動平均。

 

  • 按讚來自於
  • hohayo
  • hohayo
顯示更多回應 發表回覆
Close