警示腳本 近15分鐘外盤量比率問題請益

  •   39 
  • 最後發表   小梯子  2 天前
小梯子 發文於   2024/09/28

想在1分K警示腳本把前1日近15分鐘外盤量比率大於89%的次數超過20次,當天策略雷達出現警示訊號.

但次數不對,請問要怎麼修改.

 

//警示腳本  1分K 前一日近15分鐘外盤量比率超過89%的次數超過20次

var: _or15B(0), _ir15B(0);

_or15B = outsizeBefore(15,15);//前一日近15分鐘外盤比率

variable: intrabarpersist Xtime15B(0);

variable: intrabarpersist Volumestamp15B(0);

Volumestamp15B =_or15B; 

if Date > date[1]  then Xtime15B =0; 

if _or15B >= 89 then Xtime15B+=1; 

if Xtime15B > 20 then ret = 1 ;

print(date, time, "Xtime15B=", NumToStr(Xtime15B, 0));

 

//函數 OutSizeBefore為前1日近N分鐘外盤量比率

Input:length1(numericsimple), length2(numericsimple);

array: _ArrayOutSize[](0), _ArrayInSize[](0);

Array_SetMaxIndex(_ArrayOutSize, length1);

Array_SetMaxIndex(_ArrayInSize, length2);

var:_Count(0);

//初始化

if getfieldDate("Date") <> getfieldDate("Date")[1] then begin

 _Count = 0;

 Array_SetValRange(_ArrayOutSize, 1, length1, 0); 

 Array_SetValRange(_ArrayInSize, 1, length2, 0);

 value3 = 0;

 value98 = 0;

 value99 = 0;

end else begin

 _Count += 1;

end;

value98 = mod(_count,length1) + 1;

value99 = mod(_count,length2) + 1;

 

_ArrayOutSize[value98] = GetField("外盤量","1")[270] ;

_ArrayInSize[value99] = GetField("內盤量", "1")[270] ;

value1 = Array_Sum(_ArrayOutSize, 1, length1);

value2 = Array_Sum(_ArrayInSize, 1, length2);

 

if (value1+value2) <> 0 then

OutSizeBefore = (value1/(value1+value2))*100 

else OutSizeBefore = 0 ;

 

 

台積電做回測

 

 

 

20240918.000000 0.000000 Xtime15B= 1 

20240919.000000 0.000000 Xtime15B= 1 

20240920.000000 0.000000 Xtime15B= 1 

20240923.000000 0.000000 Xtime15B= 1 

20240924.000000 0.000000 Xtime15B= 1 

20240925.000000 0.000000 Xtime15B= 1 

20240926.000000 0.000000 Xtime15B= 1 

20240927.000000 0.000000 Xtime15B= 1 

 

以台積電今日 20240928為例, 前一日20240927近15分鐘外盤量比率超過89%的次數是15次(見以下指標腳本), 不是1次 請問要如何修改 ?

 

指標腳本

計算每天 1分k 近15分鐘外盤量比率>89%出現幾次的計數程式

var: _or15(0);

_or15 = outsize(15,15);//近15分鐘外盤量比率

variable: intrabarpersist Xtime15(0);

variable: intrabarpersist Volumestamp15(0);

Volumestamp15 =_or15;

if Date> date[1] then Xtime15 =0; 

if _or15 >= 89 then Xtime15+=1;

plot1(Xtime15,"近15分鐘外盤量比率大於89%次數");

 

函數 outsize 當日近N分鐘外盤量比率函數

Input:length1(numericsimple), length2(numericsimple);

array: _ArrayOutSize[](0), _ArrayInSize[](0);

Array_SetMaxIndex(_ArrayOutSize, length1);

Array_SetMaxIndex(_ArrayInSize, length2);

var:_Count(0);

//初始化

if getfieldDate("Date") <> getfieldDate("Date")[1] then begin

_Count = 0;

Array_SetValRange(_ArrayOutSize, 1, length1, 0);

Array_SetValRange(_ArrayInSize, 1, length2, 0);

value3 = 0;

value98 = 0;

value99 = 0;

end else begin

_Count += 1;

end;

value98 = mod(_count,length1) + 1;

value99 = mod(_count,length2) + 1;

 

_ArrayOutSize[value98] = GetField("外盤量","1") ;

_ArrayInSize[value99] = GetField("內盤量", "1") ;

value1 = Array_Sum(_ArrayOutSize, 1, length1);

value2 = Array_Sum(_ArrayInSize, 1, length2);

 

if (value1+value2) <> 0 then

OutSize = (value1/(value1+value2))*100  

else OutSize = 0 ;

 

 

 

 

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

我看了你程式碼,外盤量比率是每15分鐘的外盤量加總除以(每15分鐘外盤量加總再加上每15分鐘內盤量加總),且每分鐘都計算一次。若符合比率大於89%,則次數加1。

若我上述與你的需求相同,則處理這類問題,應該不需要用到陣列又用到函數,可以更簡單地處理。另外,若都用台積電前15分鐘計算外盤量比,我整理了台積電9/27的相關數據,次數都是0。你看看下列的Excel檔案運算與你想要的是否相同。

https://docs.google.com/spreadsheets/d/1clMwGCY8NpGwRciYC9Bi2WRCXYMWahI3/edit?usp=drive_link&ouid=102722156881406426653&rtpof=true&sd=true

 

小梯子 發文於   2024/10/01

我看了你程式碼,外盤量比率是每15分鐘的外盤量加總除以(每15分鐘外盤量加總再加上每15分鐘內盤量加總),且每分鐘都計算一次。若符合比率大於89%,則次數加1。

若我上述與你的需求相同,則處理這類問題,應該不需要用到陣列又用到函數,可以更簡單地處理。

很景仰許教授的專業,我的需求與您上述的相同,請問許教授該如何才可以更簡單地處理,謝謝許教授的指導.

另外,若都用台積電前15分鐘計算外盤量比,我整理了台積電9/27的相關數據,次數都是0。你看看下列的Excel檔案運算與你想要的是否相同。

謝謝許教授的細心,您Excel檔案運算與我想要的是相同的.

https://docs.google.com/spreadsheets/d/1clMwGCY8NpGwRciYC9Bi2WRCXYMWahI3/edit?usp=drive_link&ouid=102722156881406426653&rtpof=true&sd=true

虎科大許教授 發文於   2024/10/02

程式碼可簡化撰寫如下:

if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");

input: period(15,"期數");

input: percent(89,"趴數");

setTotalBar(270-period);

var: count(0);

if v>0 then

begin

value1=summation(GetField("外盤量"),period);

value2=value1+summation(GetField("內盤量"),period);

if 100*(value1/value2)>percent then count+=1;

end;

print(date,time,value1,value2,100*(value1/value2),count);

虎科大許教授 發文於   2024/10/02

若今天開始即時洗價,有訊號就警示,可在上述程式最後面加上以下程式碼:

if isfirstCall("Realtime") then 

   if count>20 then ret=1;

小梯子 發文於   2024/10/04

非常感謝許教授的回覆, 我來試試.

小梯子 發文於   2024/10/04

許教授:

第1點:請問我想先把近15分鐘外盤量比率依您的程式碼寫成OuterRatio函數 如下 以近一步簡化: 

if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");

input: period(numericsimple);

setTotalBar(270-numericsimple);

var: count(0);

if v>0 then

begin

value1=summation(GetField("外盤量"),period);

value2=value1+summation(GetField("內盤量"),period);

OuterRatio =  100*(value1/value2);

end;

編輯後 出現以下 : 

編譯器看到了一個無法辨認的字 "setTotalBar(270-numericsimple",請檢查這個字有沒有寫錯。

請問要如何修改 ? 

 

第2點: Excel檔案運算是前一日的資料, 與我想要的相同.

 

即前一日近15分鐘外盤量比率大於89%次數若超過20次,今天就警示,程式碼要怎麼寫 ?

 

 

虎科大許教授 發文於   2024/10/04

(1)由於函數的參數不一定要賦予數值,所以在函數腳本裡面呼叫SetTotalBar函數要賦予常數。

(2)我前面的警示腳本,就是在前一日近15分鐘外盤量比率大於89%次數若超過20次,今天就警示。

(3)若你的OuterRatio函數只是單純回傳每根K棒的外盤量比率,不應該setTotalBar,也不需要用到count變數。

//OuterRatio函數內容如下:

if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");

input: period(numericsimple);

value1=summation(GetField("外盤量"),period);

value2=value1+summation(GetField("內盤量"),period);

OuterRatio =  IFF(value2>0,100*(value1/value2),0);

//警示腳本內容

setTotalBar(270);

 if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");

input: period(15,"期數");

input: percent(89,"趴數");

var: count(0);

if currentBar>=period then //第15根K棒開始計算

   if OuterRatio(Period)>percent then count+=1;

//當天第一筆即時價格進來時,判斷前一個交易日外盤量比率大於89的次數是否超過20

if isfirstCall("Realtime") then 

   if count>20 then ret=1;

 

小梯子 發文於   2024/10/06

由衷感謝許教授的回覆.

發表回覆
Close