交易机器人在市场发布前必须经过的检验

 

新文章 交易机器人在市场发布前必须经过的检验 已发布:

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

平台中集成的策略测试器不仅允许回测交易系统,而且可以用于发现交易机器人开发过程中的逻辑和算法错误,在测试中,所有有关交易操作的消息以及发现的错误都输出在测试器的日志(Journal)中。使用特别的记录阅读器就可以很方便地分析这些消息, 它可以使用上下文菜单的命令调用出来。

作者:MetaQuotes Software Corp.

 

这部分引发了疑问:

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- 获取开盘价
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//-- 股本和必要保证金值
   double margin,equity=AccountInfoDouble(ACCOUNT_EQUITY);
   //--- 调用测试函数
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- 出错了,报告并返回 false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- 如果没有足够资金执行操作
   if(margin>equity)
     {
      //--- 报告错误并返回 false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- 测试成功
   return(true);
  }

为什么要求保证金是与权益相比,而不是与自由保证金相比?

 
Andrey Barinov:

这部分引起了疑问:

为什么要求的保证金与权益相比,而不是与自由保证金相比?

合理 - 我们会解决的。
 

感谢您的文章,但到目前为止,我还无法使用 "AccountFreeMarginCheck "获得工作结果。

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   // -- 如果钱不够
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- 测试成功
   return(true);
  }

AccountFreeMarginCheck 的任何变体都 会出错,根本无法为市场设置智能交易系统,我试着从用户那里了解情况,然后就出现了这篇文章,没办法,无论你做什么或不做什么

如果在 GetLastError()!=134 条件中添加 GetLastError()!=134,或者使用上述函数,只会出错失败。

上述函数会产生这样的错误。

2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function
2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051

我可能弄错了,0.1 是手动指定的正常手数,货币对的 MODE_MINLOT 是 0.01。

但老实说,我越是深入研究,就越不明白问题出在哪里。

 

也许应该在该函数中将手数正常化,这样就不会出现 Disabled。

然后函数写入没有资金,但不会向服务器发送开仓 请求,这符合市场规则。

我最近开始使用这样的指令,大约是在两年前:

double margin=EMPTY_VALUE;
      margin=AccountFreeMarginCheck(sy,op,ll);
      if(margin>0)
        {

        ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)),
coomment,mn,0,clOpen);
         
        }
      else Print("Not Enought Money Margin Required"+(string)margin);

实际上一切正常。

开仓时,EA 只返回Print("Not Enought Money Margin Required "+( string)margin) 字符串

该智能交易系统已经过市场测试,大家都很满意。

 

我使用这个选项进行精确计算,只有它能帮我解决这个问题。然后,您就可以自由比较它们了。

Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE);  //肩部 
RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE);  //交易量*1 手 
MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits());
MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits());
FreeMargin  = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
 

半年前,我在市场上测试过一个 Expert Advisor,它在第二或第三天就会在测试器中崩溃,出现除数为零的 错误。Expert Advisor 有几十条评论,也就是说,它是买来的。还有几百条评论。

许多人都写道存在这个问题,并建议对方每天重启一次!!!!!

原来,市场规则的严格性是由其执行的可选择性补偿的?

SUS: 我不记得这个Expert Advisor的名字了,但它是一个顶级的,而且不便宜。某种黄牛。

 

亲爱的作者,感谢您的文章。

如果可以的话,MQL4 的代码中有一个小错误。函数CheckMoneyForTrade

double free_margin=AccountFreeMarginCheck(symb,lots,type);

required:

double free_margin=AccountFreeMarginCheck(symb,type,lots);
 

在该功能

bool CheckMoneyForTrade(string symb, double lots,int type)

你必须将自由保证金检查功能从

double free_margin=AccountFreeMarginCheck(symb,lots,type);

改为

double free_margin=AccountFreeMarginCheck(symb,type,lots);

来使其正常工作。

 
所有语言的文章都已修复,谢谢。
 
飞镖马戏团。开发人员决定不再费心,而是让每个用户编写和调试相同的代码,围绕一个基本命令OrderSend 编排 "手鼓舞",而不是在终端端一次编写所有必要的检查程序。非常感谢这篇文章的作者花时间描述了这些隐患,如果终端开发人员对用户友好的话,这些隐患根本就不应该存在。我个人非常鄙视终端开发人员的这种做法。因为他们的懒惰导致开发人员在 MQL 中损失了成千上万的时间。