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

函數請益
- 671
- 最後發表 小梯子 2025 五月 16
-接上頁 : 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).
我不曉得怎麼寫,請您指導.
自訂跨頻率函數已是高階課程的內容。以後我會開設高階課程,若有機會再過來學習。
好的,謝謝.
管理員 :
我用CommodityChannel函數內容去作修改並用xf
但這跨頻率xf_
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;
CCI的跨頻率函數處理方式與KD跨頻率函數xf_Stochastic的處理方式類似,可參考著做。
謝謝虎科大許教授的指導,我來試試.
請虎科大許教授再指導一下,如何再做進一步的修改.
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;
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;
感謝虎科大許教授的指導.
13 評論