mql5言語の特徴、微妙なニュアンスとテクニック - ページ 165

 
fxsaber:

はい、歴史読み上げプレゼントがあります。

その時、私のインジケーターが遅いと書きましたね。
まさにその理由を見つけたのです。口座に3万トレードを積んだとき。
なんとかブレーキを減らして......。履歴の読み取りを少し設計し直し、コードを最適化しました。でも、まだあるんです。理由は、フィルターがあり、あるフィルターをクリックするとすべてが再計算されるからです。
すべて配列から読み取るが。
5000トレードのアカウントではすべてOKです。しかし、大型のものでは問題です。
その指標だけではありません。

きれいな歴史の読み物企画を 作りました。
もしかしたら、インターネットの影響かもしれません。何しろ、全歴史が大量のデータなのですから。

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリー:イージーキャンバス

ニコライ・セムコ さん 2020.02.17 05:15

テスターモードでカンヴァスを操作する際に、興味を持ったプログラマーのために重要な点を明確にしておきたいと思います。
このコミュニティで有名なプログラマーが、こんな質問をしてきた。

- テスターモードでは、オブジェクト上に作成したパネルがキャンバス上よりもずっと速く再描画されるのに、通常モードではキャンバス上に通常の速度でパネルが描画されるのはなぜですか?

その理由がわかり、解決策も見えてきました。

問題は、オブジェクトの再描画が画面全体の再描画に連動してしまうことです。一方、テスターの画面は1秒間に30フレームも再描画されないのです。

オブジェクトは最終的に同じキャンバス(内部)ですが、オブジェクトのプロパティを 変更すると、オブジェクトのキャンバスは生成されず(再計算されず)、画面の更新(ChartRedraw)時にのみ生成されます。これはテスターでは(通常モードでも)私たちの目が変化を識別できるほどの頻度、つまり〜32フレーム/秒よりも頻繁に発生しないのです。

パネルが1目盛りごとに変化するとします。そうすると、デフォルトの canvas も tick ごとに再描画されますが、テスターでの再描画の頻度はまだ ~30 ミリ秒 (~30 fps) 以内に収まっています。

つまり、キャンバスの再計算は、実際に画面に表示される回数よりもはるかに多くなり、結果的にリソースを不当に消費することになるのです。

この問題を解決するには、canvasの再計算と再描画の頻度をコンピュータ時間の15~30ミリ秒に抑えるようにすれば、空の再計算の不要なサイクルが発生しません。

例えば、こんな風に。

void OnTick()
  {
  static uint lastCalc=0;
  uint cur=GetTickCount();
  if (cur-lastCalc>15) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }

 
例えば、「EURUSD.txt」(大文字)というファイルを作成したいが、すでに「eurusd.txt」(小文字)がディスク上にある場合、ファイル名は以前と同じになります。
 
fxsaber:
例えば、「EURUSD.txt」(大きいシンボル)というファイルを作りたいが、ディスク上にすでに「eurusd.txt」(小さいシンボル)がある場合、そのファイルは以前と同じ名前になります。

また、EURUSD TicksLongOpt.setを保存すると、eurusd tickslongopt.setが保存されます。後から名前を変更する必要があるんです。そういう煩わしい小物もたくさんあるんです。

 
Edgar Akhmadeev:

また、EURUSD TicksLongOpt.setを保存すると、eurusd tickslongopt.setが保存されます。後から名前を変更する必要があるんです。そんな面倒なことがたくさんあるんです。

まず削除してから作成すれば、すべてうまくいくと思うのですが。

 
fxsaber:

まず削除して、それから作成すれば大丈夫だと思います。

いいえ、新規にファイルを作成する場合、具体的にはターミナルダイアログから保存する場合について話しています。万人に通用しないのであれば、それは何か別のものによるのでしょう。どちらかというと、Win7を持っています。

 
Edgar Akhmadeev:

いいえ、新規にファイルを作成するという意味です。具体的には、ターミナル・ダイアログから保存する場合です。万人に通用しないのであれば、それは何か別のものによるのでしょう。どちらかというと、Win7を持っています。

FileOpen 関数とFileSave関数のことです。

 
fxsaber:

FileOpen関数とFileSave関数のことです。

そうなんです、今頃気がついたのですが、場違いなんです、話題が言語についてなのです・・・。

 
fxsaber:
構造体の配列を簡単にソート できる


アプリケーション


結果

動作しないので、アップデートしてください。ローカルクラスでテンプレート宣言を許可しない設定 TestarrSort.mq5 81 3

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define  ArraySortStruct(ARRAY, FIELD)                                            \
{                                                                                \
  class SORT                                                                     \
  {                                                                              \
  private:                                                                       \
    template <typename T>                                                        \
    static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
      const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
      int Marker = Start;                                                        \
                                                                                 \          
      for (int i = Start; i <= End; i++)                                         \
        if (Array[i].##FIELD <= Array[End].##FIELD)                              \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return(Marker - 1);                                                       \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
      if (Start < End)                                                           \
      {                                                                          \
        const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1);                                \
        SORT::QuickSort(Array, Pivot + 1, End);                                  \
      }                                                                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
  public:                                                                        \
    template <typename T>                                                        \ 
    static void Sort( T &Array[], int Count = WHOLE_ARRAY, const int Start = 0 ) \
    {                                                                            \
      if (Count == WHOLE_ARRAY)                                                  \
        Count = ::ArraySize(Array)- Start; ;                                     \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1);                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}                                                                                \


void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}

 
Vladimir Pastushak:

動作しません。アップデートできますか?ローカルクラスでテンプレート宣言が許可されていないことを書き込む TestarrSort.mq5 81 3

残念ながら、言葉が途切れて しまいました。このコードは動作しません。

void OnStart()
{
  class A
  {
    template <typename T> // template declarations are not allowed in local classes
    void f() {}
  };
}


しかし、別のバリエーションを試すこともできます。

template <typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][2] )
{                         
  T TmpArray[];
  
  for (int i = ::ArrayResize(TmpArray, ::ArrayRange(TmpSort, 0)) - 1; i >= 0; i--)
    TmpArray[i] = Array[(int)(TmpSort[i][1] + 0.1)];
    
  ::ArraySwap(Array, TmpArray);
              
  return;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define  ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
  double TmpSort[][2];                                                     \
                                                                           \
  for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--) \
  {                                                                        \
    TmpSort[i][0] = (double)ARRAY[i].FIELD;                                \
    TmpSort[i][1] = i;                                                     \
  }                                                                        \
                                                                           \
  ::ArraySort(TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                         

void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}


SZZこちらも 使用例です。

理由: