到奇狐勝券首頁 奇狐社區論壇 購買奇狐勝券 試用奇狐勝券
 
論壇首頁 你可以在這裡編輯你的資料,查看短訊,訂閱主題和論壇參數等等 免費會員註冊 會員列表 論壇幫助 論壇日曆 論壇搜索 加入我的最愛 登出論壇  
奇狐社區論壇 : Powered by vBulletin version 2.3.0 奇狐社區論壇 > 指標公式 > 問題交流 > IF then else 迴圈 之寫法
  上一主題   下一主題
作者
主題 發表新主題    回覆主題
tycoon868
資深會員

註冊日期: Oct 2008
來  自:
文章數量: 313

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迴圈方式,效能上何者為優呢?

向版主報告此篇 | 查IP位址
Old Post 2019-11-26 15:07
tycoon868 現在離線 點選這裡查看 tycoon868 的個人資料 點選這裡給 tycoon868 傳送一條短訊 查找更多關於 tycoon868 的文章 增加 tycoon868 至你的好友列表 編輯/刪除訊息 引用回覆
cgjj
總版主

註冊日期: Oct 2003
來  自:
文章數量: 18234

回覆: 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

向版主報告此篇 | 查IP位址
Old Post 2019-11-26 15:48
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
tycoon868
資深會員

註冊日期: Oct 2008
來  自:
文章數量: 313

謝謝總版主,我重新修改了,麻煩您幫我
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;

向版主報告此篇 | 查IP位址
Old Post 2019-11-26 16:21
tycoon868 現在離線 點選這裡查看 tycoon868 的個人資料 點選這裡給 tycoon868 傳送一條短訊 查找更多關於 tycoon868 的文章 增加 tycoon868 至你的好友列表 編輯/刪除訊息 引用回覆
cgjj
總版主

註冊日期: Oct 2003
來  自:
文章數量: 18234

引用:
最初由 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;

向版主報告此篇 | 查IP位址
Old Post 2019-11-26 16:34
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
tycoon868
資深會員

註冊日期: Oct 2008
來  自:
文章數量: 313

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

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

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

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

以下提問麻煩解答

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

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

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

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

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

向版主報告此篇 | 查IP位址
Old Post 2019-11-27 08:41
tycoon868 現在離線 點選這裡查看 tycoon868 的個人資料 點選這裡給 tycoon868 傳送一條短訊 查找更多關於 tycoon868 的文章 增加 tycoon868 至你的好友列表 編輯/刪除訊息 引用回覆
cgjj
總版主

註冊日期: Oct 2003
來  自:
文章數量: 18234

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

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

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

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

以下提問麻煩解答

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

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

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

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

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




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

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

向版主報告此篇 | 查IP位址
Old Post 2019-11-27 09:57
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
tycoon868
資深會員

註冊日期: Oct 2008
來  自:
文章數量: 313

充分了解,感謝

向版主報告此篇 | 查IP位址
Old Post 2019-11-27 10:15
tycoon868 現在離線 點選這裡查看 tycoon868 的個人資料 點選這裡給 tycoon868 傳送一條短訊 查找更多關於 tycoon868 的文章 增加 tycoon868 至你的好友列表 編輯/刪除訊息 引用回覆
cgjj
總版主

註冊日期: Oct 2003
來  自:
文章數量: 18234

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


不客氣 ^^

向版主報告此篇 | 查IP位址
Old Post 2019-11-27 10:20
cgjj 現在離線 點選這裡查看 cgjj 的個人資料 點選這裡給 cgjj 傳送一條短訊 查找更多關於 cgjj 的文章 增加 cgjj 至你的好友列表 編輯/刪除訊息 引用回覆
全部時間均為台灣時間, 現在時間為09:09 發表新主題    回覆主題
  上一主題   下一主題
顯示可列印版本 | 訂閱此主題

論壇跳轉:
主題評分:

論壇規定:
你不可以發表新主題
你不可以回覆文章
你不可以上傳附件
你不可以編輯自己的文章
HTML語法禁止
vB 語法核准
表情符號核准
貼圖語法[IMG]核准
 

本站所有內容未經作者授權禁止轉貼節錄, 發表言論僅供參考勿作為投資決策依據。瀏覽本站請使用 IE 5.5 以上版本, 最佳瀏覽解析度 1024 x 768 全彩。

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

簡愛洋行 製作 Copyright 2003-. All Rights Reserved.  聯絡我們