奇狐社區論壇
在這個頁面顯示本主題全部的 8 個文章

奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- IF then else 迴圈 之寫法 (http://www.chiefox.com.tw/bbs/showthread.php?threadid=22170)


由 tycoon868 在 2019-11-26 15:07 發表:

IF then else 迴圈 之寫法

總版主您好:

目前可以成功跑出結果的原碼如下:

#######################

M1:=EMA(C,18),linethick5,colorgreen,precision2;

BA1:=((C-M1)/M1)*2000,precision1;

BA1P1:=BA1*0.5;
BA1P2:=120*0.416+(BA1-120)*0.3;
BA1P3:=120*0.416+(210-120)*0.36+(BA1-210)*0.12;

BATP1:=if(Between(BA1,0,120),BA1P1,0);
BATP2:=if(Between(BA1,120,210),BA1P2,0);
BATP3:=if(BA1>210,BA1P3,0);

BATP:=BATP1+BATP2+BATP3;

BAT1P:=IF(BATP>100,100,BATP);

BA1Q1:=BA1*0.416;
BA1Q2:=-120*0.416+(BA1+120)*0.36;
BA1Q3:=-120*0.416+(-210+120)*0.36+(BA1+210)*0.18;

BATQ1:=if(Between(BA1,0,-120),BA1Q1,0);
BATQ2:=if(Between(BA1,-120,-210),BA1Q2,0);
BATQ3:=if(BA1<-210,BA1Q3,0);

BATQ:=BATQ1+BATQ2+BATQ3;

BAT1Q:=IF(BATQ<-100,-100,BATQ);

BAT1:=BAT1P+BATQ;

##########################

需求 : 上列公式 正、負值各有三個區間條件,外加 超過一百者視為一百(上限值)

我目前以土法方式逐條列出這八個條件,結果是正確的

我很希望可以用 類似 IF then else 這種方式來呈現,很希望可以學會這樣的程式與法

麻煩您幫我修改,我會仔細學習

問題: 比較兩者 土法條列vs迴圈方式,效能上何者為優呢?


由 cgjj 在 2019-11-26 15:48 發表:

回覆: IF then else 迴圈 之寫法

引用:
最初由 tycoon868 發表
總版主您好:

目前可以成功跑出結果的原碼如下:

#######################

M1:=EMA(C,18),linethick5,colorgreen,precision2;

BA1:=((C-M1)/M1)*2000,precision1;

BA1P1:=BA1*0.5;
BA1P2:=120*0.416+(BA1-120)*0.3;
BA1P3:=120*0.416+(210-120)*0.36+(BA1-210)*0.12;

BATP1:=if(Between(BA1,0,120),BA1P1,0);
BATP2:=if(Between(BA1,120,210),BA1P2,0);
BATP3:=if(BA1>210,BA1P3,0);

BATP:=BATP1+BATP2+BATP3;

BAT1P:=IF(BATP>100,100,BATP);

BA1Q1:=BA1*0.416;
BA1Q2:=-120*0.416+(BA1+120)*0.36;
BA1Q3:=-120*0.416+(-210+120)*0.36+(BA1+210)*0.18;

BATQ1:=if(Between(BA1,0,-120),BA1Q1,0);
BATQ2:=if(Between(BA1,-120,-210),BA1Q2,0);
BATQ3:=if(BA1<-210,BA1Q3,0);

BATQ:=BATQ1+BATQ2+BATQ3;

BAT1Q:=IF(BATQ<-100,-100,BATQ);

BAT1:=BAT1P+BATQ;

##########################

需求 : 上列公式 正、負值各有三個區間條件,外加 超過一百者視為一百(上限值)

我目前以土法方式逐條列出這八個條件,結果是正確的

我很希望可以用 類似 IF then else 這種方式來呈現,很希望可以學會這樣的程式與法

麻煩您幫我修改,我會仔細學習

問題: 比較兩者 土法條列vs迴圈方式,效能上何者為優呢?



BAT1:=BAT1P+BATQ;
應該是下面這樣吧?
BAT1:=BAT1P+BAT1Q;


另外還有一個潛在問題!!!
Between(BA1,0,120)
Between(BA1,120,210)
這兩行這樣組合處理,其實是有遺漏的
當N=120 或 N=210 會處理不到
Between(N,120,210)
它是判斷成 N>120 and N<210, 並非 N>=120 and N<=210


由 tycoon868 在 2019-11-26 16:21 發表:

謝謝總版主,我重新修改了,麻煩您幫我
M1:=EMA(C,18),linethick5,colorgreen,precision2;

BA1:=((C-M1)/M1)*2000,precision1;

BA1P1:=BA1*0.5;
BA1P2:=120*0.416+(BA1-120)*0.3;
BA1P3:=120*0.416+(210-120)*0.36+(BA1-210)*0.12;

BATP1:=if(BA1>0 and BA1<=120,BA1P1,0);
BATP2:=if(BA1>120 and BA1<=210,BA1P2,0);
BATP3:=if(BA1>210,BA1P3,0);

BATP:=BATP1+BATP2+BATP3;

BAT1P:=IF(BATP>100,100,BATP);

BA1Q1:=BA1*0.416;
BA1Q2:=-120*0.416+(BA1+120)*0.36;
BA1Q3:=-120*0.416+(-210+120)*0.36+(BA1+210)*0.18;

BATQ1:=if(BA1<0 and BA1>=-120,BA1Q1,0);
BATQ2:=if(BA1<-120 and BA1>=-210,BA1Q2,0);
BATQ3:=if(BA1<-210,BA1Q3,0);

BATQ:=BATQ1+BATQ2+BATQ3;

BAT1Q:=IF(BATQ<-100,-100,BATQ);

BAT1:=BAT1P+BAT1Q;


由 cgjj 在 2019-11-26 16:34 發表:

引用:
最初由 tycoon868 發表
謝謝總版主,我重新修改了,麻煩您幫我
M1:=EMA(C,18),linethick5,colorgreen,precision2;

BA1:=((C-M1)/M1)*2000,precision1;

BA1P1:=BA1*0.5;
BA1P2:=120*0.416+(BA1-120)*0.3;
BA1P3:=120*0.416+(210-120)*0.36+(BA1-210)*0.12;

BATP1:=if(BA1>0 and BA1<=120,BA1P1,0);
BATP2:=if(BA1>120 and BA1<=210,BA1P2,0);
BATP3:=if(BA1>210,BA1P3,0);

BATP:=BATP1+BATP2+BATP3;

BAT1P:=IF(BATP>100,100,BATP);

BA1Q1:=BA1*0.416;
BA1Q2:=-120*0.416+(BA1+120)*0.36;
BA1Q3:=-120*0.416+(-210+120)*0.36+(BA1+210)*0.18;

BATQ1:=if(BA1<0 and BA1>=-120,BA1Q1,0);
BATQ2:=if(BA1<-120 and BA1>=-210,BA1Q2,0);
BATQ3:=if(BA1<-210,BA1Q3,0);

BATQ:=BATQ1+BATQ2+BATQ3;

BAT1Q:=IF(BATQ<-100,-100,BATQ);

BAT1:=BAT1P+BAT1Q;



原碼:
M1:=EMA(C,18),linethick5,colorgreen,precision2; BA1:=((C-M1)/M1)*2000,precision1; BAT1:BA1*0; for i=lbound(BA1) to datacount do begin BA1i:=BA1[i]; BATP:=0; if BA1i>0 and BA1i<=120 then begin BATP:=BA1i*0.5; end else if BA1i>120 and BA1i<=210 then begin BATP:=120*0.416+(BA1i-120)*0.3; end else if BA1i>210 then begin BATP:=120*0.416+(210-120)*0.36+(BA1i-210)*0.12; end else if BA1i<0 and BA1i>=-120 then begin BATP:=BA1i*0.416; end else if BA1i<-120 and BA1i>=-210 then begin BATP:=-120*0.416+(BA1i+120)*0.36; end else if BA1i<-210 then begin BATP:=-120*0.416+(-210+120)*0.36+(BA1i+210)*0.18; end; if BATP>100 then BATP:=100; if BATP<-100 then BATP:=-100; BAT1[i]:=BATP; end;


由 tycoon868 在 2019-11-27 08:41 發表:

謝謝總版主,您的公式結果完全與我的結果吻合

但是..................

迴圈公式測試結果回報:我使用這公式加入<數據列表>(定製表頭欄目)中,運算1700檔個股,效能測試結果如下

我的土法方式3秒VS版主迴圈公式12秒

以下提問麻煩解答

1. 迴圈方式效能反而拖累,為了效能考量是否應該採用我原來的方式呢?

2. 您的寫法應該是比較優質的語法,為何效能反而比較慢呢? 提升奇狐的運算效能關鍵到底為何?

3. 一般學習寫程式者,應該是需要學會這種 Else if 的東西,但是我比較能夠理解我自己的條件式(雖然比較冗長)

請問我是否應該繼續使用自己的方式?

4. 請問我如果只是為了跑出正確結果,有需要學習嗎?


由 cgjj 在 2019-11-27 09:57 發表:

引用:
最初由 tycoon868 發表
謝謝總版主,您的公式結果完全與我的結果吻合

但是..................

迴圈公式測試結果回報:我使用這公式加入<數據列表>(定製表頭欄目)中,運算1700檔個股,效能測試結果如下

我的土法方式3秒VS版主迴圈公式12秒

以下提問麻煩解答

1. 迴圈方式效能反而拖累,為了效能考量是否應該採用我原來的方式呢?

2. 您的寫法應該是比較優質的語法,為何效能反而比較慢呢? 提升奇狐的運算效能關鍵到底為何?

3. 一般學習寫程式者,應該是需要學會這種 Else if 的東西,但是我比較能夠理解我自己的條件式(雖然比較冗長)

請問我是否應該繼續使用自己的方式?

4. 請問我如果只是為了跑出正確結果,有需要學習嗎?




用不用迴圈,是否比較快?
這部分沒有絕對誰快誰慢,有時要試驗過才知道...
這跟程式特性、資料緩存、運算策略、處理架構與次序...等多少都有牽連。
奇狐內建的if(C,A,B)是專門針對數列對數列運算的設計
運算上當然有其優勢,因為是系統核心底層直接運算
以您這個例子來說,不用迴圈會比較快

基本上大致的原則是:
1.不需用迴圈計算的東西,就盡量不要使用迴圈做計算。
2.能在迴圈外算好的東西,就盡量不要納入迴圈裡。
3.多多嘗試不同寫法,不同運算策略,測試速度比較效果。
 (有些東西不用迴圈寫,會極其費事,弄出來不見得快)
4.可以學習迴圈,有些公式沒有迴圈可能無法實現。


由 tycoon868 在 2019-11-27 10:15 發表:

充分了解,感謝


由 cgjj 在 2019-11-27 10:20 發表:

引用:
最初由 tycoon868 發表
充分了解,感謝


不客氣 ^^


全部時間均為台灣時間, 現在時間為12:47
在這個頁面顯示本主題全部的 8 個文章


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

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