程式碼:
inputs: PeriodsAgo( numericsimple ) ;
variables: var0( 0 ), var1( 0 ), var2( 0 ), var3( 0 ) ;
Value1 = OHLCPeriodsAgo( 1, PeriodsAgo, var0, var1, var2, var3 ) ;
HighD = var1 ;
這段程式碼是用以計算HighD。
那,問題來了。
1. HighD是什麼?
2. 這些編碼的涵義又是什麼?
3. Value1有什麼作用?
4. 這個程式碼並沒有引用Value1,
為什麼不要直接寫HighD = var1 就好?
5. 為什麼 Value1 沒有明確宣告,卻可以直接被賦值呢?
解說:
這段程式碼的主要目的是從歷史數據中提取特定週期前的最高價,並將其存儲在變數 HighD 中。
而各變數與函數的意義:
PeriodsAgo: 這個參數用來指定要回溯的週期數。例如,如果 PeriodsAgo 為 5,那麼程式就會取5個週期前的數據。
var0, var1, var2, var3: 這些變數是 OHLCPeriodsAgo 函數用來儲存回溯數據的臨時變數。
OHLCPeriodsAgo: 這個函數用於獲取指定週期前的開盤價 (Open)、最高價 (High)、最低價 (Low) 和收盤價 (Close)。
Value1: 這個變數用來暫時存儲 OHLCPeriodsAgo 函數的返回值。雖然在後續的程式碼中沒有直接使用 Value1,但它在函數的運算過程中扮演了重要的角色。
HighD: 這個變數就是我們最終想要得到的結果,也就是指定週期前的最高價。
為什麼不直接寫 HighD = var1?
函數的設計: OHLCPeriodsAgo 函數的設計就是將獲取的OHLC數據分別存儲在不同的變數中,然後返回一個值(通常是收盤價)。
程式可讀性: 將獲取的最高價存儲在 var1 中,然後再將 var1 的值賦給 HighD,可以使程式碼更清晰易懂,提高可維護性。
通用性: 這樣設計的程式碼具有更好的通用性。如果需要獲取其他數據(如最低價),只需要修改一下變數的引用即可。
程式碼的運作流程:
設定回溯週期: 指定 PeriodsAgo 的值,決定要回溯多少個週期。
調用 OHLCPeriodsAgo 函數: 該函數會根據 PeriodsAgo 的值,從歷史數據中獲取指定週期的OHLC數據,並將這些數據分別存儲在 var0, var1, var2, var3 中。
提取最高價: 將 var1 中的最高價賦值給 HighD。
PowerLanguage中的隱式宣告
在PowerLanguage中,
很多時候變數不需要事先宣告,
系統會根據賦值的操作自動推斷變數的類型。
這是一種動態類型語言的特性,
可以簡化程式碼的書寫。
在程式碼中,
Value1 = OHLCPeriodsAgo( 1, PeriodsAgo, var0, var1, var2, var3 ) ;
這行代碼的執行過程大致如下:
呼叫OHLCPeriodsAgo函數: 這個函數會計算出指定週期前的收盤價,並將這個值作為返回值。
賦值給Value1: 函數的返回值會直接賦值給Value1。
由於OHLCPeriodsAgo函數的返回值是一個數值,
所以系統會自動將Value1的類型推斷為數值型。
因此,Value1不需要事先宣告的原因是:
動態類型: PowerLanguage允許在賦值時自動推斷變數的類型。
函數返回值: OHLCPeriodsAgo函數的返回值決定了Value1的類型。
雖然PowerLanguage允許動態類型宣告,
但建議在書寫程式碼時,
還是儘量明確地宣告變數的類型,
這樣可以提高程式碼的可讀性和可維護性。
示例:
inputs: PeriodsAgo( numericsimple ) ;
variables: var0( 0 ), var1( 0 ), var2( 0 ), var3( 0 ), Value1( numeric );
Value1 = OHLCPeriodsAgo( 1, PeriodsAgo, var0, var1, var2, var3 ) ;
HighD = var1 ;
這樣寫雖然多了一個變數宣告,
但是明確了Value1的類型,
讓程式碼更清晰。