![]() |
在這個頁面顯示本主題全部的 10 個文章 |
奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- 操作數類型錯誤 (http://www.chiefox.com.tw/bbs/showthread.php?threadid=5075)
操作數類型錯誤
請問一下,我要寫一個技術指標,但是相關函數的參數是動態的.
但是在Compile 時,出現了 操作數類型錯誤 , 在 RSIVal 那一行有一個
變數是在前幾列運算出來的.
這一行出錯: 只因用了 Td 這個變數當成參數,用了常數就OK了.
RSIVal := SMA(MAX(CLOSE-LC,0),Td,1)/SMA(ABS(CLOSE-LC),Td,1)
而且我在處理Td 時,有用INTPART函數,避免了有小數點的問題.
煩請大大,撥空釋疑.謝謝!
指標 Source Code :
=====================================================
TdMax:= 30;
TdMin:= 5;
StdA := EMA(Std(Close,5),10);
Vi := IIF(StdA <> 0,Std(Close,5) / StdA,1);
Td := IIF(Vi <>0,INTPART(14 / Vi),1);
Td := IIF(Td > TdMax,TdMax,Td);
Td := IIF(Td < TdMin,TdMin,Td);
LC := REF(CLOSE,1);
RSIVal := SMA(MAX(CLOSE-LC,0),Td,1)/SMA(ABS(CLOSE-LC),Td,1)*100;
SDMI:1;
======================================================
SMA(X,N,M),求X的N日移動平均,M為權重。
算法:
若Y=SMA(X,N,M) 則 Y=(M*X+(N-M)*Y')/N, 其中Y'表示上一週期Y值,N必須大於M。
例如:
SMA(CLOSE,20,1)
表示求20日移動平均價
SMA(X,N,M) 其中的 N 和 M 必需為常數
您導入的 TD 為一個數值數列, 非單一數值
所以會出現操作數類型錯誤
請問,那如果用 EMA() 函數呢 ?
而怎麼將數值數列,變成單一數值呢 ?
如果可以轉換就可以使用了吧.
引用:
最初由 kending 發表
請問,那如果用 EMA() 函數呢 ?
而怎麼將數值數列,變成單一數值呢 ?
如果可以轉換就可以使用了吧.
請問 datacount 是從0開始,還是1 .. ,如果要取LAST 是填多少 ?
Td:= Td[datacount];
引用:
最初由 kending 發表
請問 datacount 是從0開始,還是1 .. ,如果要取LAST 是填多少 ?
Td:= Td[datacount];
謝啦...很好的服務 .
還有一個問題,在4.0版時,IF THEN ELSE 的敘述可以多行撰寫對吧!
但是我使用了如下的敘述,卻是得到語法錯誤
IF (RSIVal - LLV(RSIVal,Td)) = 0 Then BEGIN
SDMI:0;
End;
ELSE Begin
SDMI : 1;
End;
奇狐的 IF 有兩種
IF(cond,A,B); //條件式結果可為數列
IF cond THEN .... //條件式結果不可為數列(需為常數或單值)
用法於插入函數中可找到
IF(X,A,B)
若X不為0則返回A,否則返回B
一般公式寫作大都應用此 IF
例如:
IF(CLOSE<OPEN,LOW,HIGH)
表示該週期收陰則返回最低價,否則返回最高價
IF cond THEN ....
較不常用, 其用法教學請看下列連結
http://www.chiefox.com.tw/bbs/showt...=&threadid=2646
您的問題出在錯用 IF cond THEN 的條件式
謝謝,總版主.
如果在一個數值陣列,我要知道目前是在什麼位置.
CurrentPosition
For Example :
Td := Td[datacount] ; // 這是取出LAST 位置 Td 的值
那可以這樣嗎 ?
Td := Td[CurrentPos] ; // 目前陣列的 INDEX
這樣是取得最後的位置資料,那如果要在每次運算時(K BAR),取得目前的位置. 而不是得到陣列的最後一個值,那又該怎麼寫呢 ?
因為Td 這個數值陣列,他的每一個CELL 的值,都會不一樣,會依目前的K線,運算出來,而其他的函數也都是用這個 變數.
目前是在什麼位置
這句話要看如何解釋
若是十字游標目前所在的位置
可經由 SYSPARAM(1) 函數取得
例如:
取得目前十字游標所在K棒Close價
CC:C;
CC:=CC[SYSPARAM(1)];
基本上奇狐的運算方式是整個數列對整個數列的運算
以 NN:OPEN+CLOSE; 式子舉例來說
計算過程如下:
OPEN[1]+CLOSE[1]
OPEN[2]+CLOSE[3]
OPEN[3]+CLOSE[4]
:
OPEN[datacount]+CLOSE[datacount]
NN=前面算完的結果數列
整個結果計算出來後一次才存入 NN 數列中
並非用以下方式運算:
NN[1]=OPEN[1]+CLOSE[1]
NN[2]=OPEN[2]+CLOSE[2]
NN[3]=OPEN[3]+CLOSE[3]
:
NN[datacount]=OPEN[datacount]+CLOSE[datacount]
所以不會有目前計算的位置
若您要需分次存取數列裡的數
就必須以迴圈來定位存取
定位存取:
Td[1]; //取第1根K棒的 Td 值
Td[10]; //取第10根K棒的 Td 值
Td[N]; //取第N根K棒的 Td 值
Td[datacount]; //取最末根K棒的 Td 值
Td[datacount-1]; //取最倒數第2根K棒的 Td 值
Td[SYSPARAM(1)]; //取目前十字游標所在K棒的 Td 值
用迴圈來連續定位存取範例:
for N = 1 to datacount do begin
X:=Td[N];
end;
全部時間均為台灣時間, 現在時間為01:23 | 在這個頁面顯示本主題全部的 10 個文章 |
Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.
簡愛洋行 製作 Copyright 2003-. All Rights Reserved.