初心者を助ける - 曜日と時刻の機能

 

こんにちは。

私はここで初心者なので、いくつかの助けを必要としています。

私は、日曜日のマーケットが開くときに取引するEAを持っています。EAの問題は、それが平日にも取引を行うことであり、私はそれを望んでいない。

私はそれが次のように動作するようにしたい。

extern int StartDay="sunday"

extern int StartTime="23:00"

extern int StopDay="monday" (月曜日)

extern int StopTime="15:00"(ストップタイム

Day="sunday "でマーケットが開いている場合(sunday 23:00 から monday 15:00 の間に1つの取引しかできない、TP や SL のために取引が終了した場合は新しい取引はない)

{

取引開始(すでにあるコード)

}

MQLでこれを行うにはどうしたらよいでしょうか?

 

Time[0]をチェックする

日付と時刻の関数の ヘルプにあるこれらの関数を用いて

 
// SEE IF THIS WORK FOR YOU..... (I'VE NOT TESTED IT....)



int start()
{
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )
      go_trading();

}
 
abstract_mind:
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )

これが正しいかどうかはわかりません。sunday_cond」は、23時から0時までの間、毎日真になります。したがって、このコードはsunday_condか monday_condのどちらかを 行うため、毎日23時以降に取引する可能性があります。さらに、日曜日の15時までは「monday_cond」が満たされています。可能性は低いですが、タイムゾーンによってはそれも取引時間内に入る可能性があります。さらに重要なことは、Hour() <= 15は午後3時までではなく、午後3時59分までが真であるということです。


しかし、EagleEyeが行うべきことは、時刻と、DayOfWeek()やTimeDayOfWeek()を使って曜日を チェックするという点で、原理は明らかに正しいのです。

 
jjc:

これが正しいかどうかはわかりません。sunday_cond」は、23時から0時までの間、毎日真になります。したがって、このコードはsunday_condか monday_condのどちらかを 行うため、毎日23時以降に取引する可能性があります。さらに、日曜日の15時までは「monday_cond」が満たされています。可能性は低いですが、タイムゾーンによってはそれも取引時間内に入る可能性があります。さらに重要なことは、Hour() <= 15は午後3時までではなく、午後3時59分までが真であるということです。


しかし、EagleEyeが行うべきことは、時刻と、DayOfWeek()やTimeDayOfWeek()を使って曜日をチェックするという点で、原理は明らかに正しいのです。



おっしゃる通りです。これでうまくいくはずです。

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
go_trading();
 

ありがとう、みんな。


これを試してみて、うまくいったらお知らせします。

 

only one trade can be open between sunday 23:00 and monday 15:00

上記のコードは、15:00 (Hour()<15) ではなく、日曜日 23:00 から月曜日 15:59 (Hour()<=15)) まで取引する必要があります。

また、許可された期間中に1回だけ取引を開始するためのコードも必要でしょう。

 
sunday_cond と monday_cond はどのような型にすればよいのでしょうか? int?
 

この部分の意味がよくわからないのですが、WHRoeder :月曜日15:59 (Hour()<=15)、15:00 (Hour()<15)ではないのですか?

そうです、そのコードも必要なのです。誰かがそれを私に提供できることを願っています。

 
EagleEye:

そうですね、そのコードも必要です。誰かがそれを提供してくれることを願っています。

これは少し変わった問題で、現在の取引ウィンドウですでに取引を開始している場合、たとえその取引が終了していたとしても、新しい取引を行うことはできません。このフォーラムでのほとんどの議論は、現在開いている取引がないことを確認することだけに関係しています(そしてそれはよく出てくる話題です)。


要するに、クローズドトレードをチェックする方法として、3つの選択肢があります。


  1. 新しい取引を開始するときに、変数に現在の時刻を 格納する。新しい取引を開始するときに、変数に現在の時刻を格納する。新しい取引の発注を検討するときに、格納された最後の取引の時刻が現在の取引ウィンドウに含まれないことを確認する。
  2. 上記と同様ですが、MT4のグローバル変数に最後の取引の時刻を保存します。
  3. MT4の取引リストをスキャンし、現在の取引ウィンドウの間に開かれたクローズドトレードを探します。


これらのオプションは、おおよそ複雑な順に並んでいます(また、パフォーマンスの逆順でもあり、つまり、3が圧倒的に遅いですが、これらの間に速度差があっても実生活で問題になることはほとんどありません)。


しかし、選択肢は回復力の高い順に並んでいます。


  1. 最後の取引時間が変数(メモリ内)に格納されている場合、MT4が再起動されたり、何らかの理由でEAが再ロードされたりすると、その値は失われます。言い換えると、EAが再ロードされると、同じ取引ウィンドウで複数回取引される可能性があります。
  2. 時間がMT4グローバル変数に格納されている場合、その記録はEAの再ロードに耐えられるはずです。しかし、取引を新しいコンピュータに急いで移動する必要がある場合、最後の取引時間の記録は失われます(MT4のgvariables.datファイルのバックアップが利用可能でない限り)。
  3. MT4の取引リストをスキャンすることは、災害復旧の観点から適切に回復する唯一のオプションです。別のコンピュータのMT4のコピーからブローカー口座にログインしてEAを起動し、不正な追加取引を行わないことを保証してもらうことが可能です。


 

// アプローチ_1

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
if(OrdersTotal()==0)
go_trading();



// アプローチ_2

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
{
if(number_of_longs()==0) // Count the longs from both "trade context" and history for the period in qestion. There is code for counting open longs/shorts in the forum
go_trading_longs();
if(number_of_shorts()==0)
go_trading_shorts();

}
理由: