自訂估量比函數在指標中可以使用,拿去函數編譯沒問題,但是使用此編譯後的估量比函數跑不出數值

  •   150 
  • 最後發表   bigjohnsonlai  2023 三月 12
bigjohnsonlai 發文於   2023/02/27

以下為函數的程式碼

請問到底是其中哪個東西不支援函數語法嗎?

同樣內容複製去指標中是可以使用的

//

// 參數: 統計天期(N)

// 繪製: 當日估計成交量

//

// 支援任何頻率(分鐘/日)

//

// 計算方式: 依照過去N日, 每日1分鐘累計成交均量(統計天期平均), 算出每分鐘累計成交量的分佈比例, 

// 然後依照目前的累計日成交量以及分佈比例, 推算當日收盤估計成交量

//

variable: barcount(0);

if date <> date[1] then 

begin

barcount=1;

end

else

barcount+=1;

 

 

variable: BARPERDAY(270); // 1分鐘bar每一天270筆

 

array: arr_minvolume[](0); // (過去N日)每日每分鐘累計: 共length * 270筆

array: arr_minvolume_percent[270](0); // (平均)每分鐘累計成交量比例: 共270筆

array: arr_avg_minvolume[270](0); // (平均)每分鐘累計成交量: 共270筆

 

variable: _i(0), _j(0), _k(0);

variable: _totaldays(0);

variable: _lastdate(0);

 

Array_SetMaxIndex(arr_minvolume, 5* 270);

 

 

 

if _lastdate = 0 then begin

// 跳過第一個不滿一天的資料

if barfreq = "Min" then

_lastdate = date

else begin

// 日線的話則從20190101才開始算

if date >= 20190101 then

_lastdate = date;

end; 

end;

 

if _lastdate <> 0 and date <> _lastdate then begin

_lastdate = date;

_totaldays = _totaldays + 1;

if _totaldays >= 5 then begin

// 計算過去N天的成交量分佈

//

// 因為我可能跑在不同頻率上, 所以要先算出過去N日'1分鐘'資料的起點跟終點

//

variable: _start(0), _end(0), _startdate(0), _accvolume(0);

 

_end = 1;

while getfield("time", "1")[_end] <> 132900 begin

_end = _end + 1;

end;

 

_start = _end + BARPERDAY * 5 - 1;

 

// _start = 統計日期第一日第一筆1分鐘資料的位置

// _end = 統計日期最後一日最後一筆1分鐘資料的位置

//

 

// arr_minvolume[]: 儲存過去N天, 每一分鐘的日累積成交量

// arr_minvolume[1] = 09:00, 

// arr_minvolume[2] = 09:01

// arr_minvolume[271] = 第二天09:00

// ..

_startdate = getfield("date", "1")[_start];

_accvolume = 0;

for _i = _start downto _end begin

if _startdate <> getfield("date", "1")[_i] then begin

// 換日

_accvolume = 0;

_startdate = getfield("date", "1")[_i];

end;

_accvolume += getfield("volume", "1")[_i];

arr_minvolume[_start - _i + 1] = _accvolume; // 當日累積volume

end;

 

// arr_avg_minvolume[]: 每一分鐘的日平均累積成交量

//

for _j = 1 to BARPERDAY begin

arr_avg_minvolume[_j] = 0;

for _i = 1 to 5 begin

arr_avg_minvolume[_j] += arr_minvolume[_j + (_i - 1) * BARPERDAY];

end; 

end;

for _j = 1 to BARPERDAY begin

arr_avg_minvolume[_j] = arr_avg_minvolume[_j] / 5;

end;

 

// arr_minvolume_percent[]: 每一分鐘的日平均累積成交量%

//

for _j = 1 to BARPERDAY begin

arr_minvolume_percent[_j] = arr_avg_minvolume[_j] / arr_avg_minvolume[BARPERDAY];

end;

 

{

print(text(

"main-date=", numtostr(date, 0), ",",

"main-time=", numtostr(time, 0), ",",

"start=", numtostr(_start, 0), ",",

"end=", numtostr(_end, 0), ",",

"startdate=", numtostr(getfield("date", "1")[_start], 0), ",", numtostr(getfield("time", "1")[_start], 0), ",",

"enddate=", numtostr(getfield("date", "1")[_end], 0), ",", numtostr(getfield("time", "1")[_end], 0), ","

));

 

for _i = 1 to 270 begin

print(text(

numtostr(_i, 0), "=", 

numtostr(arr_minvolume_percent[_i] * 100, 2))); 

end; 

}

end;

end;

 

if _totaldays >= 5 then begin

// 如果已經有分佈資料了, 則計算估計成交量

//

variable: _estvolume99(0);

variable: _timeindex(0);

variable: _time(0), _v(0);

 

// 算出目前時間應該是1~270的哪一筆

// 分鐘線的話就用bar的時間

// 日線的話, 如果是歷史日線, 就用收盤時間估算, 如果是最後一天(盤中日線), 用目前時間估算

 

 

////////

 

{

if barfreq = "Min" then

_time = time

else begin

if date < currentdate then

_time = 132900

else 

_time = currenttime;

end;}

{

_timeindex = floor(timediff(_time, 090000, "M")) + 1;

_timeindex = minlist(_timeindex, 270);

_timeindex = maxlist(1, _timeindex);}

 

// 預估量 = 累計到目前的日成交量 / 這個時間點之前所佔的日成交量%

//

 

if arr_minvolume_percent[barcount] > 0 then

_estvolume99 = GetField("volume", "D") / arr_minvolume_percent[barcount]

else

_estvolume99 = 0;

end;

 

 

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/03/03

 Hello bigjohnsonlai,

 

小幫手可以正常使用畫出。(參考附圖)

函數最後要回傳數值的話需要使用函數名稱的變數,推測可能您沒將所需數值回傳。

舉例來說,小幫手將函數命名為 _estvolume,要回傳 _estvolume99 的數值,那麼最後就要加上一行 _estvolume = _estvolume99;

附加文件

bigjohnsonlai 發文於   2023/03/12

原來是這樣!

感謝小幫手~

已解決

發表回覆
Close