文章 "如何在"应用商店"中发布产品" - 页 48

 

我的 EA 在注册新产品时返回错误:

test onEURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market] 由于订单或头寸接近市场,修改失败。

但我的 EA 是在 WIN$ 上运行的,而不是外汇。为什么测试器不让你知道运行哪种资产?

现在我怎么才能纠正没有错误的东西,因为 EA 运行得很好,我只是无法注册产品进行销售。

 
Adriano De Mello Moura #:

我的 EA 在注册新产品时返回错误:

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market] 我的EA在注册新产品时返回错误。

我的 EA 是在 WIN$ 上运行的,而不是外汇。为什么测试器不让你知道运行哪种资产?

现在我怎么才能纠正没有错误的东西,因为 EA 运行得很好,我只是无法注册产品进行销售。

机器人必须准备好在任何资产上运行....。


要纠正上述错误,您必须在修改仓位前进行以下检查:

//+--------------------------------------------------------------------------------------------------------------------+
//| 检查止盈/止损与收盘价之间的距离是否大于 SYMBOL_TRADE_STOPS_LEVEL
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- 本地变量
   bool SL_check = false, TP_check = false;

//--- 确定当前符号的最后价格
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- 获取 SYMBOL_TRADE_STOPS_LEVEL 级别
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- 仅检查两种订单类型
   switch(type)
     {
      //--- 购买操作
      case  ORDER_TYPE_BUY:
        {
         //--- 检查止损
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- 检查 TakeProfit
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- 返回检查结果
         return(SL_check && TP_check);
        }
      //--- 卖出操作
      case  ORDER_TYPE_SELL:
        {
         //--- 检查止损
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- 检查 TakeProfit
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- 返回检查结果
         return(TP_check && SL_check);
        }
      break;
     }

//--- 验证成功
   return(false);
  }



请参阅下面文章中机器人应进行的其他检查:

交易机器人在市场上发布前应通过哪些测试 - MQL5 文章

 

你好,我无法编辑我的一个旧产品的产品描述

我按照各种论坛上的说明进行了操作,包括重新编写描述、从市场上隐藏等等,但描述仍然恢复到原始版本。

现在,我再也无法在市场上恢复产品,也无法对其进行编辑。我已在论坛上请求与此问题相关的帮助,但至今没有得到任何帮助。

如何解决 "无法编辑产品描述 "的问题?请提供帮助

 

加载智能交易系统并进行测试时,它写入了一个错误,我不知道如何纠正。

测试欧元兑美元,H1(净额结算)

2020.04.14 00:24:42 在 1.09044 处即时买入 0.01 欧元兑美元失败 [无效交易量]

2020.04.14 00:24:45 在 1.09044 即时买入 0.01 欧元兑美元失败 [无效交易量]

2020.04.14 00:24:48 在1.09037即时买入0.01欧元兑美元失败 [无效交易量]

2020.04.21 00:01:34 即时买入0.01欧元兑美元失败,价格为1.08626 [无效交易量]

2020.04.21 00:01:37 在1.08626价位即时买入0.01欧元兑美元失败 [无效交易量]

2020.04.21 00:01:40 在1.08626价位即时买入0.01欧元兑美元失败 [无效交易量]

2020.04.27 16:08:24 即时卖出 0.01 EURUSD 失败,价格 1.08546 [无效交易量]

2020.04.27 16:08:27 在1.08548价位即时卖出0.01欧元兑美元失败 [无效交易量]

2020.04.27 16:08:30 在1.08547价位即时卖出0.01欧元兑美元失败 [无效交易量]

2020.04.29 20:15:52 在1.08565价位即时卖出0.01欧元兑美元失败 [无效交易量]

2020.04.29 20:15:55 0.01 EURUSD即时卖出失败,价格为1.08566 [无效交易量]

2020.04.29 20:15:58 0.01 EURUSD即时卖出失败,价格1.08566 [无效交易量]

2020.05.18 00:12:09 即时买入 0.01 欧元兑美元,价格为 1.08134 [无效交易量] 失败

2020.05.18 00:12:12 在1.08134价位即时买入0.01欧元兑美元失败 [无效交易量]

2020.05.18 00:12:15 在1.08143价位即时买入0.01欧元兑美元失败 [无效交易量]

2020.05.21 15:50:25 即时卖出 0.01 EURUSD 失败,价格 1.10031 [无效交易量]

2020.05.21 15:50:28 0.01 EURUSD即时卖出失败,价格1.10034 [无效交易量]

2020.05.21 15:50:31 即时卖出 0.01 欧元兑美元,价格 1.10036 失败 [无效交易量]

2020.05.25 19:00:05 即时买入 0.01 欧元兑美元,价格为 1.08950 [无效交易量] 失败

2020.05.25 19:00:08 在1.08951价位即时买入0.01欧元兑美元失败 [无效交易量]

2020.05.25 19:00:11 Instant Buy 0.01 EURUSD at 1.08952 [Invalid volume] 失败

没有交易操作

 
Kirill Voytseshchuk #:

加载智能交易系统并进行测试时会写入错误,但不清楚如何纠正。

在欧元兑美元 H1(净价)上测试

2020.04.14 00:24:42 在 1.09044 处即时买入 0.01 欧元兑美元失败 [无效交易量]

***

请阅读完整的错误信息--其中会有 "哪些检查应该通过...... "一文的链接。
 

阅读并写入代码

交易操作中不正确的交易量

在发送交易订单之前,还有必要检查订单中指定的交易量是否正确。在调用 OrderSend() 功能之前,应检查 Expert Advisor 在订单中指定的手数。对于金融工具,规范 规定了 允许的最小和最大交易量以及交易量分级。在 MQL5 中,您可以 使用 SymbolInfoDouble() 函数ENUM_SYMBOL_INFO_DOUBLE 枚举 中获取这些值。

//+------------------------------------------------------------------+
//| 检查订单量是否正确 ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- 允许的最低交易量
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("体积小于允许的最小值 SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- 允许的最大交易量
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("体积大于允许的最大值 SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 获得最小体积分级
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("体积不是最小分级 SYMBOL_VOLUME_STEP=%.2f 的倍数,最近的正确体积为 %.2f"。,
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="正确的体积值";
   return(true);
  }

没有帮助,我可以修改其他代码吗?

您能告诉我如何完善脚本吗?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

阅读它,将其写入代码

贸易业务中不正确的交易量

在发送交易订单之前,还有必要检查订单中指定的交易量是否正确。在调用 OrderSend() 功能之前,应检查 Expert Advisor 在订单中指定的手数。对于金融工具,规范 规定了 允许的最小和最大交易量以及交易量分级。在 MQL5 中,可以 使用 SymbolInfoDouble() 函数ENUM_SYMBOL_INFO_DOUBLE 枚举 中获取这些值。

没有帮助,我可以修改其他代码吗?

您能告诉我如何完善脚本吗?

请完整阅读文章,"CheckVolumeValue "是对输入参数正确性的检查。

此外,还需要检查批次四舍五入是否正确......

 

考虑到未结头寸的交易量和挂单 的交易量,最终的检查结果将如下所示:

//+------------------------------------------------------------------+
//| 按符号返回订单的最大允许交易量。
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- 获取订单中的最大交易量限制
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- 获取音量的字符限制
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- 按符号获取未平仓合约的成交量
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- 如果我们已经用完了音量
      if(max_volume-opened_volume<=0)
         return(0);

      //--- 开仓量不超过 max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

add?

checkvolumevalue.mq5 如下所示


//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

//-------------------------------找出体积级数中包含的小数位数
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- 在循环中检查许多不同的音量值
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("检查结果,volume,": ",descr);
        }
        else PrintFormat("%G量是正确的"。,volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//| 检查订单量是否正确 ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- 允许的最低交易量
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("体积小于允许的最小值 SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- 允许的最大交易量
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("体积大于允许的最大值 SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 获得最小体积分级
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("体积不是最小分级 SYMBOL_VOLUME_STEP=%.2f 的倍数,最近的正确体积为 %.2f"。,
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="正确的体积值";
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk 挂单 的交易量,最终的检查结果将如下所示:

添加?

checkvolumevalue.mq5 如下所示


所有必要的检查都在这篇文章中几乎一个用于创建 EA 的构造函数

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

前面提到的代码合适吗?

您可以编写文章中必要的几行。