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

 
Yedelkin:

不思議ですね。MQL5用のコードが必要ですが、すでにウェブサイトに掲載されているはずです。調べるだけでいいんです。まさにその通りです。

でも、それはあなた次第です。

とても面倒な検索です、もしかしたら誰かが教えてくれるかもしれません。

ちなみに、このコードはmql5用に作り直しました。もしかしたら、誰かが使ってくれるかもしれない。

input double risk=0.01;
   double lot_min =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double lot_max =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double lot_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double contract=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   double lot;
   
     lot=NormalizeDouble(free_margin*risk*leverage/contract,2);
     lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
 
紳士の皆さん。
をコメントしてください。

enum_trade_return_codes
コード ID 説明
10004 TRADE_RETCODE_REQUOTE リクエストが拒否されました。
10006 TRADE_RETCODE_REJECT リクエスト拒否
...
コード10005はありません。これはエラーではないのでしょうか?
謹んで ...
 

質問です。GetTickCount() という関数があり、システムが起動してから経過したミリ秒数を返します注意書き には、「システムタイマーの分解能によってカウントが制限 される」とあります。時刻は符号なし整数で保存されているので、コンピュータを連続稼働させると49.7日ごとにオーバーフロー する」。

また、カウンターがオーバーフローした後はどうなるのでしょうか?リセットされて新しいカウントダウンが始まったり、システムがフリーズしたりしませんか?

 

Yedelkin:

カウンターがオーバーフローするとどうなるのでしょうか?リセットされて新しいカウントが始まるのか、それともシステムがフリーズするのか?

オーバーフローして、ゼロからスタートします。
 
Renat:
オーバーフローして、ゼロからスタートする。
OK、了解!
 

質問です。switch(expression){...}の説明には、「switch 演算子の式は 整数型でなければ ならない」と書かれています。 この演算子を他の型の式で表現する記述をネットで見たことがあります。文字列型の式を追加することで、switch演算子の用途は広がるのでしょうか?

 
Yedelkin:

質問です。switch(expression){...}の説明には、「switch 演算子の式は 整数型でなければ ならない」と書かれています。 この演算子を他の型の式で表現する記述をネットで見たことがあります。文字列型の式を追加することで、switch演算子の使い方を拡張するのでしょうか?

いいえ、残念ながら、そうではありません。文字列型の場合のみ、...でなければでなければ

switch で整数型を 使用すると、switch オペレータの動作が数倍速くなります。

Документация по MQL5: Основы языка / Типы данных / Целые типы
Документация по MQL5: Основы языка / Типы данных / Целые типы
  • www.mql5.com
Основы языка / Типы данных / Целые типы - Документация по MQL5
 
stringo:

いいえ、残念ながらそうではありません。文字列型の場合のみ、 ...でなければさもなくば

switchで整数型を 使用すると、以下のように数倍高速化されます。

OK、教えてくれてありがとう!
 

質問です。StringConcatenate() 関数の説明には、StringConcatenate()は 文字列型の 一時変数を使用しないため、加算操作による文字列連結よりも高速でメモリ使用量も少なく動作する」と書かれています。リファレンスマニュアルに掲載されている例を少し変えて使ってみました。

   string a="a",b="b",c;
   uint   start,stop;
   long   i,length=10000000;
//--- первый способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);


//--- второй способ
   a="a"; // заново инициализируем переменную a
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(a,b);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);

//--- третий способ
   a="a";c="";  
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      int k=StringConcatenate(c,a,b);
      //c="";   //с такой строчкой работает ещё дольше.          
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
と出力されます。

DR 0 DoubleToString (EURGBP,M1) 22:15:55  time for 'c = a + b'              = 2359 milliseconds, i = 10000000
QE 0 DoubleToString (EURGBP,M1) 22:15:56  time for 'StringAdd(a,b)'          = 1031 milliseconds, i = 10000000
FE 0 DoubleToString (EURGBP,M1) 22:16:00  time for 'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000

StringConcatenateは 加算演算を用いた文字列結合よりも動作が遅いことが判明した。何が問題なのか?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Yedelkin:

質問です。StringConcatenate() 関数の説明には、StringConcatenate()は 文字列型の 一時変数を使用しないため、加算操作による文字列連結よりも高速でメモリ使用量も少なく動作する」と書かれています。リファレンスにある例を、少し変えて使ってみました。

出力されました。

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

チェックというと語弊がありますが、(私の理解が正しければ)。機能の仕掛けは別にあるのですが...。

このコードについて

////////////////////////////////////////////////////////////////////////////////
//             Global variables, used in working the trade system             //
////////////////////////////////////////////////////////////////////////////////
string a="Пример";
double b=1.26,c = 1.27;
string d;

uint   start,stop;

long   i,length=10000000;
////////////////////////////////////////////////////////////////////////////////
void OnStart()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

start=GetTickCount();
   
  for(i=0;i<length;i++)
  {
  d=a+(string)b+(string)c;
  }

stop=GetTickCount();

Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  StringAdd(d,a);
  StringAdd(d,(string)b);
  StringAdd(d,(string)c);
  }
stop=GetTickCount();

Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  int k=StringConcatenate(d,a,b,c);
  }

stop=GetTickCount();

Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

そしてこの結果

2011.04.15 15:28:58     123 (EURUSD,D1) time for 'd = a + b + c' = 81094 milliseconds, i = 10000000
2011.04.15 15:30:24     123 (EURUSD,D1) time for 'StringAdd()' = 85828 milliseconds, i = 10000000
2011.04.15 15:31:46     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 10000000
2011.04.15 15:33:36     123 (EURUSD,D1) time for 'd = a + b + c' = 82938 milliseconds, i = 10000000
2011.04.15 15:35:00     123 (EURUSD,D1) time for 'StringAdd()' = 83859 milliseconds, i = 10000000
2011.04.15 15:36:21     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000

追記

もっとも、d= ""の行はforループに入れるべきでしたが、このバグは結果にあまり影響しないと思います。