記事"アジアセッション中の夜間取引: どのように収益性を維持するか"についてのディスカッション

 

新しい記事 アジアセッション中の夜間取引: どのように収益性を維持するか はパブリッシュされました:

この記事では、夜間取引の概念、および MQL5 におけるトレーディング戦略とその実装について扱います。 テストを通じ、適切な結論を下します。

黄色の長方形の上と下の境界線を見ることができます。 価格が変動するチャネルを制限します。 既に形成された図表のチャネルを引出すことは容易です。 しかし、リアルタイムで、どのように価格が移動するか見当がつかず疑問が残ります。 では、何をすべきでしょうか。

この問題を解決するには、レンジ時に良好なシグナルを表示するボリンジャーバンドトレンドインジケーターを使用します。

図3. EURUSD M30 にボリンジャーバンドを使用する

図3. EURUSD M30 にボリンジャーバンドを使用する

作者: Dmitriy Zabudskiy

 
//--- 入力パラメータ
input int      order_time=0;                        // オーダー開始時間

どちらのテスターも困るのは、datetimeは最適化できないということだ。それゆえ、この強制的な醜さなのだ。

私たちはもっと前にこの問題を解決すべきだった。


ZYのOnTesterInitはdatetimeを助けることができるが、誰もができるわけではない。

 

ターミナルで、少なくともGMTに対するブローカーのシフト時間を知ることができればいい。より正確には、各ブローカーのターミナルに記載されるでしょう。テスト結果にも。しかし、テストは与えられている - どのようなタイムシフトがありますか?私は知らない。

TimeGMT()を リクエストするのは良いことだが、それだけでは不十分だ。そして、それはテストを考慮するために何かを与えることはありません。GMTに対するブローカーのシフト時間を正確に知る必要がある。

 
fxsaber:

どちらのテスターも困るのは、datetimeは最適化できないということだ。それゆえ、このような醜態を強いられているのだ。

もっと前に何とかすべきだった。

ここで言っているのはdatetimeのことではない:

if(time_now_str.hour==order_time && work==true && work_day==true)
作者が変数名に問題があるだけだ。
 
ANG3110:

ターミナルで、少なくともGMTに対するブローカーのシフト時間を知ることができればいい。より正確には、各ブローカーのターミナルに記載されるでしょう。テスト結果にも。しかし、テストは与えられている - どのようなタイムシフトがありますか?私は知らない。

TimeGMT()を リクエストするのは良いことだが、それだけでは不十分だ。そして、それはテストを考慮するために何かを与えることはありません。必要なのは、GMTに対するブローカーのタイムシフトである。

MT5の最適化 モードでTimeGMTを決定するのは簡単です。

 
Andrey F. Zelinsky:

これはdatetimeではありません:

著者は変数名に問題がある

私はこの記事を引用した行までしか読んでいない。しかし、datetimeの問題は存在する。時間はMQLだけでなく、人間的に言えばGUIでも最適化されるべきだ。

 
fxsaber:

MT5の最適化モードでは、1回の実行でTimeGMTを決定することは難しくありません。

しかし、別の人がテスト結果を出した場合はどうでしょうか?それを決定する方法はありません。
 
ANG3110:
他の人が検査結果を知らされたらどうするのですか?それを知る方法はない

ええ、レポートにはそのような記載はありません。だからカスタムレポートは強力なんだ。特にMT5では。

 

代わりに

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   time_now_var=TimeCurrent(time_now_str);// 現在時刻

   switch(time_now_str.day_of_week)
     {
      case 1: if(mon==false){work_day=false;}
      else {work_day=true;}
      break;
      case 2: if(tue==false){work_day=false;}
      else {work_day=true;}
      break;
      case 3: if(wen==false){work_day=false;}
      else {work_day=true;}
      break;
      case 4: if(thu==false){work_day=false;}
      else {work_day=true;}
      break;
      case 5: if(fri==false){work_day=false;}
      else {work_day=true;}
      break;
     }

の代わりにもっと単純なものを使う

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
   time_now_var=TimeCurrent(time_now_str);// 現在時刻

   switch(time_now_str.day_of_week)
     {
      case 1: work_day=mon; break;
      case 2: work_day=tue; break;
      case 3: work_day=wen; break;
      case 4: work_day=thu; break;
      case 5: work_day=fri; break;
     }
...

非効率的なコードを見ると素通りできない。
私はそのコードをさらに詳しく調べることはしなかった。

 
Eugene Myzrov:

代わりに

の代わりにもっと単純なものを使う

非効率的なコードを見ると素通りできない。
そのコードについては詳しく調べていない。

コメントありがとう。その癖はいいもので、私も時々やってしまいます......。

あなたの例:

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
   time_now_var=TimeCurrent(time_now_str);// 現在時刻

   switch(time_now_str.day_of_week)
     {
      case 1: work_day=mon; break;
      case 2: work_day=tue; break;
      case 3: work_day=wen; break;
      case 4: work_day=thu; break;
      case 5: work_day=fri; break;
     }
...

率直に言って、私には理解できません。というのも、Expert Advisorの入力変数では、仕事が必要な曜日は「true」とマークされ、その日に仕事が必要ない場合は「false」となります。

そして、変数 "work_day "は "true "または "false "として答えを送ります。あなたの例では、変数は "string "型になるので、再度比較を行う必要がある。

このEAでは、コードの最適化は 優先事項ではありませんでしたが、私はコードの最適化に 賛成です。

この特定のコードは最適化できます:

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   time_now_var=TimeCurrent(time_now_str);// 現在時刻

   work_day=true;

   switch(time_now_str.day_of_week)
     {
      case 1: if(mon==false){work_day=false;}
      break;
      case 2: if(tue==false){work_day=false;}
      break;
      case 3: if(wen==false){work_day=false;}
      break;
      case 4: if(thu==false){work_day=false;}
      break;
      case 5: if(fri==false){work_day=false;}
      break;
     }

コード・サイズは小さくなりますが、作業速度は変わりません。

関数の中にループを実装すれば、サイズは小さくなりますが、処理速度は遅くなります。

また、入力されるパラメーターを変更し、コードを変更することもできます。

 
Dmitriy Zabudskiy: コメントありがとう。いい習慣だよ、僕も時々そうするんだ...。あなたの例:正直なところ、理解できません。というのも、Expert Advisorの受信変数では、仕事が必要な曜日は「true」とマークされ、その日に仕事が必要ない場合は「false」となります。そして、変数 "work_day "は "true "または "false "として答えを送ります。あなたの例では、変数は "string "型になるので、再度比較を行う必要がある。このEAでは、コードの最適化は 優先事項ではありませんでしたが、私はコードの最適化に 賛成です。この特定のコードは最適化できます。コード・サイズは小さくなりますが、スピードは落ちません。関数の中にループを実装すれば、サイズは小さくなりますが、処理速度は遅くなります。もっと工夫して、入力されるパラメーターを変えれば、コードを変更でき、おそらく単純化できる。
   work_day=false;
   switch(time_now_str.day_of_week)
     {
      case 1: if (mon) work_day=true; break;
      case 2: if (tue) work_day=true; break;
      case 3: if (wen) work_day=true; break;
      case 4: if (thu) work_day=true; break;
      case 5: if (fri) work_day=true; break;
     }


そのようなコードも提供できるだろう。しかし、「else」演算子を取り除くことで、ソースコードを半分だけ単純化したことになる。if」演算子も削除し、5つの代入演算子だけを残せば、最適な変形が得られる。これが提案されている最適な変形になる。

switch(time_now_str.day_of_week)
     {
      case 1: work_day=mon; break;
      case 2: work_day=tue; break;
      case 3: work_day=wen; break;
      case 4: work_day=thu; break;
      case 5: work_day=fri; break;
     default: work_day=false; // в субботу и воскресенье не торгуем...
     }

しかし、「文字列」型になる変数については まったく理解できない。