请教高手如何解决错误代码4756问题

 

需求:当价格到达设定的区间时,开始修改止和止损价格。
问题:用MT5的“1分钟OHLC”模式回测时,一切正常,但用“每个点基于实时点”回测时,日志就显示4756错误代码,如下图显示:

代码如下:

void yidong(int tppoint_1,int tppoint_2,string symbol,ENUM_POSITION_TYPE type,int magic,string com)
 {
//  tppoint_1=400 
//  tppoint_2=500 
   int t=PositionsTotal();
   for(int i=t-1;i>=0;i--)
     {
       if(PositionGetTicket(i)>0)
        {
          if(PositionGetString(POSITION_SYMBOL)==symbol)
           {
              double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
              double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
              long dig=SymbolInfoInteger(symbol,SYMBOL_DIGITS);
              double pot=SymbolInfoDouble(symbol,SYMBOL_POINT);
              double op=PositionGetDouble(POSITION_PRICE_OPEN);
              double sl= PositionGetDouble(POSITION_SL);
              double tp=PositionGetDouble(POSITION_TP);  
             
             if(type==POSITION_TYPE_BUY && magic == PositionGetInteger(POSITION_MAGIC) && com == PositionGetString(POSITION_COMMENT) )
              {     
                if(bid-op>=pot*tppoint_1  && bid-op<pot*tppoint_2 && sl<op+tppoint_1*pot )
                   {
                     MqlTradeRequest request={};
                     MqlTradeResult  result={};
                     request.action=TRADE_ACTION_SLTP;
                     request.position=PositionGetTicket(i);
                     request.symbol=symbol;
                     request.sl=op+tppoint_1*pot;
                     request.tp=op+tppoint_2*pot;
                     request.comment=com;
                     request.magic=magic;
                     if(!OrderSend(request,result))
                        PrintFormat("OrderSend error %d",GetLastError()); 
                    } 
              }

           if(type==POSITION_TYPE_SELL && magic == PositionGetInteger(POSITION_MAGIC) && com == PositionGetString(POSITION_COMMENT) )
              {  
              
             if( op-ask>=pot*tppoint_1 && op-ask<tppoint_2*pot && op-tppoint_1*pot<sl  )
    
                      {
                    
                       MqlTradeRequest request={};
                       MqlTradeResult  result={};
                       request.action=TRADE_ACTION_SLTP;
                       request.position=PositionGetTicket(i);
                       request.symbol=symbol;
                       request.sl=op-tppoint_1*pot ;
                       request.tp=op-tppoint_2*pot ;
                       request.comment=com;
                       request.magic=magic;
                       if(!OrderSend(request,result))
                          PrintFormat("OrderSend error %d",GetLastError()); 
                    }
              }
           } 
        }
     }
 }
附加的文件:
SL_1.png  29 kb
SL_2.png  6 kb
TP_1.png  29 kb
TP_2.png  6 kb
 

查一下規格書 sl tp的間隔不符合規定

OHLC數據跟實測點的數據不一樣

 
Hung Wen Lin #:

查一下規格書 sl tp的間隔不符合規定

OHLC數據跟實測點的數據不一樣

谢谢你的回复。

我试过用 

request.sl= NormalizeDouble(op-tppoint1*point,Digits()) ;

request.tp= NormalizeDouble(op-tppoint2*point,Digits()) ;

但还是出现4756的情况,请问一下如果才能解决这个问题呢。

 
ken138888 #:

谢谢你的回复。

我试过用 

request.sl= NormalizeDouble(op-tppoint1*point,Digits()) ;

request.tp= NormalizeDouble(op-tppoint2*point,Digits()) ;

但还是出现4756的情况,请问一下如果才能解决这个问题呢。

研究一下這篇文章 了解一下交易規則
交易机器人在市场发布前必须经过的检验 - MQL5文章

或是參考用自帶腳本 "SymbolInfoSample" 觀察看看品種規格

交易机器人在市场发布前必须经过的检验
交易机器人在市场发布前必须经过的检验
  • www.mql5.com
任何产品在市场发布之前,它必须通过强制的预先检验,以确保符合统一的质量标准。本文介绍了开发者们在他们的技术指标和交易机器人中最常犯下的错误,并且也展示了在把产品发送到市场之前如何进行自我测试。
 
Hung Wen Lin #:

研究一下這篇文章 了解一下交易規則
交易机器人在市场发布前必须经过的检验 - MQL5文章

或是參考用自帶腳本 "SymbolInfoSample" 觀察看看品種規格

实际上它是已经成功修改了SL和TP的,但它还是提示4756,这一点才令人困扰,可以帮我修改一下吗,老板。

 
ken138888 #:

实际上它是已经成功修改了SL和TP的,但它还是提示4756,这一点才令人困扰,可以帮我修改一下吗,老板。

你把移動的點數放大看看 應該就可以的

 
Hung Wen Lin #:

你把移動的點數放大看看 應該就可以的

试过了 sl 设置到1500毫点都是这样

奇怪的是sl一样 它有时候就正常 有时候就4756。

 

看了你提供的代碼 發現邏輯上應該有問題 

int t=PositionsTotal();
   for(int i=t-1;i>=0;i--)

這一段表示你定位的是最後一張持倉單

所以你應該是針對最後一張單做處理

void yidong(int tppoint_1,int tppoint_2,string symbol,ENUM_POSITION_TYPE type,int magic,string com)

但是你處理動作需要指定持倉的方向

所以 當最後一張持倉是Buy但是你指定處理是Sell 就可能會出現問題了


我沒做測試 就是看代碼而已 是不是這樣還需要你自己去驗證

建議僅供參考

 
Hung Wen Lin #:

看了你提供的代碼 發現邏輯上應該有問題 

這一段表示你定位的是最後一張持倉單

所以你應該是針對最後一張單做處理

但是你處理動作需要指定持倉的方向

所以 當最後一張持倉是Buy但是你指定處理是Sell 就可能會出現問題了


我沒做測試 就是看代碼而已 是不是這樣還需要你自己去驗證

建議僅供參考

已经挂上模拟盘测试了 看看结果怎样 谢谢你的回复

 
还是一样 有时候正常 有时候4756 哪位大神可以解决一下
 
继续等高手