mql5语言的特点、微妙之处以及技巧 - 页 128

 
这对我来说是一个巨大的启示
// Скрипт показыает, что цены открытия/закрытия не просто не нормализованы, но и разные при схожем значении

#property strict

#include <MT4Orders.mqh>

// Заполнение массива ценами открытия/закрытия
int FillPrices( double &Prices[] )
{
  const int Total = OrdersHistoryTotal();
  
  ArrayResize(Prices, Total << 1);
  
  int Amount = 0;
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      Prices[Amount++] = OrderOpenPrice();
      Prices[Amount++] = OrderClosePrice();
    }

  return(ArrayResize(Prices, Amount));
}

// true - нормализованная разность равна нуля, сама разность - отлична от нуля.
bool IsBadPrices( const double &Price1, const double &Price2 )
{
  return(!NormalizeDouble(Price1 - Price2, 5) && (Price1 != Price2));
}

// Находит цены открытия/закрытия, которые
// с нормализацией равны друг другу,
// без нормализации - не равны.
int CheckPrices( const double &Prices[] )
{
  int Res = 0;
  const int Size = ArraySize(Prices);
  
  for (int i = 0; i < Size - 1; i++)
  {
    const double Price = Prices[i];
    
    for (int j = i + 1; j < Size; j++)
      if (IsBadPrices(Price, Prices[j]))
      {
        Print((string)Price + " - " + (string)Prices[j] + " = " + (string)(Price - Prices[j])); // Распечатываем найденые цены
        
        Res++;
      }
  }
    
  return(Res);
}

void OnStart()
{
  double Prices[];
  
  FillPrices(Prices);
  Print(CheckPrices(Prices)); // Количество "несовпадающих" пар цен.
}


结果

1.95562 - 1.95562 = -2.220446049250313 e-016
1.95562 - 1.95562 = -2.220446049250313 e-016
1.71599 - 1.71599 = -2.220446049250313 e-016
1.71599 - 1.71599 = -2.220446049250313 e-016
1.58028 - 1.58028 = -2.220446049250313 e-016
14.806 - 14.806 = -1.77635683940025 e-015
1.95521 - 1.95521 = -2.220446049250313 e-016
1.95521 - 1.95521 = -2.220446049250313 e-016
8


在MT4上运行同样的脚本甚至更令人沮丧--那里有一个更大的故事。让我解释一下。


在这里你可以看到,该仓位是在同一价格开仓和平仓的。但在没有归一化的情况下,它们的价格是不平等的!


ZZY检查了测试器--似乎没有这种讨厌的东西。

 
Ilya Malev:

我一定是打错了。

如果是这样,你应该写信给技术支持,让它得到纠正(改成中等)。 否则,它就是一个测试者 花絮。

 
fxsaber:

检查了测试器--似乎没有任何这种恶心的东西。

在所有的测试器模式中,除了真实的ticks之外,价格都没有被规范化!

// Советник выводит цены, которые не нормализованы

#property strict

// true - нормализованная цена не равна оригинальной
bool IsBadPrice( const double &Price )
{
  return(NormalizeDouble(Price, 5) != Price);
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

//const bool Init = EventSetMillisecondTimer(50);
//void OnTimer()
void OnTick()
{
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const string Symb = SymbolName(i, true);
    
    const double PriceBid = SymbolInfoDouble(Symb, SYMBOL_BID);
    const double PriceAsk = SymbolInfoDouble(Symb, SYMBOL_ASK);
    
    if (IsBadPrice(PriceBid))
      Print(TOSTRING(Symb) + TOSTRING(PriceBid) + TOSTRING(NormalizeDouble(PriceBid, 5) - PriceBid));

    if (IsBadPrice(PriceAsk))
      Print(TOSTRING(Symb) + TOSTRING(PriceAsk) + TOSTRING(NormalizeDouble(PriceAsk, 5) - PriceAsk));
  }
}


结果

2019.02.18 23:57:24   Symb = EURUSD PriceBid = 1.13088 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313 e-016 
2019.02.18 23:57:26   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313 e-016 
2019.02.18 23:57:27   Symb = EURUSD PriceBid = 1.13085 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313 e-016 
2019.02.18 23:58:18   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313 e-016 


说得温和一点,这是测试器的一个错误。

 

比方说,当你试图登录你的账户时,你无法连接到交易服务器。

或者,例如,你的模拟账户已经过期,登录尝试给出 "无效账户"。


尽管有这样的失败,但所有的交易历史都是可用的,即使它没有在终端中显示出来!

 
fxsaber:

比方说,当你试图登录你的账户时,你无法连接到交易服务器。

或者,例如,你的模拟账户已经过期,登录尝试给出 "无效账户"。


尽管有这样的失败,但所有的交易历史都是可用的,即使它没有在终端中显示出来!

那么,历史被储存在哪里?

 
Alexey Navoykov:

如果是这样,你应该写信给技术支持,让它得到修复(达到中等水平)。 否则,这是一个用于测试员grails的趣闻。

在分支 "bug, questions "中,官方已经答复说没有什么会改变。更确切地说,他们根本无视所有的理性问题,回答说 "用真实的刻度来测试",我把这解释为严格的否定答案

这是一个不幸的自欺欺人的 "花边新闻"。虽然,也许还有人可以利用它在商业上以某种方式作弊(即经纪公司--这样就造成了价差规范的假象,如果这个人不进入真正的蜱虫,而99.9%的人不会这样做)。
 
Ilya Malev:

虽然可能是别人可以利用它在商业上进行某种程度的欺骗(即经纪公司--这样就造成了点差规范的假象,如果这个人不进入真正的点差,而99.9%不会)。

理论上,所有的东西都应该在服务器上同步。 在ticks中的东西--应该在bar中。 但当然,我不知道现实中是怎样的。

 
与本主题无关的评论已被移至"mql4语言的特点、复杂性和技术"。
 

ME有一个ALT+V的组合,你可以看到系统剪贴板以前的数值。即使你从浏览器中复制了一些东西,而ME在后台工作,ME也会看到它并记住它。

粗略地说,ME能看到你在电脑上做的很多事情。例如,如果你通过缓冲区从其他资源粘贴一个账户或个人账户的密码,它将进入当前ME会话的历史。

 
fxsaber:

ME有一个ALT+V的组合,你可以看到系统剪贴板以前的数值。即使你从浏览器中复制了一些东西,而ME在后台工作,ME也会看到它并记住它。

粗略地说,ME能看到你在电脑上做的很多事情。例如,如果你通过缓冲区粘贴一个账户密码,它将进入当前ME会话的历史。

哇,我复制了加密货币的密码。这对我来说有多大的危害呢?