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

 
fxsaber #:

数値フィールドがソートに使われる特殊なケース(最も一般的な状況)のために、私は以前のものより数桁高速な変種を書いた。しかし、メモリを2倍消費する。これは大きな配列に関係する。


アプリケーション(実行時間の測定付き)。


結果

このオプションをどう思いますか?

#include <QuickSort.mqh>

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279
#define _BV2(A) _BV(A, 100) // Алертим все, что исполняется дольше 100 микросекунд.

struct STRUCT : public MqlTick
{
  double Num;
};

typedef bool (*FuncLess)( const STRUCT&, const STRUCT& );

bool Less( const STRUCT& struct1, const STRUCT& struct2 )
{
   return struct1.Num < struct2.Num;
}

void function1( STRUCT& array[] )
{
   QuickSort< STRUCT, FuncLess >( array, Less );
}

void OnStart()
{
  STRUCT Array[];
  
  const int Size = ArrayResize(Array, 1 e5);
  
  for (int i = Size - 1; i >= 0; i--)
    Array[i].Num = Size - i;
    
//  _BV2(ArraySortStruct(Array, Num));
//  _BV2(ArraySortStruct2(Array, Num));
  
  _BV2( function1( Array ) );
  
}
 
Koldun Zloy #:

これはどうだ?

テストできないんだ。

 
fxsaber #:

チェックしない。

クイックソートのライブラリはこちら

Быстрая сортировка.
Быстрая сортировка.
  • www.mql5.com
Функции для сортировки массивов. Позволяют сортировать строки и структуры по любому условию.
 
Koldun Zloy #:

クイックソートのライブラリはこちら

ありがとう!私もQuickSortを持って いるようだが、なぜかものすごく遅い。


あなたのオプションは、より速く使用するために、何らかの方法でマクロに包むことができるかもしれません...

 
fxsaber #:

ありがとう!QuickSortも持って いるようですが、なぜかブレーキが乱暴です。


あなたのオプションはマクロで包んで、より速く使えるようにできるかもしれない...。

マクロが必要な理由がわからない。そのままで非常にシンプルだ。

 

C言語でこのような書式を作成するにはどうすればよいでしょうか:

int sort(void *arr,size_t isize,size_t size, int (*cmp)(void *item1,void *item2)); /// типовой прототип sort с функцией сравнения

???

テンプレートをソートしようとしている:

template <typename T>

int sort(T &arr[],int (*cmp)(const T &,const T&))
{.

}

引数に関数ポインタを入れることはできません。引数に関数ポインタを入れることはできません。

しかし、typedefはテンプレートにはなりえない。

macromsはこのような問題を解決してくれる :-)

 
Maxim Kuznetsov #:

C言語でこのような書式を作成する場合、どのようにすればよいのだろうか:

int sort(void *arr,size_t isize,size_t size, int (*cmp)(void *item1,void *item2)); /// типовой прототип sort с функцией сравнения

???

テンプレートを使おうとしています:

引数に関数ポインターを入れることはできません。引数に関数ポインターを入れることはできません。

しかし、typedefをテンプレートにすることはできない。

macromsはこのような問題を解決してくれる :-)

template <typename T> struct SORT
  {
   typedef int       (*cmp)(const T &, const T&);
   static  int       Do(T &arr[], cmp) {return 0;}
  };

int SortInt(const int &, const int &) {return 0;}

void OnStart()
  {
   int arr[];
   SORT<int>::Do(arr, SortInt);
  }
 

私はMQL(およびC++)の明白ではない機能を発見した。

class C1
  {
public:
   virtual void      f1(int p = 1) {Print(p);}
  };
class C2: public C1
  {
public:
   virtual  void     f1(int p = 2) {Print(p);}
  };

void OnStart()
  {
   C2 obj;
   C1 *p = &obj;
   p.f1();        //Prints "1"
  }

つまり、メソッド呼び出し(p.f1())の時点でパラメータ(p)にデフォルト値が代入され、この値はクラスC1のメソッド記述から取得される(オブジェクトobjの実際の型ではなく、変数ptrの宣言された型である。

(一般的には論理的である)。

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

エラー、バグ、質問

Andrey Dik, 2022.06.24 08:38

MQL_VISUAL_MODEは MQL_TESTERの特殊なケースですか?

MQL_OPTIMIZATIONはMQL_TESTERの特殊なケース ですか?

つまり、MQL_TESTERは MQL_VISUAL_ MODEとMQL_OPTIMIZATIONの両方を含みますか?

MQLInfoInteger()をチェックする際に、このケースに適したフラグを選択する方法がわかりません。

例えば、このように非常に単純に行うことができます:

if (MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_CHART_MODE))

{

  //выполняем некоторые действия

}

しかし、MQL_CHART_MODE フラグは mql5では提供されて いません。


どなたかお考えがありますか?

 
Andrey Dik #:

どう思う?

if (ChartID()!=0) {

    // Graphical chart presents
    // draws on it

}

理由: