カスタムシンボル。エラー、バグ、質問、提案。 - ページ 23

 
Slava :

現時点では、今日ではない日(昨日、一昨日、昨年など)のティックを使ってカスタムツールバーを形成することはできません。

でも。訂正をいたしました。

CustomTicksReplaceを使用する場合(CustomTicksAddではありません!CustomTicksAddでティックを一括追加しないでください)、以前に今日のティックがなかった場合、追加したティックの最終日が「現在」になります。

次のビルドを待ってください。その後、実験とディスカッションを続ける

Build 2177を使用しています。一番新しいものだと思います。

しかし、CUSTOMSYMBOLと連携することはできない。いつ頃、私に役立つビルドを期待できるか教えてください。

ビルドの変更点はどこで確認できますか?

 

添付のインジケータは、現在のビルド2177で動作します。

これがあなたのインジケーターです。編集されていますが、アルゴリズムは同じです。Symbol.mqhをMQL5Includeに配置しました。

行を変更する

#include  <Includes\Symbol.mqh>

を使用して、Symbol.mqhを使用するようにします。

バーが形成される。MarketWatchに限らず、履歴に刻みが正しく反映されます


ファイル:
 
Slava :

添付のインジケータは、現在のビルド2177で動作します。

これがあなたのインジケーターです。編集されていますが、アルゴリズムは同じです。Symbol.mqhをMQL5Includeに配置しました。

行を変更する

を使用して、Symbol.mqhを使用するようにします。

バーが形成される。MarketWatchに限らず、歴史には刻みが正しく適用される


確認させていただきます。私のコードに問題があるのかもしれません。でも、コードは良さそうですね。

 

バグ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 


Terminal内部に標準とは異なるNormalizeDoubleがあるようです。このバグは、目に見えない形で多くのアルゴリズムに影響を与える可能性があります。


修正お願いします。正規化された価格を書くという当然のニーズが実現できない。

 
fxsaber:

バグ25

カスタムシンボルにテロップを書き込むと、テロップが混ざってしまう!

結果

Terminalは、標準のものとは異なる独自のNormalizeDoubleを持っているようです。このバグは、目に見えない形で多くのアルゴリズムに影響を与える可能性があります。

修正お願いします。正規化された価格を書くという当然のニーズが実現できない。

Normalize関数がオーバーロードされています。
関数名を変えてみてください。
もしかしたら、これで正常化が失敗するかもしれません。

 
fxsaber:

バグ25

カスタムシンボルにテロップを書き込むと、テロップが混ざってしまう!


結果


Terminalは、標準のものとは異なる独自のNormalizeDoubleを持っているようです。このバグは、目に見えない形で多くのアルゴリズムに影響を与える可能性があります。


修正お願いします。正規化された価格を書くという当然のニーズが実現できない。

いずれの場合も、小数点以下が 正規化された結果である。

絶対的な平等を求める実数比較はまだか?

元のダニの発生源はどのサーバーですか?

 
Roman:

Normalize 関数がオーバーロードされています。
関数名を変更してみてください。
そのためか、正規化が正しく行われていない。

コード内に正しい正規化のためのテストがあります。カスタムシンボルに 目盛りを書き込む前に、このテストは成功します。コードを確認しました。

 
Slava:

いずれの場合も、小数点 以下の桁数で正規化した結果です。

今でも絶対的な平等性を求めて実数を比較しているのでしょうか?

元のダニの発生源はどのサーバーですか?

MQ-Betaサーバーです。しかし、この状況にサーバーは全く関係ない。私の仕事

  1. 刻みの配列を正規化し、そうであることを確認しています。
  2. カスタムシンボルに書き込んでいます。
  3. カスタムシンボルから書き込まれたティックを読み込む。
  4. 正規化されているかどうかを確認する - 正規化されていません。
つまり、1ティックを書くために送ったのに、他の人が書いてしまったということです。
 
Terminalの 緊急閉鎖の ためか、tailはbasesCustom フォルダに残っています。
 
fxsaber:

バグ25

2280 - 修正済み、ありがとうございます。