(小幫手處理中) 如何將series變數傳進自訂函數?

  •   399 
  • 最後發表   Sadless  2020 十月 06
Sadless 發文於   2020/09/25

我看了系統裡面的 Summation 寫法,如下:

SetBarMode(1);

input:thePrice(numericseries); //"價格序列"
input:Length(numericsimple);   //"計算期間"

variable:Sum(0),SumLength(0);
Sum=0;

for SumLength = 0 to Length - 1
begin 
    Sum = Sum + thePrice[SumLength];
end;

Summation = Sum;
        

如果我呼叫 Summation(close, 5)

summation 裡面看起來是用陣列的方式在處理thePrice,因為他用從0開始處理,而series應該是從1開始處理。

for SumLength = 0 to Length - 1
begin 
    Sum = Sum + thePrice[SumLength];
end;

 

這表示當我把 close 這個 series 數列 傳進去 Summation() 的函式之後,該函式會把 close 這個 series 數列,轉成 thePrice這個陣列,進行運算。

這表示series數列不能這樣子直接傳進去自訂函數當作一個series數列。

 

請問小幫手,XS裡面有方法可以把 series數列傳入函式,再把 series 數列傳出函式嗎?

排序方式: 標準 | 最新
Sadless 發文於   2020/09/26

以下是我目前的理解。

我所指的序列變數,是指CloseD(1)、HighD(1) 等的用法。

例如, HighD() 其實可以找到系統裡面有個自訂函式,如下:

SetBarMode(1);

input: PeriodsAgo(numericsimple);

HighD = GetField("High","D")[PeriodsAgo];

 

因此series序列變數,如:CloseD(1)、HighD(1) 等,不應該看成一個序列變數,而應該看成一個序列函數。

這表示 series 序列變數其實是一個序列函數,而XS似乎不能把序列函數當成一個參數,傳進去自訂函數使用。

 

如果把序列函數送進自訂函數裡面,傳遞進去的是一個value,而這個value會以陣列的形式儲存。

有趣的是,HighD(1) 送進去函數之後,假設用HighD_Array承接,而該頻率是1分鐘。

HighD_Array[0] 會是 HighD(1),但是HighD_Array[1] 並不是 HighD(2)。

我不理解 HighD_Array[1] 代表的意義是甚麼。

 

所以我寫了一個指標腳本來測試看看。

測試指標腳本: Test.series_function

//Test.series_function

variable:HighD_Array(0); HighD_Array=0;

HighD_Array = highD(1);//昨天的最高價

plot1(highD(1),"highD(1)");

plot2(HighD_Array[0], "HighD_Array[0]");
plot3(HighD_Array[0 + 1], "HighD_Array[0 + 1]");
plot4(HighD_Array[0 + 2], "HighD_Array[0 + 2]");

plot5(HighD_Array[0 + 4.5*60 + 0], "HighD_Array[0 + 4.5*60 + 0]");
plot6(HighD_Array[0 + 4.5*60 + 1], "HighD_Array[0 + 4.5*60 + 1]");
plot7(HighD_Array[0 + 4.5*60 + 2], "HighD_Array[0 + 4.5*60 + 2]"); 

 

執行腳本之後,觀察點放在9:00的結果如下:

highD(1)                                  616

  • highD(1)代表昨天的最高點 616

HighD_Array[0]                       616

  • HighD_Array[0] 承接的是今天 9:00 看的 HighD(1),也就是昨天的最高點 616

HighD_Array[0 + 1]                 619

  • HighD_Array[0 + 1] 承接的是昨天 13:29 看的 HighD(1),也就是前天的最高點 619

HighD_Array[0 + 2]                 619

  • HighD_Array[0 + 2] 承接的是昨天 13:28 看的 HighD(1),也就是前天的最高點 619

 

HighD_Array[0 + 4.5*60 + 0]   619

  • HighD_Array[0 + 4.5*60 + 0] 承接的是昨天 9:00 看的 HighD(1) ,也就是前天的最高點619

HighD_Array[0 + 4.5*60 + 1]   615

  • HighD_Array[0 + 4.5*60 + 1] 承接的是前天 13:29 的 HighD(1) ,也就是大前天的最高點 615

HighD_Array[0 + 4.5*60 + 2]   615

  • HighD_Array[0 + 4.5*60 + 2] 承接的是昨天 13:28 的 HighD(1) ,也就是大前天的最高點 615

 

{ 4.5*60 表示 9:00 ~13:29 共 4.5個小時,每小時60分鐘 }

{ 在XS的時間序列上,沒有13:30這個時間點,一天的最後一個時間點是13:29 }

 

 

而執行腳本之後,觀察點放在9:01的結果如下:

highD(1)                                  616,highD(1)代表昨天的最高點 616

HighD_Array[0]                       616

  • HighD_Array[0] 承接的是今天 9:01 看的 HighD(1),也就是昨天的最高點 616

HighD_Array[0 + 1]                 616

  • HighD_Array[0 + 1] 承接的是昨天 9:00 看的 HighD(1),也就是昨天的最高點 616

HighD_Array[0 + 2]                 619

  • HighD_Array[0 + 2] 承接的是昨天 13:29 看的 HighD(1),,也就是前天的最高點 619

 

HighD_Array[0 + 4.5*60 + 0]   619

  • HighD_Array[0] 承接的是昨天 9:01 看的 HighD(1) ,也就是前天的最高點 619

HighD_Array[0 + 4.5*60 + 1]   619

  • HighD_Array[0 + 4.5*60 + 1] 承接的是前天 9:00 的 HighD(1) ,也就是前天的最高點 619

HighD_Array[0 + 4.5*60 + 2]   615

  • HighD_Array[0 + 4.5*60 + 2] 承接的是昨天 13:29 的 HighD(1) ,也就是大前天的最高點 615

 

{ 4.5*60 表示 9:00 ~13:29 共 4.5個小時,每小時60分鐘 }

{ 在XS的時間序列上,沒有13:30這個時間點,一天的最後一個時間點是13:29 }

 

綜合以上的結果,推論如下:

在頻率為1分鐘的環境,當 HighD_Array = highD(1); 

HighD_Array[0] 指的是 "在該時間點看 highD(1) 的值"。

而 HighD_Array[0 + i] 則是指 "在該時間點回跳 i 分鐘,在回跳的時間點看 highD(1) 的值"。

 

以上的推論,再麻煩小幫手指正,感謝小幫手。

 

XQ小幫手 發文於   2020/09/29

Sadless 您好

這個可能需要讓小幫手研究一下

因為說實在我也沒有像您一樣,

把函數的構成研究的如此徹底

我會再向開發的相關人員請教一下原理

謝謝

Sadless 發文於   2020/10/06

好的,再麻煩小幫手了。

發表回覆
Close