跨商品抓取資料K棒有誤差該如何解決

  •   227 
  • 最後發表   ED87  2024 四月 19
ED87 發文於   2024/03/29

小編你好 程式碼如下 執行商品為 小型台指近月 頻率為5分鐘 逐筆洗價

input: ma_Length(5, "MA");
input: kHigh(0, "high");
input: kLow(0, "low");
input: isBackHand(false, "isBackHand");

var: maAverage(0);  
var: intraBarPersist run(true);

//maAverage = Average(Close, ma_Length);
maAverage = Average(getsymbolField("FITXN*1.TF", "close"), ma_Length);

//多
//condition1 = close[1] < maAverage[1];
//condition2 = low[1] > kHigh;
//condition3 = close[1] < kLow;
condition1 = getsymbolField("FITXN*1.TF", "close")[1] < maAverage[1];
condition2 = getsymbolField("FITXN*1.TF", "low")[1] > kHigh;
condition3 = getsymbolField("FITXN*1.TF", "close")[1] < kLow;


//防呆
Value1 = CurrentTime;
condition11 = Mod(minute(Value1), 5) = 0; //避免maAverage在K線未收線就變動
condition99 = condition11 and run;

if Position >= 1 and Filled >= 1 and condition99 then begin
    if (condition1 and condition2) or condition3 then begin 
        if isBackHand = true then 
            SetPosition(-1)
        else 
            SetPosition(0);
        run = false;
        print("maAverage:", maAverage[1]);
        print("close:", getsymbolField("FITXN*1.TF", "close")[1], "low:",  getsymbolField("FITXN*1.TF", "low")[1]);
        print("condition1:", condition1);
        print("condition2:", condition2);
        print("condition3:", condition3);
        //raiseRunTimeError("Stop");
    end;
end;

我想要用大台的資料,操作小台,想在大台收K後跌破5ma出場,但還沒有跌破,程式就執行出場,

看紀錄出場的位置,跟線圖也對不上,想請問問題出在哪?
(17:10的收K,大台是20360,小台也是20360,紀錄卻顯示20355,XQ Log 連結已用mail寄出)

 

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

 Hello ED87,

 

在策略中跨商品時不同商品並不會同時結束K棒,兩者在處理上會有一些時間差。

建議您在判斷時可以同時檢查兩者的time是否相同,就您印出的資訊來看大台的資訊還在170500的這根Bar。

就時間來看大台Bar更新速度有點慢,小編會請相關人員確認。

 

另外您的 condition11 會讓腳本在分鐘為5的倍數時才判斷進出場,但這跟 避免maAverage在K線未收線就變動 似乎沒有關係。

因為您條件中用到的 maAverage 都是 [1],是上一根K棒的資訊,故同一根Bar中印出的資訊都會是相同的。

但須注意由於是計算大台的平均,故一樣會受到不同商品更新K棒時間落差的影響。

ED87 發文於   2024/04/04

謝謝小編

那請問判斷時要同時檢查兩者的time是否相同,用以下的程式碼是否可以達到預期的效果呢?

Value1 = currentTime;
value2 = getsymbolField("FITXN*1.TF", "time");

condition11 = minute(Value1) = minute(Value2); //確保大小台都完成收K


還有請問

如何在小台去取得大台的KDJ呢?

 

XS小編 發文於   2024/04/08

Hello ED87,

 

小編不建議用 currenttime,因為這是本機時間,可能會和伺服器的時間有所落差。

建議您可以用 time 來作比較,舉例來說:

condition1 = time = getsymbolfield("FITXN*1.TF", "Time");

這樣就會比較兩個商品的K棒相對位置是否正確。

 

要跨商品計算KDJ的話,目前的函數是無法作到的。

您可以參考內建的Stochastic函數作修改。

ED87 發文於   2024/04/08

感謝小編~

ED87 發文於   2024/04/18

 請問小編:

要跨商品計算KDJ的話,我該如何參考內建的Stochastic函數作修改,找不到相關的方法。

XS小編 發文於   2024/04/19

Hello ED87,

 

您可以複製內建的 Stochastic 函數內容,將裡面的 high, low, close 修改為用 GetSymbolField 取得的大台價格 (ex. GetSymbolField("FITXN*1.TF", "High"))。

這樣就可以計算出大台的KD值。

而J值則是用K值與D值計算出來,可以在使用函數取得KD後另外計算。

 

ED87 發文於   2024/04/19

感謝小編~

發表回覆
Close