头疼的4756 建议能稍更具体化一些

 

价格、手数、滑点、止盈、止损……既然有N多种可能致4756,希望官方能细化错误码,能象其它错误一样能给编写者一个明确的提示。

编程的朋友们觉得如何呢?

 
Yin Zhou Luo:

價格、手數、滑點、止盈、止損……既然有N多種可能致4756,希望官方能細化錯誤碼,能像其它錯誤一樣能給編寫者一個明確的提示。

編程的朋友們覺得如何呢?

4756的範圍比較大,但你OrderSend下達之後會有MqlTradeResult 傳回
改用 MqlTradeResult 傳回的資料裡的 retcode 碼,來再來分類就比較仔細
 

嗯。查返回码是个办法。

前久给他们写了一个简单策略。在OrderSend之前偷了下懒,没做校验钱够不够。然后,客户反馈看到一大堆失败……唉,苦的我好一通找BUG……

 
Yin Zhou Luo #:

嗯。查返回碼是個辦法。

前久給他們寫了一個簡單策略。在OrderSend之前偷了下懶,沒做校驗錢夠不夠。然後,客戶反饋看到一大堆失敗……唉,苦的我好一通找BUG……

以下是一段我在使用針對retcode處理程式碼,你可以直接套用,應該夠用了 

            string retcode_msg = "未知伺服器拒絕";
            switch (result.retcode)
            {
                //--- 常見錯誤 ---
            case TRADE_RETCODE_REQUOTE:              retcode_msg = "重新報價"; break;
            case TRADE_RETCODE_PRICE_CHANGED:        retcode_msg = "價格已變更"; break;
            case TRADE_RETCODE_PRICE_OFF:            retcode_msg = "商品無報價"; break;
            case TRADE_RETCODE_NO_MONEY:             retcode_msg = "保證金不足"; break;
            case TRADE_RETCODE_MARKET_CLOSED:        retcode_msg = "市場關閉"; break;
            case TRADE_RETCODE_TRADE_DISABLED:       retcode_msg = "交易已被禁用"; break;
            case TRADE_RETCODE_TIMEOUT:              retcode_msg = "請求因超時而取消"; break;
            case TRADE_RETCODE_TOO_MANY_REQUESTS:    retcode_msg = "請求過於頻繁"; break;

                //--- 請求參數無效 ---
            case TRADE_RETCODE_INVALID:              retcode_msg = "無效請求"; break;
            case TRADE_RETCODE_INVALID_VOLUME:       retcode_msg = "無效交易量"; break;
            case TRADE_RETCODE_INVALID_PRICE:        retcode_msg = "請求中價格無效"; break;
            case TRADE_RETCODE_INVALID_STOPS:        retcode_msg = "無效停損停利"; break;
            case TRADE_RETCODE_INVALID_EXPIRATION:   retcode_msg = "請求中訂單過期日期無效"; break;
            case TRADE_RETCODE_INVALID_FILL:         retcode_msg = "無效的訂單執行條件"; break;
            case TRADE_RETCODE_INVALID_ORDER:        retcode_msg = "不正確或禁止的訂單類型"; break;

                //--- 伺服器/客戶端狀態 ---
            case TRADE_RETCODE_SERVER_DISABLES_AT:   retcode_msg = "伺服器禁用EA"; break;
            case TRADE_RETCODE_CLIENT_DISABLES_AT:   retcode_msg = "客戶端禁用EA"; break;
            case TRADE_RETCODE_LOCKED:               retcode_msg = "請求被鎖定以便處理"; break;
            case TRADE_RETCODE_FROZEN:               retcode_msg = "訂單或倉位凍結"; break;
            case TRADE_RETCODE_CONNECTION:           retcode_msg = "與交易服務器無法連接"; break;

                //--- 其它拒絕原因 ---
            case TRADE_RETCODE_REJECT:               retcode_msg = "請求被拒絕"; break;
            case TRADE_RETCODE_CANCEL:               retcode_msg = "交易者已取消請求"; break;
            case TRADE_RETCODE_ERROR:                retcode_msg = "請求處理錯誤"; break;
            case TRADE_RETCODE_ORDER_CHANGED:        retcode_msg = "訂單狀態已更改"; break;
            case TRADE_RETCODE_LIMIT_ORDERS:         retcode_msg = "待處理訂單的數量已達到限制"; break;
            case TRADE_RETCODE_LIMIT_VOLUME:         retcode_msg = "該品種的訂單和倉位的交易量已達到限制"; break;
            case TRADE_RETCODE_ONLY_REAL:            retcode_msg = "僅對實時帳戶允許操作"; break;
            case TRADE_RETCODE_POSITION_CLOSED:      retcode_msg = "指定的倉位已被關閉"; break;
            }

下單成交,會有成交完成的retcode訊息,來源都是retcode,但我是分開處理的如下
        switch (result.retcode)
        {
        case TRADE_RETCODE_DONE: status_msg = "完全成交"; break;
        case TRADE_RETCODE_DONE_PARTIAL: status_msg = "部分成交"; break;
        case TRADE_RETCODE_PLACED: status_msg = "已掛單"; break;
        case TRADE_RETCODE_NO_CHANGES: status_msg = "無變更"; break;
        }