XS_指標腳本轉成自動交易腳本_只計算一次過往N天的資料問題

  •   307 
  • 最後發表   expe  2024 七月 19
expe 發文於   2024/07/15

input: T1(084500, "開始時間01");
input: T2(134400, "結束時間01");

input: dago(5, "計算幾天前的資料");

var: _len(0), _len01(0), _len02(0), _len03(0), _len04(0), _len05(0), i(0), VarT(0), Target(0);
var: _d1(0), _d2(0), _d3(0), _d4(0), _d5(0), TotalVolume(0), CDVolume(0),temp01(0),temp02(0);
Variables:Re_H(0),Re_L(0),Re_TR(0);
Array: intrabarpersist tov[20](0),intrabarpersist tov01[20](0),intrabarpersist tov02[20](0),intrabarpersist tov03[20](0),intrabarpersist tov04[20](0),intrabarpersist tov05[20](0),intrabarpersist PTVolume[10](0);
Array: intrabarpersist TR01[6](0),intrabarpersist TR02[6](0),intrabarpersist TR03[6](0),intrabarpersist TR04[6](0),intrabarpersist TR05[6](0),intrabarpersist MeanTR[6](0);
Array: intrabarpersist firsttime[6](false);

Condition1 = time>=T1 and time<=T2;


if Time=T1 then CDVolume=0;
CDVolume = CDVolume + Volume;   // 計算目前時段的成交量 加總
Print(CDVolume,"目前時段總量");


if Condition1 then begin
        _len01 = timeDiff(T2,T1,"M")+1;
        if time=T1 then begin
            Re_H = High;
            Re_L = Low;
        end;
        if Re_L>Low then Re_L=Low;
        if Re_H<High then Re_H=High;

        if Time=T2 then begin
            for i=dago DownTo 2 begin
                tov01[i] = tov01[i-1];
                TR01[i] = TR01[i-1];
            end;
            tov01[1] = summation(Volume, _len01);
            TR01[1] = Re_H-Re_L;    // 該時段的高低差
        End;
        PTVolume[1] = Array_Sum(tov01,1,dago);
        MeanTR[1] = Array_Sum(TR01,1,dago);


    Alert(PTVolume[1],"N日前_日盤總量");
Alert(PTVolume[1]/dago,"N日前_時段均量"); Alert(MeanTR[1]/dago,"ATR"); end; // if Condition1的end Print(PTVolume[1],"日盤總量"); Print(PTVolume[1]/dago,"時段均量"); Print(MeanTR[1]/dago,"ATR");

上述是我選定商品為台指期(FITXN*1.TF),頻率設定為1分K,並開啟逐筆洗價的腳本

 

想要達成一開始只計算一次過往的成交量資料(因為過往的資料是固定的數值,不會發生改變,因此只想要讓電腦計算一次後,將該數值拿來做其他運算使用),尤其是上述計算的PTVolume[1]/dago 時段均量的這個數值

 

想請教該如何修改程式碼,才能達成?

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

if time=T1 then 
   begin
       PTVolume[1] = Array_Sum(tov01,1,dago);
       MeanTR[1] = Array_Sum(TR01,1,dago);
       Alert(PTVolume[1],"N日前_日盤總量");
       Alert(PTVolume[1]/dago,"N日前_時段均量");
       Alert(MeanTR[1]/dago,"ATR");
   end;

expe 發文於   2024/07/15

感謝教授幫忙回覆,

我在XS語法沒有使用 if time=T1的限制時,執行自動交易腳並print出數值 都會是0,如下圖

 

至於若再加上if time=T1的限制,就要再找時間來測試看看了

expe 發文於   2024/07/15

 

if Condition1 then begin

...

...

...

end;

我是希望上述的那一段程式,能達成計算歷史K棒的資料,而計算完成了之後將所計算好的數據資料拿來做其他計算即可,就不希望電腦一直重複再跑這一段程式碼(因為歷史K棒的數據資料不會發生變動了)

虎科大許教授 發文於   2024/07/15

if getInfo("IsRealTime")=1 and time=T1 then

      once(true)

            begin

                  if condition1 then

                        begin

                              ........

                        end;

            end;

XS小編 發文於   2024/07/19

 Hello expe,

 

小編補充,如果您只需要計算一次的話,可以使用 once 函數,或是用變數來記錄運算的次數。

後者的話還可以視情況重置變數讓條件內邏輯能夠再次運算。

 

另外您設定為逐筆洗價的話,建議要保留資訊的變數/陣列使用 intrabarpersist 宣告,避免變數/陣列沒有保存同根Bar內運算值的狀況。

發表回覆
Close