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

奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- [問題]請問: 多空=0 跟 多空[i]=0 有什麼不一樣?我發現有時加上[i]可以編過,有時不行? (http://www.chiefox.com.tw/bbs/showthread.php?threadid=17433)


由 P2372 在 2013-01-14 10:55 發表:

問題 [問題]請問: 多空=0 跟 多空[i]=0 有什麼不一樣?我發現有時加上[i]可以編過,有時不行?

P:EMA(C,5);
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
平多:X or barpos=0,COLORGREEN;
空進:S or barpos=0,COLORGREEN;
平空:Z or barpos=0,COLOR5500AA;
利潤:C*0;//因為不會寫記下當時的買賣值, 所以還沒寫???
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0;
TEST:0;//檢查是否進入判斷式的旗標
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
多空:c*0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
for i = 1 to datacount do
begin
if 多空[i]=0 then
begin
多空[i]:=多進[i]-空進[i];test:=0;
end
else if 多空[i]=1 then
begin
if 平多[i]=1 then
begin
多空[i]:=0;test:=1;
end
else if 空進[i]=1 then
begin
多空[i]:=-1;test:=2;
end
else break
end
else if 多空[i]=-1 then
begin
if 平空[i]=1 then
begin
多空[i]:=0;test:=3;
end
else if 多進[i]=1 then
begin
多空[i]:=1;test:=4;
end
else break
end
else break
end;


我想做的效果:
1. 買訊出現, 多空=1, 並且記下那根K線的P值(=進出)
2. 賣訊出現, 多空=-1, 並且記下那跟K線的P值(=進出)
同時,計算出PR值=利潤=(P買-P賣)
3. 停損停利點滿足時, 做出平多或是平空, 並且將 多空=0(還沒寫)
請問版主, 我應該如何修改程式?我嘗試了10天了, 實在搞不懂奇狐的公式寫法? 求助解答下

__________________
win365


由 cgjj 在 2013-01-14 11:24 發表:

回覆: [問題]請問: 多空=0 跟 多空[i]=0 有什麼不一樣?我發現有時加上[i]可以編過,有時不行?

引用:
最初由 P2372 發表
P:EMA(C,5);
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
平多:X or barpos=0,COLORGREEN;
空進:S or barpos=0,COLORGREEN;
平空:Z or barpos=0,COLOR5500AA;
利潤:C*0;//因為不會寫記下當時的買賣值, 所以還沒寫???
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0;
TEST:0;//檢查是否進入判斷式的旗標
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
多空:c*0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
for i = 1 to datacount do
begin
if 多空[i]=0 then
begin
多空[i]:=多進[i]-空進[i];test:=0;
end
else if 多空[i]=1 then
begin
if 平多[i]=1 then
begin
多空[i]:=0;test:=1;
end
else if 空進[i]=1 then
begin
多空[i]:=-1;test:=2;
end
else break
end
else if 多空[i]=-1 then
begin
if 平空[i]=1 then
begin
多空[i]:=0;test:=3;
end
else if 多進[i]=1 then
begin
多空[i]:=1;test:=4;
end
else break
end
else break
end;


我想做的效果:
1. 買訊出現, 多空=1, 並且記下那根K線的P值(=進出)
2. 賣訊出現, 多空=-1, 並且記下那跟K線的P值(=進出)
同時,計算出PR值=利潤=(P買-P賣)
3. 停損停利點滿足時, 做出平多或是平空, 並且將 多空=0(還沒寫)
請問版主, 我應該如何修改程式?我嘗試了10天了, 實在搞不懂奇狐的公式寫法? 求助解答下




每套程式的迴圈應用寫法, 都有其各自的考量
迴圈搭配數列存取, 您必需先對它熟悉並了解
看懂理解原程式的運作架構後, 才有可能去修改它


由 P2372 在 2013-01-14 11:32 發表:

問題 補充圖形

補充圖形說明

__________________
win365


由 cgjj 在 2013-01-14 12:46 發表:

回覆: 補充圖形

引用:
最初由 P2372 發表
補充圖形說明


當根K線的P值
在迴圈中, 可直接用 P[i] 取得


由 P2372 在 2013-01-14 14:19 發表:

我修改了程式, 從test的值=2可以看出, 沒有進入(多空=-1迴圈)為什麼

第3根k線時,應該進入這個判斷式迴圈中, 但是 不管我的游標如何移動, 結果都沒有改變?
從test的值=2可以看出, 沒有進入(多空=-1迴圈)為什麼?
並且奇怪的是, 為何不管游標如何移動到任何點, 畫面上的輸出的(變數多空)值, 永遠都沒有改變?從第1根到最後1根都是-1?

請協助解答, 謝謝

__________________
win365


由 P2372 在 2013-01-14 14:21 發表:

補充:補上程式原碼

P:EMA(C,5),colorffffff,linethick3;
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
drawicon(A,L-2,4);
平多:X or barpos=0,COLORGREEN;
drawicon(X,H+5,11);
空進:S or barpos=0,COLORGREEN;
drawicon(S,H+2,5);
平空:Z or barpos=0,COLOR5500AA;
drawicon(Z,L-5,10);
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0,COLOR000000;
TEST:0,COLOR000000;
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
//多空[i]:=0;是將 "多" 這個數列, 其中的第 i 個元素, 設定為零
//多空:=0;是將 "多" 這個變數(非數列), 設定為零
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
多進t:0;
利潤:0;
for i = 1 to datacount do
begin
if 多空=0 then
begin
多空:=多進[i]-空進[i];test:=0;
end
else if 多空=1 then
begin
if 平多[i]=1 then
begin
多空:=0;test:=1;
end
else if 空進[i]=1 then
begin
多空:=-1;test:=2;
end
else break
end
else if 多空=-1 then
begin
if 平空[i]=1 then
begin
多空:=0;test:=3;
end
else if 多進[i]=1 then
begin
多空:=1;test:=4;
end
else break
end
else break
end;

__________________
win365


由 cgjj 在 2013-01-14 14:44 發表:

回覆: 我修改了程式, 從test的值=2可以看出, 沒有進入(多空=-1迴圈)為什麼

引用:
最初由 P2372 發表
第3根k線時,應該進入這個判斷式迴圈中, 但是 不管我的游標如何移動, 結果都沒有改變?
從test的值=2可以看出, 沒有進入(多空=-1迴圈)為什麼?
並且奇怪的是, 為何不管游標如何移動到任何點, 畫面上的輸出的(變數多空)值, 永遠都沒有改變?從第1根到最後1根都是-1?

請協助解答, 謝謝



因為錯用, 所以會有錯的結果

多空:=C*0; //此時 "多空" 是個數列, 自頭到尾值均為零 (因為 Close是數列)
多空[50]:=1; //將 "多空" 的第50根K棒值設為 1, 其餘不變 , "多空" 仍是數列
多空:=0; //將 "多空" 定義為零, "多空" 不再是數列

何謂數列? 數列如何存取? 您需先去了解學習清楚, 再去應用


由 P2372 在 2013-01-14 15:08 發表:

上個問題您已經回復數列跟變數的不同,我已經修改了

上個問題您已經回復數列跟變數的不同,我已經修改了程式裡頭多空:=c*0;這個錯誤, 所以附上新的原碼板主可能沒有注意到,
謝謝您的指導, 數列跟變數我知道的,
a[5]:=a[0,1,2,3,4]共有5個元素,
a:=5; 只有1個元素
這我知道,
麻煩板主看新的原碼, 再次麻煩下, 不好意思, 請您再次指點:

新的原碼的多空變數已經改變如下了:
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標


P:EMA(C,5),colorffffff,linethick3;
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
drawicon(A,L-2,4);
平多:X or barpos=0,COLORGREEN;
drawicon(X,H+5,11);
空進:S or barpos=0,COLORGREEN;
drawicon(S,H+2,5);
平空:Z or barpos=0,COLOR5500AA;
drawicon(Z,L-5,10);
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0,COLOR000000;
TEST:0,COLOR000000;
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
//多空[i]:=0;是將 "多" 這個數列, 其中的第 i 個元素, 設定為零
//多空:=0;是將 "多" 這個變數(非數列), 設定為零
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
多進t:0;
利潤:0;
for i = 1 to datacount do
begin
if 多空=0 then
begin
多空:=多進[i]-空進[i];test:=0;
end
else if 多空=1 then
begin
if 平多[i]=1 then
begin
多空:=0;test:=1;
end
else if 空進[i]=1 then
begin
多空:=-1;test:=2;
end
else break
end
else if 多空=-1 then
begin
if 平空[i]=1 then
begin
多空:=0;test:=3;
end
else if 多進[i]=1 then
begin
多空:=1;test:=4;
end
else break
end
else break
end;

__________________
win365


由 cgjj 在 2013-01-14 15:16 發表:

回覆: 上個問題您已經回復數列跟變數的不同,我已經修改了

引用:
最初由 P2372 發表
上個問題您已經回復數列跟變數的不同,我已經修改了程式裡頭多空:=c*0;這個錯誤, 所以附上新的原碼板主可能沒有注意到,
謝謝您的指導, 數列跟變數我知道的,
a[5]:=a[0,1,2,3,4]共有5個元素,
a:=5; 只有1個元素
這我知道,
麻煩板主看新的原碼, 再次麻煩下, 不好意思, 請您再次指點:

新的原碼的多空變數已經改變如下了:
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
P:EMA(C,5),colorffffff,linethick3;
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
drawicon(A,L-2,4);
平多:X or barpos=0,COLORGREEN;
drawicon(X,H+5,11);
空進:S or barpos=0,COLORGREEN;
drawicon(S,H+2,5);
平空:Z or barpos=0,COLOR5500AA;
drawicon(Z,L-5,10);
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0,COLOR000000;
TEST:0,COLOR000000;
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
//多空[i]:=0;是將 "多" 這個數列, 其中的第 i 個元素, 設定為零
//多空:=0;是將 "多" 這個變數(非數列), 設定為零
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
多進t:0;
利潤:0;
for i = 1 to datacount do
.............................



問題在迴圈內
迴圈內, 您程式並無把結果存於數列之中


由 P2372 在 2013-01-14 19:04 發表:

我修改了程式, 但是仍然沒有進入迴圈?

P:EMA(C,5),colorffffff,linethick3;
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
drawicon(A,L-2,4);
平多:X or barpos=0,COLORGREEN;
drawicon(X,H+5,11);
空進:S or barpos=0,COLORGREEN;
drawicon(S,H+2,5);
平空:Z or barpos=0,COLOR5500AA;
drawicon(Z,L-5,10);
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0,COLOR000000;
TEST:0,COLOR000000;
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
//多空[i]:=0;是將 "多" 這個數列, 其中的第 i 個元素, 設定為零
//多空:=0;是將 "多" 這個變數(非數列), 設定為零
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
多進t:0;
利潤:0;
for i = 1 to datacount do
begin
if 多空=0 then
begin
多空:=多進[i]-空進[i];test:=0;
end
else if 多空=1 then
begin
if 平多[i]=1 then
begin
多空:=(多進[i]-平多[i])-空進[i];test:=1;
end
else if 空進[i]=1 then
begin
多空:=(多進[i]-平多[i])-空進[i];test:=2;
end
else break
end
else if 多空=-1 then
begin
if 平空[i]=1 then
begin
多空:=多進[i]-(空進[i]-平空[i]);test:=3;
end
else if 多進[i]=1 then
begin
多空:=多進[i]-(空進[i]-平空[i]);test:=4;
end
else break
end
else break
end;

__________________
win365


由 P2372 在 2013-01-14 19:11 發表:

補充: 我加入了我的想法, 請指點哪裡錯了?

版主老大:
我的疑問: 為何沒有進入迴圈: 多空=-1的多進=1的這個迴圈?
如果有進入, TEST這個FLAG應該被改成了4,
但是驗證的結果-->TEST旗標永遠都是2, 不管我的游標如何移動, 從2008年到2013年都是如此?

請指點下, 謝謝

__________________
win365


由 cgjj 在 2013-01-15 11:15 發表:

回覆: 補充: 我加入了我的想法, 請指點哪裡錯了?

引用:
最初由 P2372 發表
P:EMA(C,5),colorffffff,linethick3;
A:=C>P;
X:=C>P+20;
S:=C<P;
Z:=C<P-20;
多進:A or barpos=0,COLORRED;
drawicon(A,L-2,4);
平多:X or barpos=0,COLORGREEN;
drawicon(X,H+5,11);
空進:S or barpos=0,COLORGREEN;
drawicon(S,H+2,5);
平空:Z or barpos=0,COLOR5500AA;
drawicon(Z,L-5,10);
// 平多:=賺50點 or barpos=0;//H-多進>=50多先出一口=做多平倉
// 平多:=賠50點 or barpos=0;//多進-L>=50多先出一口=多單停損
// 平空:=賺50點 or barpos=0;//空進-L>=50多先出一口=做空平倉
// 平空:=賠50點 or barpos=0;//H-空進>=50多先出一口=空單停損
進出:c*0,COLOR000000;
TEST:0,COLOR000000;
//[進出] 這變數值代表進出的點數.
// 1.多進, -1.空進 0.空手
//多空[i]:=0;是將 "多" 這個數列, 其中的第 i 個元素, 設定為零
//多空:=0;是將 "多" 這個變數(非數列), 設定為零
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
多進t:0;
利潤:0;
for i = 1 to datacount do
begin
if 多空=0 then
begin
多空:=多進[i]-空進[i];test:=0;
end
else if 多空=1 then
begin
if 平多[i]=1 then
begin
多空:=(多進[i]-平多[i])-空進[i];test:=1;
end
else if 空進[i]=1 then
begin
多空:=(多進[i]-平多[i])-空進[i];test:=2;
end
else break
end
else if 多空=-1 then
begin
if 平空[i]=1 then
begin
多空:=多進[i]-(空進[i]-平空[i]);test:=3;
end
else if 多進[i]=1 then
begin
多空:=多進[i]-(空進[i]-平空[i]);test:=4;
end
else break
end
else break
end;


我的疑問: 為何沒有進入迴圈: 多空=-1的多進=1的這個迴圈?
如果有進入, TEST這個FLAG應該被改成了4,
但是驗證的結果-->TEST旗標永遠都是2, 不管我的游標如何移動, 從2008年到2013年都是如此?

請指點下, 謝謝



問題1:
"第2根K線是多空[1]" <== 不對
第2根K線應該是 [2] , 而不是 [1]
奇狐數列起點並非自零數起,而是自1數起

問題2:
前段程式
"多空" 這變數自頭到尾, 都不曾經是數列
故根本沒有 多空[n] 這種東西存在

問題3:
break 是跳離當前這層迴圈
不會再跑這層迴圈內的其他程式
註: 前段程式, 僅有一層迴圈
誤用 break, 當然後面的程序不會再被進行


由 P2372 在 2013-01-15 16:49 發表:

感謝版主的回覆, 我依照您的說明重新修改了原碼做測試, 仍然有問題

請版主協助看下我的觀念有沒有錯?
附上原碼及語句理解圖, 請看看對不對?
如果沒有錯, 為何不管游標如何移動, 結果仍然是不對?

修改內容:
1..我拿掉了 BREAK
2..拿掉了多空[N]的觀念, 把 多空 及 進出都當作一般的變數來用
3..檢查了我的迴圈關係.
執行的結果:迴圈永遠在TEST4,
但是這行明明有:這語句, 為何結果還是都不變?
多空:=多進[i]-(空進[i]-平空[i]);進出:=P[i];test:=4


P:EMA(C,5),colorffffff,linethick3;
A:=C>P;
X:=C>P+50;
S:=C<P;
Z:=C<P-50;
多進:A or barpos=0,COLORRED;
drawicon(A,L-2,4);
平多:X or barpos=0,COLORGREEN;
drawicon(X,H+5,11);
空進:S or barpos=0,COLORGREEN;
drawicon(S,H+2,5);
平空:Z or barpos=0,COLOR5500AA;
drawicon(Z,L-5,10);
進出:0,COLOR000000;
TEST:0,COLOR000000;
//[進出] 這變數值代表進出的點數.
多空:0,COLOR999900; //1.多 -1.空 0.無,是狀態旗標
利潤:0;
for i = 1 to datacount do begin

if 多空=0 then begin
多空:=多進[i]-空進[i];進出:=P[i];test:=0;end
else begin {多空<>0}
if 多空=1 then begin
if 平多[i]=1 then begin
多空:=(多進[i]-平多[i])-空進[i];進出:=P[i];test:=1;end;
else if 空進[i]=1 then begin
多空:=(多進[i]-平多[i])-空進[i];進出:=P[i];test:=2;end;end;

else begin
if 多空=-1 then begin
if 平空[i]=1 then begin
多空:=多進[i]-(空進[i]-平空[i]);進出:=P[i];test:=3;end;
else if 多進[i]=1 then begin
多空:=多進[i]-(空進[i]-平空[i]);進出:=P[i];test:=4;end;end;
else test:=5;
end;
end;
end;

__________________
win365


由 P2372 在 2013-01-15 16:52 發表:

補充說明:前4根K線的變數關係

修改內容:
1..我拿掉了 BREAK
2..拿掉了多空[N]的觀念, 把 多空 及 進出都當作一般的變數來用
3..檢查了我的迴圈關係.
執行的結果:迴圈永遠在TEST4,
但是這行明明有:這語句, 為何結果還是都不變?
多空:=多進[i]-(空進[i]-平空[i]);進出:=P[i];test:=4

__________________
win365


由 cgjj 在 2013-01-16 09:11 發表:

回覆: 補充說明:前4根K線的變數關係

引用:
最初由 P2372 發表
修改內容:
1..我拿掉了 BREAK
2..拿掉了多空[N]的觀念, 把 多空 及 進出都當作一般的變數來用
3..檢查了我的迴圈關係.
執行的結果:迴圈永遠在TEST4,
但是這行明明有:這語句, 為何結果還是都不變?
多空:=多進[i]-(空進[i]-平空[i]);進出:=P[i];test:=4



您程式中 test 並非是數列
故您十字游標如何移動, 它的值都不會改變

跑完迴圈後, test 存的是最終變化的數值
因為不是數列, 故未記錄過程中變化的數值

觀念建立不清, 就會很容易錯用


由 P2372 在 2013-01-16 10:06 發表:

感謝版主的回覆, 我懂了

我懂了, 變數的值在上面的輸出位置是不會變的, 只有數列的質材會變, 太感謝了,
我重新練習下,重新設了1個數列的變數, 再把值輸出給這個變數, 就可以了, 感謝版主的指點!
現在應可以克服我的問題,

另外, 我的迴圈的觀念正確嗎? 也麻烦板主指点下,

就是我畫的 begin ...end配套圖?
谢谢!

__________________
win365


由 cgjj 在 2013-01-16 17:04 發表:

回覆: 感謝版主的回覆, 我懂了

引用:
最初由 P2372 發表
我懂了, 變數的值在上面的輸出位置是不會變的, 只有數列的質材會變, 太感謝了,
我重新練習下,重新設了1個數列的變數, 再把值輸出給這個變數, 就可以了, 感謝版主的指點!
現在應可以克服我的問題,

另外, 我的迴圈的觀念正確嗎? 也麻烦板主指点下,

就是我畫的 begin ...end配套圖?
谢谢!



一個 begin 對應一個 end
沒多或沒少, 程式就能跑

與迴圈觀念是否正確, 並無關連
這圖中的程式僅有一層迴圈
其內包含多層 IF...THEN 敘述

一般會採用階層內縮的技巧, 來增加程式可閱讀性
例如:
http://www.chiefox.com.tw/bbs/showt...54563#post54563


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


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

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