自定义符号。误差、错误、问题、建议。 - 页 23

 
Slava :

目前,不可能用今天以外的日子(昨天、前天、去年等)的刻度线形成自定义工具条。

但是。我们已经做了更正。

当使用CustomTicksReplace时(不是CustomTicksAdd!不要使用CustomTicksAdd来批量添加刻度线),如果之前没有今天的刻度线,那么最后一天添加的刻度线会变成 "当前"。

等到下一个版本。然后我们将继续进行实验和讨论

我在使用Build 2177。我想这是最近的一次。

但我不能用CUSTOMSYMBOL工作。你能告诉我,我什么时候可以期待一个能帮助我的构建?

我在哪里可以看到构建中的变化?

 

所附的指标在当前的2177版本中工作

这是你的指标。它是经过编辑的,但算法是一样的。我已经把Symbol.mqh文件放在MQL5/Include/Includes中。

改变线路

#include  <Includes\Symbol.mqh>

以便使用你的Symbol.mqh。

棒材已经形成。不仅在MarketWatch中,刻度线被正确地应用到历史中。


附加的文件:
 
Slava :

所附的指标在当前的2177版本中工作

这是你的指标。它是经过编辑的,但算法是一样的。我已经把Symbol.mqh文件放在MQL5/Include/Includes中。

改变线路

以便使用你的Symbol.mqh。

棒材已经形成。不仅在MarketWatch中,刻度线被正确地应用于历史上


我将检查。也许我的代码中存在一些问题。但代码看起来不错。

 

Bug 25.

当把刻度线写入自定义符号 时,它们会被不同程度地规范化!

sinput datetime inDateFrom = D'2019.12.01';

// Проверка нормализации числа.
bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

// Распечатка ненормализованных цен тиков.
void CheckNorm( const MqlTick &Ticks[], const int MaxAmount = 10 )
{  
  const int Size = ArraySize(Ticks);
  
  for (int i = 0, Count  = 0; (i < Size) && (Count < MaxAmount); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}

// Нормализация цен тика.
void Normalize( MqlTick &Tick, const int digits )
{
  Tick.bid = ::NormalizeDouble(Tick.bid, digits);
  Tick.ask = ::NormalizeDouble(Tick.ask,  digits);
  Tick.last = ::NormalizeDouble(Tick.last, digits);
}

// Нормализация цен тиков.
void Normalize( MqlTick &Ticks[], const int digits )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    Normalize(Ticks[i], digits);
}

void OnStart()
{
  const string Name = "TEMP12345";                                                           // Имя кастомного символа
  const string SymbOrig = "EURUSD";                                                          // Имя оригинального символа

  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)inDateFrom * 1000); // Считали EURUSD-тики.
    
  if ((Size > 0) && CustomSymbolCreate(Name, NULL, SymbOrig) && SymbolSelect(Name, true))    // Создали символ на основе EURUSD.
  {
    const int digits = (int)SymbolInfoInteger(Name, SYMBOL_DIGITS);
    
    Normalize(Ticks, digits);                                                                // Нормализовали цены тиков.
    
    Print("Check1");
    CheckNorm(Ticks);                                                                        // Проверили, что цены тиков нормализованы.
    
    CustomTicksReplace(Name, 0, LONG_MAX, Ticks);                                            // Поместили в него историю EURUSD.        

    MqlTick NewTicks[];
    
    CopyTicksRange(Name, NewTicks, COPY_TICKS_ALL, (long)inDateFrom * 1000);                 // Считали тики из кастомного символа
    
    Print("Check2");
    CheckNorm(NewTicks);                                                                     // Проверили, что цены тиков нормализованы.
  }
}


结果

Check1
Check2
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 


终端里面似乎有某种NormalizeDouble,与标准的不同。这个错误可能会无形中影响许多算法。


请修复它。写作归一化价格的自然需求无法实现。

 
fxsaber:

Bug 25.

当把蜱虫写到自定义符号时,它们是混合的!

结果

终端似乎有自己的NormalizeDouble,与标准的不同。这个错误可能会无形中影响许多算法。

请修复它。写作归一化价格的自然需求无法实现。

你有一个重载的Normalize函数
试着改变函数的名称。
也许这将导致规范化的失败。

 
fxsaber:

Bug 25.

当把蜱虫写到自定义符号时,它们是混合的!


结果


终端似乎有自己的NormalizeDouble,与标准的不同。这个错误可能会不知不觉地影响许多算法。


请修复它。写作归一化价格的自然需求无法实现。

这两种情况都是小数点 规范化的结果。

你还在为绝对平等而比较实数吗?

哪个服务器是原始蜱虫的来源?

 
Roman:

你有一个重载的Normalize函数
,试着改变函数名称。
也许这就是归一化不正确的原因。

在代码中,有一个正确规范化的测试。在将刻度线写入自定义符号 之前,这个测试是成功的。我检查了代码。

 
Slava:

这两种情况都是按小数点后 的数字进行归一化的结果。

你还在为绝对平等而比较实数吗?

哪个服务器是原始蜱虫的来源?

MQ-Beta服务器。但服务器与这种情况完全没有关系。我做什么。

  1. 我将刻度线阵列规范化,并检查是否如此。
  2. 我把它写在自定义符号中。
  3. 从自定义符号中读取写入的刻度线。
  4. 检查它们是否正常化 - 它们没有被正常化。
就是说,我派人写了一个虱子,但它们是由别人写的。
 
可能是由于终端的 紧急关闭,尾巴被留在了bases/Custom 文件夹中。
 
fxsaber:

Bug 25.

2280 - 已修复,谢谢。