奇狐社區論壇 總頁數 (2): [1] 2 »
在這個頁面顯示本主題全部的 24 個文章

奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- [問題] IF 的用法 (http://www.chiefox.com.tw/bbs/showthread.php?threadid=7149)


由 kokyo 在 2007-02-22 04:13 發表:

[問題] IF 的用法

請問為何例1ok,例2為何會說"語法錯誤"?百思不解呀。

例1:
If DATATYPE=2 then begin
...
end;

例2:
If L=70 then begin
...
end;


由 yuting_lin 在 2007-02-23 01:39 發表:

因為L是序列, 你可以想做是一個陣列 L[i] ,i= 0 ~ barcount
, 所以應該要先取出陣列中的某個值才能相比.

奇狐的教學文件做的極差, 很多重要的東西都沒有講清楚.
實在是應該要好好參考國外的軟體, 像是wealth-lab, 從內建的函式包含範例, 程式語法說明, 到回測系統, 各種東西寫的一清二楚.


由 cgjj 在 2007-02-25 00:33 發表:

謝謝您的指教, 我們會努力加油改善

當前軟體內建教學說明不足之處
目前會盡可能先於論壇上做教學

4.0版新增的 IF....THEN.... 的教學
這裡有較詳細的說明
http://www.chiefox.com.tw/bbs/showt...=&threadid=2646


由 kokyo 在 2007-03-15 04:27 發表:

引用:
最初由 yuting_lin 發表
因為L是序列, 你可以想做是一個陣列 L[i] ,i= 0 ~ barcount
, 所以應該要先取出陣列中的某個值才能相比.

奇狐的教學文件做的極差, 很多重要的東西都沒有講清楚.
實在是應該要好好參考國外的軟體, 像是wealth-lab, 從內建的函式包含範例, 程式語法說明, 到回測系統, 各種東西寫的一清二楚.



請問該如何取出陣列中的某個值呢?實際想應用的是:
IF MA(c,6)>REF(MA(c,6),1) then
這樣的用法,該如何寫?謝謝了。


由 cgjj 在 2007-03-15 09:15 發表:

引用:
最初由 kokyo 發表
請問該如何取出陣列中的某個值呢?實際想應用的是:
IF MA(c,6)>REF(MA(c,6),1) then
這樣的用法,該如何寫?謝謝了。



大多的狀況都可採用 if(cond,a,b); 來處理
可支援數列對數列的運算,簡單快速
原碼:

HH
:=H;
LL:=L;
MM: if(MA(c,6)>REF(MA(c,6),1),(HH+LL)/2,0);


由 cgjj 在 2007-03-15 09:17 發表:

前例改用 數列之單值 的方法來處理, 可做更複雜的應用

原碼:

HH
:=H;
LL:=L;
MM:C*0
CK:=MA(c,6)>REF(MA(c,6),1);
for 
i=lbound(CKto datacount do begin
  
if CK[i]=1 then begin
    
//需用 Array[x] 的方式, 存取數列中的單值
    
MM[i]:=(HH[i]+LL[i])/2;
  
end;
end;


由 cgjj 在 2007-03-15 09:28 發表:

再以 KD 指標的K為例

原公式:

原碼:

{Stochastic Indicator KD Line KD 隨機指標KD}
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,M1,1);


新公式: SMA 部份改為自己用數列處理
原碼:

RSV
:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
KK:c*0;
for 
I=lbound(RSV)+1 to datacount do begin
  KK
[I]:=(1*RSV[I]+(M1-1)*KK[I-1])/M1;
end;


註解:
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日移動平均價


由 kokyo 在 2007-03-16 04:54 發表:

感謝cgjj大指導,瞭解了,
但是對奇狐的邏輯仍不大明白,
例如下面的程式,目的是要得知在每一根K線的位置,
EMA已經連續向下幾天了(超過7天算7天)?
不過得到的是最後一根K線的,
不知該如何修改才是,謝謝。

KK:=EMA(C,32); II:=UBOUND(KK); JJ:=0;
For I = 0 to 6 DO BEGIN
if KK[II-I]<KK[II-I-1] THEN JJ:=JJ+1;
END
DRAWNUMBER(1,C,JJ,0);


由 cgjj 在 2007-03-16 09:00 發表:

引用:
最初由 kokyo 發表
.......
目的是要得知在每一根K線的位置,
EMA已經連續向下幾天了(超過7天算7天)?
不過得到的是最後一根K線的,
.......



看不是很懂你要算的東西
猜了一下, 看看下面結果
是否為您要的

KK:EMA(C,32);
CK:=ref(kk,1)>kk;
JJ:=SUM(CK,7);
DRAWNUMBER(1,C,JJ,0);


由 kokyo 在 2007-03-16 10:57 發表:

就是這樣,
感謝大大。


由 kokyo 在 2007-03-18 09:50 發表:

大大好,再請教:

關於IF…then不可用在序列,但IF(cond,A,B)可以用在序列,雖然大部分的情況可用後者解決,但可以的話還是習慣前者的方式。因此想到山不轉路轉,先用QQ當人頭,如下程式,但是還是發生錯誤了,莫非這樣出來的QQ仍是序列?

QQ:=IF(c>ref(c,1),1,0);
IF QQ then …

感溫。


由 cgjj 在 2007-03-19 09:47 發表:

QQ仍是序列喔

因為 C 為 CLOSE
CLOSE 為收盤價
收盤價並非單一數值

以日線來看
假設這個商品已交易10天
則 CLOSE 這個數列, 存了 10 天的收盤價
換言之
有 10 個數,存於 CLOSE 這個數列中


由 alanpaul 在 2007-08-31 23:05 發表:

小弟在HTS上的程式想轉到奇狐上來用, 但是好像是碰到了這裡討論到的資料序列問題, 沒法直接套用...

原始的程式是要在一個指標成立後, 把旗號設出, 然後等另一個指標成立後再成立買賣訊號:
(HTS):

IF XXX THEN FLAG=1 ELSE IF YYY THEN FLAG=-1

因為FLAG是序列 (沒錯吧? 但是用REF(FLAG,1)好像也調不出來?), 所以沒法用IF...THEN...ELSE, 所以改成:

(奇狐)

FLAG := IF(XXX, 1, IF(YYY, -1, FLAG));

但是問題出現了 ... > 沒有輸出...?

如果寫成
FLAG := IF(XXX. 1, IF(YYY, -1, 0));
是可以跑, 但是就變成FLAG和下一個條件要同時成立才成立買賣訊號, 跑出來天差地遠 (勝率100% vs 50%...我承認是參數優化的關係...)

請問到底要怎麼寫才行呀?


由 L0123 在 2007-09-02 02:28 發表:

引用:
最初由 alanpaul 發表
小弟在HTS上的程式想轉到奇狐上來用, 但是好像是碰到了這裡討論到的資料序列問題, 沒法直接套用...
原始的程式是要在一個指標成立後, 把旗號設出, 然後等另一個指標成立後再成立買賣訊號:
(HTS):
IF XXX THEN FLAG=1 ELSE IF YYY THEN FLAG=-1
因為FLAG是序列 (沒錯吧? 但是用REF(FLAG,1)好像也調不出來?), 所以沒法用IF...THEN...ELSE, 所以改成:
(奇狐)
FLAG := IF(XXX, 1, IF(YYY, -1, FLAG));
但是問題出現了 ... > 沒有輸出...?
如果寫成
FLAG := IF(XXX. 1, IF(YYY, -1, 0));
是可以跑, 但是就變成FLAG和下一個條件要同時成立才成立買賣訊號, 跑出來天差地遠 (勝率100% vs 50%...我承認是參數優化的關係...)
請問到底要怎麼寫才行呀?


FLAG := IF(XXX, 1, IF(YYY, -1, FLAG));
但是問題出現了 ... > 沒有輸出...?

把 FLAG := IF(XXX, 1, IF(YYY, -1, FLAG));
改 FLAG : IF(XXX, 1, IF(YYY, -1, FLAG)); //去除=號
試試看(偶用猜的)


由 alanpaul 在 2007-09-02 07:43 發表:

感謝回覆, 但是問題應該是出在FLAG的初始值上面...
小弟這兩天試著先用Variable: FLAG=0; 宣告, 程式是可以跑, 但是一旦condition XXX or YYY 成立但成交的condion尚不成立時, FLAG本來不應該歸0, 但是實際上卻被歸0了, 像這樣:

Variable: FLAG=0;

FLAG := IF(XXX, 1, IF(YYY,-1), FLAG);

SHORTCONDITION:= IF(FLAG=1 AND AAA, 1, 0);
LONGCONDITION:= IF(FLAG=-1 AND BBB, 1, 0);

FLAG:= IF(SHORTCONDITION or LONGCONDITION, 0, FLAG);

難道奇狐在每一個週期都讀一次Variable初始值, 而沒有把前一週期的Variable值留下? 試著用

FLAG:= IF(XXX, 1, IF(YYY, -1, REF(FLAG,1));

也不行呀!

頭痛!


全部時間均為台灣時間, 現在時間為06:04 總頁數 (2): [1] 2 »
在這個頁面顯示本主題全部的 24 個文章


Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.

簡愛洋行 製作 Copyright 2003-. All Rights Reserved.