Time()の問題点

 
MQL4コミュニティーの皆様、こんにちは。

これが私の最初の投稿です。 まず、私はMQLの開発者ではないことをご理解ください。 私はトレーダーであり、EAを構築するためのツールを使っています。 そのツールはMQL構造を使用することができますが、明示的なMQL関数を実行するわけではありません。 単にMQLコードを受け取り、MQLベースの条件が真/偽であるかを評価し、OpenBuy, OpenSell, CloseBuy, CloseSell, DeletePendingBuy, DeletePendingSell などのカスタム関数を実行するだけです。 しかし、明示的にMQLコードを実行するわけではありません。 例えば、Print関数やComment 関数を使用して、MT4のチャートウィンドウに何かを表示させることができます(あくまで一例です)。

ですから、私はMQLについてほんの少し知っています。それは、私がEAを構築するのに使っているEA開発ツールを使えるようにするのに十分な程度です。 これまで、このツールを使って10個のEAを作り、そのうち7個は採算が合わずに断念しました。これは、以前Excelでトレーディングシステムを作ったときの試作成功率より30%ほど良い数字です。 私は通常、10個のアイデアのうち7-8個は期待したほど利益が上がらず、最適化プロセスを開始するのに十分な利益を生む2-3個のデザインが残ると予想しています。 さて、私について、また私がどのような人間であるかについては、もう十分でしょう。

ここに私の問題があり、私は助けを求めて正しい場所に来たことを願っています!

私はこのコード[b]取引を閉じるために実行している:[/b]。

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent() >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent() >=21 && TimeMinute(TimeCurrent()) >=57

注:問題は、月曜日から木曜日まで、23:57まですべてのトレードがオープンなままであることです。 また、金曜日も21:57まですべてのトレードがオープンなままです。


また、このコードをMQLブロック[b]で実行して、トレードをオープンしています[/b]。

TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05

注:00:00から00:05の間に開く唯一の取引は、テスター開始ボタンをクリックしたときの、バックテストの最初の取引です。 この取引は00:00に正確にオープンしています。 しかし、他の取引はどれも週明けの00:00と00:05の間にオープンしていません。

まとめると

- 00:00にテスター開始ボタンをクリックした後、1つの取引が開始されます。
- その後、23:57(月~木)または21:57(金)に取引がクローズされることはない。
- その後、00:00から00:05の間に取引が開始されることはありません。

上記のすべての時間帯は、十分なティックフローがあります。 つまり、Testerが使用するデータには隙間がありませんでした。

何かご助言をお願いします。 なぜこれらの取引はコード化された時間に決済されないのでしょうか? 月曜日から金曜日の00:00から00:05の間は常にトレードシグナルが利用可能であるのに、なぜトレードが実行されないのでしょうか?

ありがとうございました。
cfx
 

何が実行され、何が実行されないかを知るために、どのようなデバッグ用Print文をコードに追加しましたか? 例えば、OrderClose()は失敗していますか?それともOrderClose()につながるコードですか? 戻り値に注目して、関連するエラーをPrintしますか?

関数の戻り値とは何ですか?どのように使用するのですか?

Day()はStrategy Testerで正しく機能しますか? それが機能することをテストしましたか? 代わりにTimeDayOfWeek() を使うことができます .

 

>私はこのコード [b] to close trades:[/b] を実行しています。

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

>注:問題は、すべての取引が月曜日から木曜日まで、23:57まで開かれたままであることです。 また、すべての取引は金曜日の 21:57まで開いたままです。

これは初心者によくあるミスで、論理式全体を1行に収めようとするものです。これではデバッグができません。

コツは、テストを小さな断片に分解して、それぞれのビットを(Print 文などで)チェックすることです。

どの日でも23:57以降にクローズさせることができるでしょうか?このテストでは、曜日を気にする必要はありません。一つのテストが正しく動作するようになれば、より冒険ができるようになります。しかし、可能な限り数行を使用し、デバッグのためにPrint 文が間に入るようにします。うまくいったら、Print 文は削除して、コードを別の行にします。コードは何行にも分けて書いた方が効率的です(実行速度が速くなります)。

 
  1.  Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    のどちらを指しているのでしょうか?
    Day() == 1 || Day() == 2 || Day() == 3 || ( Day() == 4 && TimeHour(TimeCurrent()) >=23) && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    ( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    常に括弧を完全につけるか、簡略化して自己文書化するか
    #define HR2157 79020 // 21 * 3600 + 57 * 60
    #define HR2357 86220
    datetime now = TimeCurrent();
    int      tod = now % 86400;
    bool     isFriday = TimeDayOfWeek(now) == 5;
    if (isFriday) int todClose = HR215700;
    else              todClose = HR235700
    if (now >= todClose) ...
    

  2. https://www.mql5.com/en/forum/127483 テスターでDayOfWeek()が必ず5を返すと報告されたので、Timexxx()のバージョンしか使っていません。
 
WHRoeder:
  1. どのような意味でしょうか?
OPは明らかに金曜日以外の平日をORすることを意味しています。明らかに、彼は取引日の終わりまでに強制終了しようとしていますが、金曜日は短いです。23:57を過ぎればいつでもクローズできるので、4日間のORを使うテストは冗長であることに彼は気づいていません。金曜日を除外する必要はないのです!
 
RaptorUK:

何が実行され、何が実行されないかを知るために、どのようなデバッグ用Print文をコードに追加しましたか? 例えば、OrderClose()は失敗していますか?それともOrderClose()につながるコードですか? 戻り値に注目して、関連するエラーをPrintしますか?

関数の戻り値とは何ですか?どのように使用するのですか?

Day()はStrategy Testerで正しく動作しますか? 動作することをテストしましたか? 代わりにTimeDayOfWeek() を使うことができます .


私はそのような目的のためにPrint文は使っていません。 最初の投稿でタイプミスがありました。 私が使っているツールは、PrintやCommentのようなMQL関数を使うことができません[/b](本来は「できる」と入力しました)。 そのため、タイプミスがあり、返信に影響を与えたことをお詫びします。

しかし、Tester Journalを見ると、EAがあるべき時(00:00)に取引の準備をしておらず、あるべき時(月~木23:59、金21:57)に取引のクローズをインスタンス化していないことが容易に分かります。 基本的には、Testerの実行時にEAがロードされていること、デモ口座に関する必須の情報が表示されていること、そして最後にEAが使用するインジケータのすべてのタイムフレームがエラーなしで適切にロードされていることが確認できます。 私は通常、自分のEAでいかなる種類のエラーも発生させません。 そして、私は日常的にマルチタイムフレームEAを常にテストしています。

Time()関数にだけ問題があるようです。

オープンされるポジションは、EAがTester Startボタンをクリックした後に見る最初のトレードだけなので、Day()が機能しているかどうかは、プリントやコメントからの出力からはわかりません。 しかし、無作為のテストとして、私は月~金の00:00にポジションを開くことを制御するコードセグメントから [b]TimeMinute(TimeCurrent()) <= 05[/b] という行を削除してみました。 そうすると、以下のコードが設計通りに動作するようになりました。

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent() >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent() >=21 && TimeMinute(TimeCurrent()) >=57

これは、実際にDay()が演繹的に動作していることを教えてくれます。 実際、ポジションをクローズするコードのセグメント全体は動作しています。 しかし、なぜか、ポジションのオープンを制御するコードのセグメントで [b]TimeMinute(TimeCurrent()) <= 05[/b] が使用されているときは、そうではありません。 この皮肉は私には意味がありません - なぜこのようなことが起こるのか理解できません。

ありがとうございます。

cfx

 
dabbler:

>私はこのコードを実行しています [b] to close trades:[/b].

>注:問題は、すべての取引が月曜日から木曜日まで、23:57まで開かれたままであることです。また、金曜日も21:57まですべてのトレードがオープンなままです。

これは初心者に非常に多いミスで、論理式全体を1行に収めようとします。これではデバッグができません。

コツは、テストを小さく分割して、それぞれのビットを(Print 文などで)チェックすることです。

どの日の23:57以降に閉じるようにできるか?このテストでは、曜日を気にする必要はありません。一度、一つのテストが正しく動作するようになれば、もっと冒険ができるようになります。しかし、可能な限り数行を使用し、デバッグのためにPrint 文が間に入るようにします。うまくいったら、Print 文は削除して、コードを別の行にします。コードは何行にも分けて書いた方が効率的です(実行速度が速くなります)。


ところで、皆さんからの返信に感謝します。


Close Controlは動作します。Open Controlから[b]TimeMinute(TimeCurrent()) <= 05[/b]を削除すると、確かに動作するようになりました。テスター開始ボタンをクリックした後に実行された最初のポジションは、確かに23時57分(月~木)にクローズされます。問題は、オープンコントロールが設計上要求しているように、00:00に新しいポジションがオープンされないということです ([b]TimeHour(TimeCurrent() == 00 && TimeMinute(TimeCurrent()) <= 05[/b]).サニティチェックのために [b]TimeMinute(TimeCurrent()) <=5[/b] という関数を 削除してもです。

コードをできるだけコンパクトにすることが最良の選択肢だと思いましたが、各関数、セグメント、コンポーネントなどを拡張して、それが役に立つかどうか試してみます。


ありがとうございました。

cfx

 
WHRoeder:
  1. どのような意味ですか?
    常に完全に括弧をつけるか、簡略化して自己文書化するか
  2. https://www.mql5.com/en/forum/127483 テスターでDayOfWeek()が必ず5を返すと報告されたので、Timexxx()のバージョンしか使っていません。

という意味です。

( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57


このコードセグメントには、括弧が欠けているようです。 もし訂正していただけるなら、感謝します。 私が使っているツールは、括弧が欠けたときに知らせてくれますが、どこが欠けたかは教えてくれません。


ありがとうございます。

 
dabbler:
OPは明らかに金曜日を除く平日を全てORすることを意味しています。明らかに、彼は取引日の終了前に強制終了しようとしていますが、金曜日は短いです。23:57を過ぎればいつでもクローズできるので、4日間のORを使うテストは冗長であることに彼は気づいていないのです。金曜日を除外する必要はないのです!

金曜日を切り離さなければ、月曜から木曜の閉店時間と金曜の閉店時間の区別がつかなくなるのです。 どちらの閉館時間も、単に「時間帯」ではなく、「曜日」によって区別されます。

したがって、月曜日から木曜日は23:57に、金曜日は21:57にそれぞれ閉店する必要があります。 もし金曜日のクローズを月曜日から木曜日まで含めると、すべてのトレードはEAが見た中で最も早い時刻、つまり月曜日から木曜日の必要なクローズ時刻のまる2時間前の21時57分にクローズされることになります。

あなたの発言を明確にしてください。 ありがとうございました。

cfx

 


MT4の「時間」ベースの機能の大半は、マジで欠陥があるんじゃないかと思い始めています。


つまり、私のポジションコントロールのロジックをすべてリセットして、次のような平凡なものにすればいいのです。 TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59のようなありふれたものにポジションコントロールのロジックをすべてリセットしても、一度もトレードが成立しない(EAは単にコードを無視する!)のなら、MT4にはこの種の関数に関して修正すべきいくつかの問題があると言うことになりますね。


また、以下を使用して一連のテストを実行しました。DayOfWeek() != 0 && DayOfWeek() !=, そして、月曜日から金曜日まで、一度もトレードが開始されませんでした! 実際、一度もトレードが開かれませんでした。 しかし、時間ベースの機能を完全に削除したら、EAはどうなったと思いますか? もちろん、エラーもなく設計通りに動いています。 私はMQLの開発者ではありませんが、論理的な構造を開発することは得意で、システム的な問題を感じるとそれを察知することができます。 MetaQuotesはTime()関数に問題があると感じています。 MQLでコーディングしている他の人たちが、MT4の時間ベースの関数で苦労しているのを見たことがあります。

何が問題なのかよくわからないのですが、Opening Controlロジック(すべてのトレードの開始を制御するコードの一部)からTimeMinute(TimeCurrent()) <= 05を取り除くと、最初のトレードだけが正しい時刻に決済されて、それ以外のまったく同じOpening Controlロジックによるトレードはその後EAによって完全に無視されてしまうので、何か関数そのものにシステム的に問題があるのだとわかります。

コードはこれ以上簡単にはなりません。 私はEAに00:00から00:05の間に取引を開始するよう指示しています。 これは決して難しいことではありません。 6歳の子供でもできるコードです。 ここでもう一度。 [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


これだ。 私はそれをコード化しました。 そのコードを今使っているツールにドロップすると、ツールは「コードの構文は正しいです!」と教えてくれます。 さて、次はどうしましょう? .ex4ファイルを何百万回となくコンパイルし、M4 Testerを走らせます。 さて、どうする? 最初の取引は00:00に開始されます。 すごいだろ? いやー! なぜか? 月曜日の23:59に、まだポジションが開いているからです。 それから? 次の取引セッション(次のD1バー)の00:00に、古き良き [b]TimeHour(TimeCurrent() == 00 && TimeHour(TimeCurrent()) <= 05[/b] は、終値コントロールが失敗したところを通過する、そうですか? 違う! なぜか? なぜなら、00:00から00:05の間、EAがトレードを開始することはないからです!!!!

この単純なコードに2日費やしましたが、なぜ動かないのか、誰も教えてくれません。 これは、MetaQuotesに問題があることを示しています。

OK、私は今吐き出しているところです。 2日分の鬱積したフラストレーションを吐き出す必要がありました。

私のEAには問題がなく、W1とMNを除くすべての時間枠を使って、かなり洗練されたデザインを組み立てることができました。 私のEAはすべて、私がゼロから構築し、研究したiCustom デザインを使用しています。

V8エンジンのように順調に動いていたのに、突然Time()関数を使い始めて、大混乱? 何かがおかしいのだ。 このTimeベースの関数は、可能な限りシンプルな方法で使っているのに、まだ動かないのか? このようなことに48時間も費やすのは、私にとっては膨大な時間の浪費でした。 悔しいので、可能なら「時間」なしで生活してみようと思います。

Time()関数を使ったトレードロジックを開発する方法を学ばなければならないだろう。

非現実的ですね。

 

CFx 2012.05.31 03:41

笑)。


MT4の「時間」ベースの機能の大半は、マジで欠陥があるんじゃないかと思い始めています。


つまり、私のポジションコントロールのロジックを全てリセットして、以下のような平凡なものにすると。TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59のようなありふれたものにポジションコントロールのロジックをすべてリセットしても、一度もトレードが成立しない(EAは単にコードを無視する!)のなら、MT4にはこの種の関数に関して修正すべきいくつかの問題があると言うことになりますね。


また、以下を使用して一連のテストを実行しました。DayOfWeek() != 0 && DayOfWeek() !=, そして、月曜日から金曜日まで、一度もトレードが開始されませんでした!実際、一度もトレードが開かれませんでした。しかし、時間ベースの機能を完全に削除したら、EAはどうなったと思いますか?もちろん、エラーもなく設計通りに動いています。私はMQLの開発者ではありませんが、論理的な構造を開発する ことは得意で、システム的な問題を感じるとそれを察知することができます。MetaQuotesはTime()関数に問題があると感じています。MQLでコーディングしている他の人たちが、MT4の時間ベースの関数で苦労しているのを見たことがあります。

何が問題なのかよくわからないのですが、オープニング・コントロール・ロジック(すべてのトレードのオープニングをコントロールするコードの一部)から TimeMinute(TimeCurrent()) <= 05 を削除すると、最初のトレードだけが正しい時刻にクローズし、まったく同じオープニング・コントロール・ロジックによって行われた他のすべてのトレードはその後EAによって即座に無視されます。

コードはこれ以上簡単にはなりません。私はEAに00:00から00:05の間に取引を開始 するよう指示しています。これは決して難しいことではありません。6歳の子供でもできるコードです。ここでもう一度。[b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


これだ。私はそれをコード化しました。そのコードを今使っているツールにドロップすると、ツールは「コードの構文は正しいです!」と教えてくれます。さて、次はどうしましょう?.ex4ファイルを何百万回となくコンパイルし、M4 Testerを走らせます。さて、どうする?最初の取引は00:00に開始されます。すごいだろ?いやー!なぜか?月曜日の23:59に、まだポジションが開いているからです。それから?次の取引セッション(次のD1バー)の00:00に、古き良き [b]TimeHour(TimeCurrent() == 00 && TimeHour(TimeCurrent()) <= 05[/b] は、終値コントロールが失敗したところを通過する、そうですか?違う!なぜか?なぜなら、00:00から00:05の間、EAがトレードを開始することはないからです!!!!

この単純なコードに2日費やしましたが、なぜ動かないのか、誰も教えてくれません。これは、MetaQuotesに問題があることを示しています。

OK、私は今吐き出しているところです。2日分の鬱積したフラストレーションを吐き出す必要がありました。

私のEAには問題がなく、W1とMNを除くすべての時間枠を使って、かなり洗練されたデザインを組み立てることができました。私のEAはすべて、私がゼロから構築し、研究したiCustomデザインを使用しています。

V8エンジンのように順調に動いていたのに、突然Time()関数を使い始めて、大混乱?何かがおかしいのだ。このTimeベースの関数は、可能な限りシンプルな方法で使っているのに、まだ動かないのか?このようなことに48時間も費やすのは、私にとっては膨大な時間の浪費でした。悔しいので、可能なら「時間」なしで生活してみようと思います。

Time()関数を使ったトレードロジックを開発する方法を学ばなければならない。

アンリアルですね。

笑)。非現実的なのはあなたです。あなたのこのコード ....

if (TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05)

...は決して真を返しません。

あなたは、さらに「あなたの」論理構成を開発する必要がある人です。

そして、これを構築する...

if (TimeHour(TimeCurrent()) >= 00 && TimeHour(TimeCurrent()) <= 05)
理由: