zhangmall 發表於 18-9-28 14:25

一段程式的邏輯錯誤,請指教。

請問各位前輩:

    我寫了一段式,很簡單的,macd 上交叉就買多,下交叉時就買出,然後做空,程式如下:
-----------------------------------------------------



if marketposition = 0then
begin
if macd1 cross over MacdAVGthen         buy next bar market ;
if macd1 cross belowMacdAVGthen sellshort next bar market ;
end;


if marketposition=1then
begin
if macd1 cross belowMacdAVGthen
begin
        sellnext bar market;
end;



end;

if marketposition=-1then
begin
if macd1 cross overMacdAVGthen
begin
        buytocovernext bar market;
end;
end;
--------------------------------------------------------------

這樣子跑,只會做多,不會做空。但是如果我把底下這行,mark 掉

//if macd1 cross over MacdAVGthen         buy next bar market ;
就會正常的進空單,及回補空單,請問這是那邊的錯誤呢?煩請大家幫忙一下。感謝





tony660302 發表於 18-9-28 21:58

本帖最後由 tony660302 於 18-9-28 23:18 編輯

if marketposition = 0then
begin
if macd1 cross over MacdAVGthen         buy next bar market ;
if macd1 cross belowMacdAVGthen sellshort next bar market ;
end;


不同的條件式要用 if ... else ... 串起來,不直能簡單粗暴的接並列,這樣電腦看不懂

jason680 發表於 18-10-25 15:10

你寫的跟你要的不一樣...

所有的cross over/under,都一直交替出現...
一開始若是cross over
則是 cross over, under, orver, under, ...一直循環下去
1.cross over +(加上) MP=0(markepostion)

你會買進一口多單(buy),這時 MP=1
2. 接下來一定是 cross under + MP =1
結果是平倉(sell), MP變成=0
3. 再來又是 cross over + MP=0
買進一口多單(buy),這時 MP=1

4. 接下來一定是 cross under + MP =1
結果是平倉(sell), MP變成=0
一直循環下去....(看起來就是只有多單成交)


如果一開始若是cross under
則是 cross under, over, under, orver, under, ...一直循環下去

...
一直循環下去....看起來就是只有空單成交


-----------------------------------------------------
直接寫
cross over 多單買進

cross under 空單買進

不用管平倉(MC下反向單,等同先平倉+再反向下單的效果)





無無明 發表於 18-9-29 16:42

MCH有時候偶而出現奇怪的程式信號方式,不是預期的模式
避免這種異常,最佳使用 前後變數 實際比對 交叉,避免使用簡易的 CROSS XXXX 指令
if a>=b and a<bthen    ------------- Cross down
if a<=b and a>bthen    ------------- Cross up

wanwh 發表於 18-9-29 00:25

我有一個數千行的策略, 也是用類似樓主的寫法, 但是沒有問題:
var
   mktPos(0);
mktPos = marketposition
if mktPos = 0 then begin...end;
if mktPos = 1 then begin...end;
if mktPos = -1 then begin...end;

zhangmall 發表於 18-9-29 07:12

wanwh 發表於 18-9-29 00:25
我有一個數千行的策略, 也是用類似樓主的寫法, 但是沒有問題:
var
   mktPos(0);


數千行.....................
這樣系統不會太慢嗎?呵呵
我記得之前好似也是可以,後來就不行。再來參照大家的建議,來試看看了。

wanwh 發表於 18-9-30 00:02

zhangmall 發表於 18-9-29 07:12
數千行.....................
這樣系統不會太慢嗎?呵呵
我記得之前好似也是可以,後來就不行。再來參照 ...

程式碼符合條件才可執行, 每bar 後只跑一部分程式碼, 而且現在的電腦不慢.

hcckyy 發表於 18-10-1 15:01

如果你要macd上交叉就買多, 下交叉時就賣出,
那就是手上一直有單, marketposition 不是 1 就是 -1,
除了第一筆交易之前 marketposition 不會=0,
你原來的寫法是 marketposition =0 時才會進新單,
如果你要當macd上或下交叉時, 同時"回補"而且"進新單",
用以下的寫法MC就會自動幫你回補:

if marketposition <= 0then
begin
        if macd1 cross over MacdAVGthen buy next bar market ;
end;

if marketposition >= 0then
begin
        if macd1 cross below MacdAVGthen sellshort next bar market ;
end;


檢查錯誤可用print功能, 然後到output視窗看看問題出在哪裡.
once cleardebug;
print(date,time,marketposition,macd1 cross over MacdAVG,macd1 cross belowMacdAVG);


頁: [1]
查看完整版本: 一段程式的邏輯錯誤,請指教。