函數請益

  •   671 
  • 最後發表   小梯子  2025 五月 16
小梯子 發文於   2025/02/07

想寫CCI跨頻率函數(系統沒有), 日跨周頻率和日跨月頻率,請指教,感激不盡.

排序方式: 標準 | 最新
小梯子 發文於   2025/02/07

-接上頁 : CCI「Commodity Channel Index」(商品通道指標)

【CCI的計算式】

CCI=(TP-MA)/0.015×MD
TP=(最高價+最低價+收盤價)/3
MA=n日間的TP移動平均
MD=TP-MA的平均偏差

 

XQ系統已有CCI函數

SetBarMode(1);

{Length : CCI指標計算期間}

input: Length(numeric);

cci = CommodityChannel(Length);

但沒有跨頻率CC函數( xf_CCI).

我不曉得怎麼寫,請您指導.

 

虎科大許教授 發文於   2025/02/07

自訂跨頻率函數已是高階課程的內容。以後我會開設高階課程,若有機會再過來學習。

小梯子 發文於   2025/02/07

好的,謝謝.

XS小編 發文於   2025/02/11

Hello 小梯子,

 

您可以參考 CommodityChannel 函數內容去作修改,將使用的價格欄位改成所需的頻率,搭配 xfMin_GetValue 來取得所需的變數前期值計算。

小梯子 發文於   2025/05/15

管理員 : 

我用CommodityChannel函數內容去作修改並用xfMin_GetValue來取得所需的變數前期直計算.

但這跨頻率xf_CommodityChannel函數仍不正確,請問要如何修改.

SetBarMode(2);

input: FreqType(string), //引用頻率

length(numericsimple);   //計算期間

variable: avgtp(0),idx(0),sumDist(0);

switch (upperstr(FreqType))

begin  

case "AW":  

        value1 = xfMin_GetValue("AW",HIGH,0);   

        value2 = xfMin_GetValue("AW",low,0);   

value3 = xfMin_GetValue("AW",close,0);   

 

case "AM":

value1 = xfMin_GetValue("AM",HIGH,0);   

value2 = xfMin_GetValue("AM",LOW,0);  

value3 = xfMin_GetValue("AM",CLOSE,0);  

 

default:

value1 = HIGH;

value2 = LOW;

value3 = Close;                                     

end; 

 

avgtp = average(value1 + value2 + value3, length);  

sumDist = 0;

for idx = 0 to length - 1 

begin

sumDist = sumDist + AbsValue(avgtp[idx] - (value1 + value2 + value3)[idx]); 

end;

sumDist = sumDist / length;

if sumDist <> 0 then

  xf_CommodityChannel = (value1 + value2 + value3 - avgtp) / (0.015 * sumDist)

else

 

  xf_CommodityChannel = 0;

虎科大許教授 發文於   2025/05/15

CCI的跨頻率函數處理方式與KD跨頻率函數xf_Stochastic的處理方式類似,可參考著做。

小梯子 發文於   2025/05/15

謝謝虎科大許教授的指導,我來試試.

小梯子 發文於   2025/05/15

請虎科大許教授再指導一下,如何再做進一步的修改.

SetBarMode(2);

input: FreqType(string), //引用頻率

       length(numericsimple);   //計算期間

      variable: avgtp(0),idx(0),sumDist(0);

 

condition1 = xf_getdtvalue(FreqType, getFieldDate("Date")) <> xf_getdtvalue(FreqType, getFieldDate("Date")[1]);

if condition1 then

begin

avgtp = avgtp[1]; 

       sumDist = sumDist[1];

end;

 

switch (upperstr(FreqType))

begin  

case "AW":  

value1 = GetField("High", "AD");   

        value2 = GetField("Low", "AD");   

value3 = GetField("Close", "AD");   

 

case "AM":

value1 = GetField("High", "AM");   

        value2 = GetField("Low", "AM");   

value3 = GetField("Close", "AM");   

 

 

default:

value1 = HIGH;

value2 = LOW;

value3 = Close;                                     

 

end; 

 

 

avgtp = average(value1 + value2 + value3, length);  

sumDist = 0;

 

for idx = 0 to length - 1 

begin

sumDist = sumDist + AbsValue(avgtp[idx] - (value1 + value2 + value3)[idx]); 

 

end;

 

sumDist = sumDist / length;

 

if sumDist <> 0 then

  xf_CommodityChannel = (value1 + value2 + value3 - avgtp) / (0.015 * sumDist)

else

  xf_CommodityChannel = 0;

 

虎科大許教授 發文於   2025/05/16

SetBarMode(2);
input: FreqType(string), //引用頻率
       length(numericsimple);   //計算期間
variable: avgtp(0),idx(0),sumDist(0);
if FreqType="D" or FreqType="AD" or FreqType="W" or FreqType="AW" or FreqType="M" or FreqType="AM" then 
    condition1 = xfMin_getdtvalue(FreqType, getfieldDate("Date")) <> xfMin_getdtvalue(FreqType, getfieldDate("Date")[1])
else 
    condition1 = xfMin_getdtvalue(FreqType, datetime) <> xfMin_getdtvalue(FreqType, datetime[1]); 
if condition1 then
    begin
        sumDist = sumDist[1];
        avgtp = avgtp[1];
    end;    
switch (upperstr(FreqType))
    begin  
        case "AW":  
            sumDist = 0;
            for idx = 0 to length - 1 
                begin
                    sumDist = sumDist 
                    + AbsValue(average(GetField("High", "AW")[idx] + GetField("Low", "AW")[idx] + GetField("Close", "AW")[idx], length)
                    - (GetField("High", "AW")[idx] + GetField("Low", "AW")[idx] + GetField("Close", "AW")[idx])); 
                end;
            sumDist = sumDist / length;
            avgtp=GetField("High", "AW") + GetField("Low", "AW") + GetField("Close", "AW")- average(GetField("High", "AW") + GetField("Low", "AW") + GetField("Close", "AW"), length);
        case "AM":
            sumDist = 0;
            for idx = 0 to length - 1 
                begin
                    sumDist = sumDist 
                    + AbsValue(average(GetField("High", "AM")[idx] + GetField("Low", "AM")[idx] + GetField("Close", "AM")[idx], length)
                    - (GetField("High", "AM")[idx] + GetField("Low", "AM")[idx] + GetField("Close", "AM")[idx])); 
                end;
            sumDist = sumDist / length;
            avgtp=GetField("High", "AM") + GetField("Low", "AM") + GetField("Close", "AM")- average(GetField("High", "AM") + GetField("Low", "AM") + GetField("Close", "AM"), length);
        default:
            sumDist = 0;
            for idx = 0 to length - 1 
                begin
                    sumDist = sumDist 
                    + AbsValue(average(GetField("High")[idx] + GetField("Low")[idx] + GetField("Close")[idx], length)
                    - (GetField("High")[idx] + GetField("Low")[idx] + GetField("Close")[idx])); 
                end;
            sumDist = sumDist / length;
            avgtp=GetField("High") + GetField("Low") + GetField("Close")- average(GetField("High") + GetField("Low") + GetField("Close"), length);
    end; 
if sumDist <> 0 then
  xf_CommodityChannel = avgtp / (0.015 * sumDist)
else
  xf_CommodityChannel = 0;

小梯子 發文於   2025/05/16

感謝虎科大許教授的指導.

顯示更多回應 發表回覆
Close