MQL5で学び、共に書く - ページ 14

 

興味本位で調べてみた。結果は以下の通りです。

2011.04.15 15:50:34     123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04.15 15:51:54     123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04.15 15:53:22     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04.15 15:55:11     123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04.15 15:56:39     123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04.15 15:58:12     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

でも、ここ(アルゴリズムのチェックという意味)がおかしいような気がするのですが・・・。

 

Yedelkin:

StringConcatenateは 加算演算を用いた文字列結合よりも遅いことが判明した。何が引っかかるのか?

弦楽器のクセ。
最初のパスでは、文字列の 加算と変換の 結果を格納するのに適したバッファサイズを取得します。つまり、文字列d、(文字列)b、(文字列)cに対するバッファの再配置はありません。
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
mql5:
特徴的な文字列。
最初のパスでは、文字列の 加算と変換の 結果を格納するための正しいバッファサイズを取得します。つまり、文字列d、(文字列)b、(文字列)cに対するバッファの再配置は起こりません。

様々な比較方法を試してみたが、思うような結果が得られない。このコードに行き着いたのです。

   uint   start,stop;
   long   i,length=1000000;
   string a1[1000000]; for(i=0;i<length;i++) a1[i]="Пример";
   string a2[1000000]; for(i=0;i<length;i++) a2[i]="Пример";
   string a3[1000000]; for(i=0;i<length;i++) a3[i]="Пример";

   double b1[1000000]; ArrayInitialize(b1,1.26);
   double b2[1000000]; ArrayInitialize(b2,1.26);
   double b3[1000000]; ArrayInitialize(b3,1.26);

   double c1[1000000]; ArrayInitialize(c1,1.27);
   double c2[1000000]; ArrayInitialize(c2,1.27);
   double c3[1000000]; ArrayInitialize(c3,1.27);

   string d1[1000000]; for(i=0;i<length;i++) d1[i]=NULL;
   string d2[1000000]; for(i=0;i<length;i++) d2[i]=NULL;
   string d3[1000000]; for(i=0;i<length;i++) d3[i]=NULL;


////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      d1[i]=a1[i]+(string)b1[i]+(string)c1[i];
     }
   stop=GetTickCount();
   Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(d2[i],a2[i]);
      StringAdd(d2[i],(string)b2[i]);
      StringAdd(d2[i],(string)c2[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringConcatenate(d3[i],a3[i],b3[i],c3[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);

結果

KL 0 DoubleToString (EURGBP,M1)      23:53:01        time for 'd = a + b + c' = 15766 milliseconds, i = 1000000
HD 0 DoubleToString (EURGBP,M1)      23:53:26        time for 'StringAdd()' = 25390 milliseconds, i = 1000000
FK 0 DoubleToString (EURGBP,M1)      23:54:03        time for 'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS 0 DoubleToString (EURGBP,M1)      23:54:56        time for 'd = a + b + c' = 15781 milliseconds, i = 1000000
FL 0 DoubleToString (EURGBP,M1)      23:55:21        time for 'StringAdd()' = 25375 milliseconds, i = 1000000
OR 0 DoubleToString (EURGBP,M1)      23:55:57        time for 'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
 
質問です。OrdersTotal() 関数は、取引口座の有効な注文の合計数を返します特定のシンボルの有効注文数を簡単に取得する方法はありますか?
 
Yedelkin:
質問です。OrdersTotal() 関数は、取引口座の有効な注文の合計数を返しますあるシンボルの有効注文数を簡単に取得する方法はありますか?
全履歴を取得し、選択する。
 
Urain:
全容を把握し、サンプリングを行う。
OKです。だから、簡単な方法はないんです。
 

質問です。HistorySelect() 関数とHistorySelectByPosition() 関数は、注文の履歴と取引の履歴 要求 します。 ガイドに掲載されている解説スクリプトを実行したところ、その案件リストが昇順に並びました。それとも、関数HistorySelect() とHistorySelectByPosition() は、昇順で並べられたリストを返すようにプログラムされて いるのでしょうか?

 
Yedelkin:

質問です。HistorySelect() 関数とHistorySelectByPosition() 関数は、注文の履歴と取引の履歴 要求 します。 ガイドに掲載されている解説スクリプトを実行したところ、その案件リストが昇順に並びました。それとも、HistorySelect()とHistorySelectByPosition() 関数が 昇順でリストを返すようにプログラム されているのでしょうか?

何度実験しても結果は同じで、ある方法で並べられたリストが返されるのです。

一度は、エントリーのソート方法を正確に指定する追加パラメータのリクエストを書きたいと思ったこともあります。

でも、よくよく考えてみると、書いても意味がない(彼らは自分でその分類に答えるかもしれないし)、書かないのは間違いかもしれないが...と判断しました。

 
Interesting:

自分で解決する

ただ、プリセットの強制振り分けがあればいいのですが、手動で追加の振り分けを作るのは、また別の話です。
 
Yedelkin:
ただ、プリセットの強制振り分けがあるのと、手動で追加の振り分けを作るのは別の話です。

ただ、MT4では手動でソートして(フィルタリングも)、私の記憶違いでなければ「バブル」でソートしていました。

そこでデータベースからソートコードを取得したので、それを明確にすることができます。

また、MQL5では履歴クエリが履歴タブに紐付かないことが理解できたので、ソートの方法は決めていません(ソートや内容は、ユーザーがタブで行ったことに依存しない)。

理由: