设为首页 收藏本站 切换语言

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

| 发表于 2023-10-24 14:55:15 | 显示全部楼层 |复制链接
最后由 ken138888 于 2023-10-24 14:59 编辑

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


TP2

TP2


TP1

TP1


SL2

SL2


SL1

SL1


代码如下:
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());
                    }


              }
           }
        }
     }
}
举报

评论 使用道具

精彩评论13

dxdline
DDD
| 发表于 2023-10-25 11:46:02 | 显示全部楼层
错误代码4756通常是由于所选的交易商不支持当前所选的订单执行类型的填充模式(type_filling_mode)¹。以下是解决此问题的步骤:

1. 首先,打开MetaEditor,按下F1查看MQL5帮助文档¹。

2. 然后,输入错误代码4756,接着再输入交易服务器返回代码10030¹。

3. 输入以下代码以查看所选交易商支持的订单执行类型的填充模式:`Printf (SymbolInfoInteger (Symbol (),SYMBOL_FILLING_MODE));`¹。返回值为一个整数值¹。

4. MT5一共有三种填充模式:ORDER_FILLING_FOK ,ORDER_FILLING_IOC 和 ORDER_FILLING_RETURN,且分别用数值1和2代表 (1代表FOK, 2代表IOC)¹。

5. 如果返回值与目前所选的填充类型不相符 (一般默认为FOK),我们需要对填充类型进行更改¹。
6. 在下订单的函数中添加以下代码:`MqlTradeRequest.type_filling = //所选交易商支持的填充模式//`¹。

这样,这个问题就解决了!希望这些信息对您有所帮助!
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-10-26 13:39:56 | 显示全部楼层
dxdline 发表于 2023-10-25 11:46
错误代码4756通常是由于所选的交易商不支持当前所选的订单执行类型的填充模式(type_filling_mode)¹。以 ...

Chatgpt的回答 还是不能解决问题的
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-10-28 05:31:33 | 显示全部楼层
哪个高手可以帮一下
举报

点赞 评论 使用道具

aliang9887
C
| 发表于 2023-10-28 20:24:49 | 显示全部楼层
查一下错误代码是什么意思
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-10-28 21:09:50 | 显示全部楼层
aliang9887 发表于 2023-10-28 20:24
查一下错误代码是什么意思

Invalid stops
举报

点赞 评论 使用道具

westwuwei
DDD
| 发表于 2023-10-29 08:51:48 | 显示全部楼层
“SL错误”这是一个警告,例如对于多头持仓你的 SL 设置得比当前 ASK 还高,或者距离当前报价过近(例如平台要求至少要距离15个小点才能设置SL),就会返回警告,并且拒绝设置 SL。

另外要注意,SL、TP 设置之前一定要“四舍五入到平台指定的 Digit 小数位”。例如黄金是2个小数点,白银是3个小数点,USDSEK是5个小数点,用代码从平台获得不同标的的小数点位数,然后四舍五入对你要设置的 SL、TP 值进行整理,然后才应该设置。
举报

点赞 评论 使用道具

westwuwei
DDD
| 发表于 2023-10-29 08:57:56 | 显示全部楼层
Chatgpt 确实是深谙“人云亦云”的道理,它利用搜索引擎的个人信息收集功能来作恶,它往往是抄袭和混弄小白,有很多有一点儿良知的国外的大学都明令禁止使用Chatgpt来做作业和研究。而国内许多大学以及一些网络视频作者,还在“缺德地”推广学生使用Chatgpt 来应对考试和设计论文。
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-10-31 05:30:15 | 显示全部楼层
哪位大神可以帮我一下
举报

点赞 评论 使用道具

aliang9887
C
| 发表于 2023-11-1 12:53:16 | 显示全部楼层
新手路过
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-11-3 15:54:25 | 显示全部楼层
westwuwei 发表于 2023-10-29 08:57
Chatgpt 确实是深谙“人云亦云”的道理,它利用搜索引擎的个人信息收集功能来作恶,它往往是抄袭和混弄小白 ...

Chatgpt 经常自己造函数 跟它说mql5没有这个函数 它一直说有 我说没有 报错了 它就说换个话题吧 。。。
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-11-20 21:21:05 | 显示全部楼层
没有高手吗?
举报

点赞 评论 使用道具

ken138888
B
 楼主 | 发表于 2023-12-1 06:14:25 | 显示全部楼层
继续等高手
举报

点赞 评论 使用道具

My05613828
CCC
| 发表于 2023-12-15 12:22:29 | 显示全部楼层
ken138888 发表于 2023-10-28 05:31
哪个高手可以帮一下

void     交易类::    前止损点追踪止损(string 币种,long magic,string 注释,double 追踪点数,int 零壹多贰空=0,int 前几单追踪=0)
  {
   if(追踪点数>0)
     {
      int 计数=0;
      for(int i=0; i<PositionsTotal(); i++)
        {
         if(PositionGetTicket(i)>0)
           {
            magic=魔术幻数(magic);
            if(PositionGetString(POSITION_SYMBOL)==币种&&PositionGetInteger(POSITION_MAGIC)==magic&&PositionGetString(POSITION_COMMENT)==前缀+注释)
              {
               计数++;
               if(前几单追踪>0&&计数>前几单追踪)
                  break;
               追踪点数=停损(币种,追踪点数);

               double 多持仓盈利点数=(卖价(币种)-PositionGetDouble(POSITION_PRICE_OPEN))/点值(币种);
               double 空持仓盈利点数=(PositionGetDouble(POSITION_PRICE_OPEN)-买价(币种))/点值(币种);
               double 持仓止损点数=0;
               if((多单检测()&&止损大于开盘价())||(空单检测()&&止损小于开盘价()))
                  持仓止损点数=MathAbs(PositionGetDouble(POSITION_PRICE_OPEN)-PositionGetDouble(POSITION_SL))/点值(币种);
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY&&(零壹多贰空==0||零壹多贰空==1))
                 {
                  if(多持仓盈利点数>持仓止损点数+2*追踪点数)
                    {
                     MqlTradeRequest request= {};
                     MqlTradeResult result= {};
                     request.action=TRADE_ACTION_SLTP;
                     request.magic=PositionGetInteger(POSITION_MAGIC);
                     request.position=PositionGetInteger(POSITION_TICKET);
                     request.volume=PositionGetDouble(POSITION_VOLUME);
                     request.symbol=PositionGetString(POSITION_SYMBOL);
                     request.type_filling=返回交易量指令(request.symbol);
                     request.price=PositionGetDouble(POSITION_PRICE_OPEN);
                     request.sl=request.price+(持仓止损点数+追踪点数)*点值(币种);
                     request.tp=PositionGetDouble(POSITION_TP);
                     request.deviation=deviation(滑点,request.symbol);;
                     bool X=OrderSendAsync(request,result);
                     if(X==false)
                       {
                        Print("订单发送失败代码:"+IntegerToString(GetLastError()));
                        Print("交易返回代码:"+IntegerToString(result.retcode));
                       }
                    }
                 }
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL&&(零壹多贰空==0||零壹多贰空==2))
                 {
                  if(空持仓盈利点数>持仓止损点数+2*追踪点数)
                    {
                     MqlTradeRequest request= {};
                     MqlTradeResult result= {};
                     request.action=TRADE_ACTION_SLTP;
                     request.magic=PositionGetInteger(POSITION_MAGIC);
                     request.position=PositionGetInteger(POSITION_TICKET);
                     request.volume=PositionGetDouble(POSITION_VOLUME);
                     request.symbol=PositionGetString(POSITION_SYMBOL);
                     request.type_filling=返回交易量指令(request.symbol);
                     request.price=PositionGetDouble(POSITION_PRICE_OPEN);
                     request.sl=request.price-(持仓止损点数+追踪点数)*点值(币种);
                     request.tp=PositionGetDouble(POSITION_TP);
                     request.deviation=deviation(滑点,request.symbol);;
                     bool X=OrderSendAsync(request,result);
                     if(X==false)
                       {
                        Print("订单发送失败代码:"+IntegerToString(GetLastError()));
                        Print("交易返回代码:"+IntegerToString(result.retcode));
                       }
                    }
                 }
              }
           }
        }
     }
  };
//+------------------------------------------------------------------+
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)