新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 704

 
Alexander_K2:

不过,有些事情真的很不对劲......。

我的意思是,我做一次OrderSelect,然后再从函数中做一次...那是一个地狱般的东西...

  1. 您已在票据上选择了一个订单
  2. 你去找检查订单数量 的函数。如果有一个以上的订单,所有可用的订单将在循环中被逐一选择。
  3. 当您从该功能返回时,所选择的订单将是客户终端中订单列表的最后一个(它不一定是您在第1点中选择的订单)。
  4. 然后你检查一个新订单的关闭时间,你试图关闭那个据说被票据选中的订单,但它的选择已经丢失。

简单的逻辑...

注意你正在进行的操作顺序。

很明显,你必须首先检查数量,然后选择所需的订单,再对其进行必要的操作。

 
Maxim Kuznetsov:

你从哪个方向看订单阵列?

如果在 "修订 "过程中可能出现关闭/删除的情况,最好向相反方向看从OrdersTotal()-1到0(含)。

否则你可能会有麻烦 :-)


我曾经差点以这种方式发现我的个人圣杯:-)

而将旧的订单从 "时间深处 "移到现在(偶尔一次,不是所有的),将测试者的盈利能力提高到了天上 :-)

 
Artyom Trishkin:
  1. 您已经选择了一个按票价的订单
  2. 你已经进入职能部门检查订单的数量。如果有一个以上的订单,所有可用的订单将被逐一选出,计入循环。
  3. 当您从该功能返回时,所选择的订单将是客户终端中订单列表的最后一个(它不一定是您在第1点中选择的订单)。
  4. 然后你检查一个新订单的关闭时间,你试图关闭那个据说被票据选中的订单,但它的选择已经丢失。

简单的逻辑...

注意你正在进行的操作顺序。

很明显,你必须首先检查数量,然后选择正确的订单,再对其进行必要的操作。

我曾这样做过。

RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(OrderSelect(ticket_sell_NZDUSD, SELECT_BY_TICKET)==true)
         {
         ctm_ticket_sell_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_sell_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_SELL)
                  {
                  double AskNorm=NormalizeDouble(Ask,Digits);
                  OrderClose(ticket_sell_NZDUSD,0.01,AskNorm,0);
                  }
               }
            }
         }

只需把顺序计算放在第一位,然后再放其他东西。

谢谢你,Artem。我的圣杯是它的功劳。正是这个错误让我痛苦不堪......。

 

如何计算小数点 后的数字?

例如,我发现最小手数是0.01。

MarketInfo("EURUSD",MODE_MINLOT)

我如何推断出小数点后 的数字是2?
将订单量规范化到小数点后两位数。

 
multiplicator:

如何计算小数点 后的数字?

例如,我发现最小手数是0.01。

我如何推断出小数点后 的数字是2?
来规范订单量到小数点后两位数。

试试这个。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}
 
Alekseu Fedotov:

试试这个。

为什么要提供这样的旧东西?

乘法器

如何计算小数点 后的数字?

例如,我了解到,最小手数是0.01。

我怎样才能知道小数点后 的数字是2?
然后将订单量规范化到小数点后两位数。

这里有一个文章中 现成的功能。

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
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);
  }

剩下的就是根据这个函数返回的结果,添加一个动作。

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 
我看到,当我打开它时,终端将订单规范化到所需的小数位数
我把很多像这样的
OrderSend(Symbol(),OP_BUY,1.11111111,Ask,3,0,0);
并以1.11的交易量开盘。

因此,也许你不需要将任何东西正常化?
 
multiplicator:
我看到,当我打开终端时,终端将订单规范化到所需的小数位数
也许没有必要使任何东西正常化?

如果编辑也这样做--没有必要。

 
multiplicator:
我看到终端在打开时将订单规范化到所需的小数位数
也许你不需要使任何东西正常化?

如果你想得到一个又一个的错误,就不要进行正常化。

 
Artyom Trishkin:

如果你想随后得到一个又一个的错误,就不要进行正常化。

由于某些原因,终端不显示错误)
原因: