自訂函數被莫名執行

  •   329 
  • 最後發表   宇航  2024 十一月 08
宇航 發文於   2024/11/07

寫了一個指標(以下簡化)

var:Q_Close(0),Month_Close(0),Week_Close(0),Day_Close(0),Day_High(0),Day_Low(0),Val_Close(0),Val_High(0),Val_Low(0),Q_Close_Num(0);

var: Base1_Val(0),Base2_Val(0),Base3_Val(0),Base4_Val(0),Base5_Val(0),Base6_Val(0),Base7_Val(0),Base8_Val(0);

variable: intrabarpersist Run_K(0); //預留數

var:Log_File("[StrategyName]_[Symbol]_[Date]_[StartTime].log"); //LOG檔案名稱

 

Input: Space0("", "-----------參數設定------------");

input: K_Num(18, "頻率", inputkind:=Dict(["日",1],["60分鐘",5],["30分鐘",9],["15分鐘",18],["10分鐘",27],["5分鐘",54],["1分鐘",270]));

Input: Find_Days(2,"前推根數(日)");

Input: Pre_Days(2,"預留天數");

Input: Line_Week("","A.設定周線");

input: Moudle_Week(2, " 計算方式", inputkind:=Dict(["SMA",1],["EMA",2]));

settotalbar((Find_Days + Pre_Days) * K_Num);

Run_K = Run_K + 1;

if Run_K < (Pre_Days * K_Num) then

return;

 

Print(file(Log_File),"日期時間:",NumToStr(Datetime,0));

Val_Close = GetField("close"); //根收盤價

Day_Close = average(Close,K_Num); //日收盤價

 

Week_Close = Base_Val_Back_Num(Moudle_Week,5 * K_Num); //周收盤價



以上
當我頻率選擇15分鐘時(除日以外其他都會有問題)
照理說前35K都會被忽略(return)
問題來了
LOG檔顯示前35K的Base_Val_Back_Num函數都會被執行
請問這是甚麼問題
附上函數:

var:Log_File("[StrategyName]_[Symbol]_[Date]_[StartTime].log"); //LOG檔案名稱

input:Moudle(numericsimple),Num(numericsimple);

Print(file(Log_File)," (函數)日期時間:",NumToStr(Datetime,0),"Moudle:",NumToStr(Moudle,0),"Num:",NumToStr(Num,0));

Base_Val_Back_Num = 0;

Base_Val_Back_Num = average(Close,Num); //計算期間收盤價的 SMA

if Moudle = 2 then

 

Base_Val_Back_Num = EMA(Close,Num); //計算期間收盤價的 EMA

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

照理說前35K都會被忽略(return)

函數執行次數,是由主程式決定,呼叫幾次就執行幾次。你用intrabarpersist宣告Run_K,是每個Tick都會讓這個變數加1,而非每根K棒。

宇航 發文於   2024/11/07

謝謝許教授指教
我敘述有誤,不是35K而是35 Tick
我的主程式中應該會被執行72次((2+2)*18)
而前35次應該在return就不會往下執行了

但奇怪的是前35次的
Print確實沒有執行,而更下面的Base_Val_Back_Num函數卻執行了!

請問這是我對於程式運行的理解哪裡出了問題嗎?

再次向許教授請教,感謝!

虎科大許教授 發文於   2024/11/08

Base_Val_Back_Num函數回傳的EMA數值需要前置資料,所以儘管前35根主程式不跑,但函數仍然必須被呼叫並計算數值。

宇航 發文於   2024/11/08

了解了~感謝回答!

發表回覆
Close