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

奇狐社區論壇 (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=17493)


由 novaliou0206 在 2013-02-02 13:25 發表:

[問題]程式碼的執行順序?

請問程式碼的執行順序,是一根K棒執行完所有程式碼,再移到下一根;還是一行程式碼執行在畫面上所有K棒,然後再移至下一行程式碼執行?謝謝。因為執行的邏輯不同,程式碼的設計也會有很大的不同。


由 cgjj 在 2013-02-04 09:23 發表:

回覆: [問題]程式碼的執行順序?

引用:
最初由 novaliou0206 發表
請問程式碼的執行順序,是一根K棒執行完所有程式碼,再移到下一根;還是一行程式碼執行在畫面上所有K棒,然後再移至下一行程式碼執行?謝謝。因為執行的邏輯不同,程式碼的設計也會有很大的不同。



一行程式碼執行完所有被調入的K棒,然後再接續下一行程式碼
(畫面上的所有K棒可能僅是所有被調入K棒的一部份)


在奇狐中
A:=B+C; //這行跑完後整個 A 數列就已經是 B+C 計算完成的結果
D:=E-F+G; //這行是整個E數列-F數列的結果都算完後, 再去加上G數列
並非一根K棒 Run 完這兩行後, 再跑下一根K棒
而是歷史數據整個 Run 完第一行後, 再續跑第二行

奇狐中雖是數列對數列之運算
但也可做單一元素的判斷或處理

例如:
CC:=Close; //整個收盤價的數列存入CC變數當中
BB:=CC[10]; //單獨取得第10根K棒的CC數值
CC[10]:=50; //將第10根K棒之CC數值改為 50

與迴圈搭配, 去循序存取數列中元素
亦可以實現一根K棒執行完迴圈內所有的程式碼, 再續下一根K棒
例如:
HH:=high; LL:=low; CC:=Close;
MM:Close*0; //MM為與K棒等長的零值數列
for i=1 to datacount do begin
MM[i]:=HH[i]+LL[i];
MM[i]:=(CC[i]*2+MM[i])/4;
end;


故較完整的說法
奇狐兩種方式皆可寫作實現, 甚至可混著寫


由 novaliou0206 在 2013-02-04 16:04 發表:

感謝版主的回答,謝謝。


由 novaliou0206 在 2013-02-05 08:36 發表:

另外突然想到一個問題想再請教總版主,對於迴圈的程式碼,以您的例子,計算每一根K棒的高、低、兩倍收盤價的平均值,這樣的相同的計算過程會在所有調入的K棒都執行一次嗎?如果會,明明結果一樣卻要重覆計算多次,這樣不是會浪費很多資源?我是強烈懷疑會,因為我自己測試一個簡單的迴圈,把他套用到任何的時間週期,結果當我套用到日線圖時,奇狐就當掉了,其他時間週期都不會,後來我查了一下,日線週期調入的K棒有一萬多筆,其他的週期就只有幾百到幾千筆,是否是重複計算浪費了很多資源,導致奇狐當掉?如果像我所懷疑的,那要如何避免這樣的情形?先謝謝總版主的解疑。


由 cgjj 在 2013-02-05 10:44 發表:

引用:
最初由 novaliou0206 發表
另外突然想到一個問題想再請教總版主,對於迴圈的程式碼,以您的例子,計算每一根K棒的高、低、兩倍收盤價的平均值,這樣的相同的計算過程會在所有調入的K棒都執行一次嗎?如果會,明明結果一樣卻要重覆計算多次,這樣不是會浪費很多資源?我是強烈懷疑會,因為我自己測試一個簡單的迴圈,把他套用到任何的時間週期,結果當我套用到日線圖時,奇狐就當掉了,其他時間週期都不會,後來我查了一下,日線週期調入的K棒有一萬多筆,其他的週期就只有幾百到幾千筆,是否是重複計算浪費了很多資源,導致奇狐當掉?如果像我所懷疑的,那要如何避免這樣的情形?先謝謝總版主的解疑。


前面給您的例子, 並無所謂的重複計算唷

迴圈本來就是在做重覆過程
而 "重覆過程", 其並不等同於 "重覆計算"

----------------------------------------------------------------------------------------------------------
答覆您的範例, 在迴圈中它一次僅算一根K棒 (算的速度很快)
只是重覆過程在數列中的每個元素
HH:=high; LL:=low; CC:=Close;
MM:Close*0;
for i=1 to datacount do begin
MM[i]:=HH[i]+LL[i];
MM[i]:=(CC[i]*2+MM[i])/4;
end;

----------------------------------------------------------------------------------------------------------
以此範例來說
可以不需用迴圈寫, 可簡化為: (此法最快)

HH:=high; LL:=low; CC:=Close;
MM:(CC*2+HH+LL)/4; //這些變數全部均為數列

但實際上奇狐系統內部仍是需要迴圈, 才能把歷史K棒算完
只是它被系統包裝起來, 讓您可以很簡易的撰寫

----------------------------------------------------------------------------------------------------------
若您在迴圈中,把要算數列單一元素的, 誤植為要算整個數列
那麼可能會很慢, 甚至慢的非常離譜, 例如:

嚴重錯誤範例(極慢,慢到可能無回應)
HH:=high; LL:=low; CC:=Close;
MM:Close*0;
for i=1 to datacount do begin
MM:=HH+LL; //每次都重覆計算整個數列
MM:=(CC*2+MM)/4; //每次都重覆計算整個數列
end;

錯誤範例(普通慢, 仍是浪費CPU)
HH:=high; LL:=low; CC:=Close;
MM:Close*0;
for i=1 to datacount do begin
QQ:=HH+LL; //每次都重覆計算整個數列
MM[i]:=(CC[i]*2+QQ[i])/4;
end;

----------------------------------------------------------------------------------------------------------
基本上
除非計算本身特質需要, 否則能不用迴圈就不用
用迴圈也不一定比較慢, 要看您算什麼?怎麼算?


由 novaliou0206 在 2013-02-05 13:59 發表:

謝謝您如此快回答我,不好意思我可能用詞有錯,應該是重複過程,我想要表達的是這樣的過程重複在調入的每一根K棒上,然而這樣的過程是針對同樣的數列做同樣的事,得到相同的結果,即使很快,還是會浪費資源,是否奇狐可以宣告單一迴圈在一開始執行在第一根調入的K棒後,後續的K棒就跳過此迴圈不再執行?得到這些結果後,是有可能應用後面的程式碼在後續的K棒經由一些判斷來改變數列元素的內容。

另外如您所述,一行程式碼是執行在所有調入的K棒,執行完再移到下一行程式碼,但程式碼有可能會依據哪一根K棒及一些條件判斷再決定要不要執行,因此是否有指令可以知道目前程式碼是執行在哪一根K棒上,例如:位置、時間、、、等等。

謝謝您。


由 novaliou0206 在 2013-02-05 14:03 發表:

接續剛才的問題,是否可以指定程式碼執行在特定的K棒上,例如:位置、時間、、、等等?

謝謝您。


由 cgjj 在 2013-02-05 14:26 發表:

引用:
最初由 novaliou0206 發表
謝謝您如此快回答我,不好意思我可能用詞有錯,應該是重複過程,我想要表達的是這樣的過程重複在調入的每一根K棒上,然而這樣的過程是針對同樣的數列做同樣的事,得到相同的結果,即使很快,還是會浪費資源,是否奇狐可以宣告單一迴圈在一開始執行在第一根調入的K棒後,後續的K棒就跳過此迴圈不再執行?得到這些結果後,是有可能應用後面的程式碼在後續的K棒經由一些判斷來改變數列元素的內容。


要去想, 沒有那些計算過程, 那來的計算結果

我給您十個數字, 要您算每個數字乘上3後, 全部加總的結果
請問有辦法
只算第一組數字, 將其乘上3, 就得到我們最終要的嗎?
當然是不行, 十個數都要被計算處理
較差的方式. 是把每組數字都先乘3, 再去加總
較優的方式. 是把所有數字先加總後, 最後再先乘3 (乘法僅需做一次)

重點是
您想讓它跑多長?, 得到多長的計算資料
用什麼技巧去算它

迴圈末必需要從頭算到尾
只算需要算的範圍, 就不會有浪費的問題
例如: 可只跑頭幾根, 或末幾根, 甚至跳著跑
迴圈程式結構安排的好, 事半功倍
迴圈程式結構安排的差, 事倍功半

存取數列未必一定要自頭到尾存取
變數[n] 可讓您直接指定讀取或寫入數列中的任一個有效位置


由 cgjj 在 2013-02-05 14:28 發表:

引用:
最初由 novaliou0206 發表
接續剛才的問題,是否可以指定程式碼執行在特定的K棒上,例如:位置、時間、、、等等?

謝謝您。



您用 if 這類的命令, 去判斷做進一步處理即可
( 由條件是否成立, 決定跑什麼 )

例如:
if .... then begin
............
end else begin
............
end;

就看您自己怎樣去組合安排, 就像...
usekpos:=barpos;
if usekpos[i]=n then ......
usedate:=date;
if usedate[i]>1020101 then ......


由 novaliou0206 在 2013-02-05 18:12 發表:

謝謝總版主的說明


由 novaliou0206 在 2013-02-18 10:13 發表:

另外再請教總版主,對於及時盤而言,當有一根新的K棒產生時,所以的程式碼會從第一根K棒從頭執行到新產生的K棒?還是只會針對新產生的K棒執行所有程式嗎?謝謝。


由 novaliou0206 在 2013-02-18 11:04 發表:

Sorry, 筆誤,是:"所有"的程式碼會從第一根K棒從頭執行到新產生的K棒?


由 cgjj 在 2013-02-18 11:16 發表:

引用:
最初由 novaliou0206 發表
另外再請教總版主,對於及時盤而言,當有一根新的K棒產生時,所以的程式碼會從第一根K棒從頭執行到新產生的K棒?還是只會針對新產生的K棒執行所有程式嗎?謝謝。


並非是有新的K棒才會觸發計算
主要是看有無新的Tick

該公式被觸發計算時
會整個重新計算, 不會僅算最末根


由 novaliou0206 在 2013-02-18 11:24 發表:

謝謝總版主。


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


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

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