一段程式的邏輯錯誤,請指教。
請問各位前輩:我寫了一段式,很簡單的,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 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 ... 串起來,不直能簡單粗暴的接並列,這樣電腦看不懂
你寫的跟你要的不一樣...
所有的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下反向單,等同先平倉+再反向下單的效果)
MCH有時候偶而出現奇怪的程式信號方式,不是預期的模式
避免這種異常,最佳使用 前後變數 實際比對 交叉,避免使用簡易的 CROSS XXXX 指令
if a>=b and a<bthen ------------- Cross down
if a<=b and a>bthen ------------- Cross up 我有一個數千行的策略, 也是用類似樓主的寫法, 但是沒有問題:
var
mktPos(0);
mktPos = marketposition
if mktPos = 0 then begin...end;
if mktPos = 1 then begin...end;
if mktPos = -1 then begin...end; wanwh 發表於 18-9-29 00:25
我有一個數千行的策略, 也是用類似樓主的寫法, 但是沒有問題:
var
mktPos(0);
數千行.....................
這樣系統不會太慢嗎?呵呵
我記得之前好似也是可以,後來就不行。再來參照大家的建議,來試看看了。
zhangmall 發表於 18-9-29 07:12
數千行.....................
這樣系統不會太慢嗎?呵呵
我記得之前好似也是可以,後來就不行。再來參照 ...
程式碼符合條件才可執行, 每bar 後只跑一部分程式碼, 而且現在的電腦不慢.
如果你要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]