ライブラリ: コントロール_トレード_セッション - ページ 2

 
Forester #:
単に時間による比較が行われています。
ちなみに、任意の値を設定することも可能です。

セッション時間はブローカーから取得されますが、手動で設定することも可能です。

私が言っていたのは内部コードのことであり、呼び出しや入力パラメータのことではありません。

datetime Sec = TimeSec(time); //その日の現在の秒数
...
if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] ) && ( Sec < this.TradeTimeTo[i][DayOfWeek] ))

ここではSecが24時間の範囲で指定されていますが、from-toの境界がありません。例えば、午前3時の時間がリクエストされ、セッションが夜21時から午前8時まで取引されている場合、trueが返されるはずですが、条件が満たされずfalseが返されます。

 
Stanislav Korotky #:

私が言っていたのは内部コードのことであって、呼び出しや入力パラメータのことではありません。

ここではSecが24時間単位の範囲で指定されていますが、from-toの境界がありません。例えば、午前3時の時刻がリクエストされ、セッションの取引時間が夜9時から午前8時までである場合、trueが返されるはずですが、条件が満たされずfalseが返されてしまいます。

これは2つのセッションで設定可能です:
21-24および0-8

これは理論上の質問ですが、実際の取引センターにはこのような「from-to」の範囲は存在するのでしょうか?

 
Forester #:

これは2つのセッションで設定できます:
21-24 および 0-8

これはあくまで理論上の質問ですが、DCには実際にこのようなfrom-toの設定があるのでしょうか?

「2つのセッションで設定する」とはどういう意味ですか? それらはMT5の設定から取得されるものであり、私たちが設定するものではありません。また、MT5では1つのセッション=1つのエントリです。一部のブローカー(市場から地理的に離れているため)では、そのようなケースがあるかもしれません。 その場合、SymbolInfoSessionTradeは追加の日数を考慮したtoの時刻を返します(少なくとも以前はそうでした――今すぐ確認はしていませんが)。つまり、from < toという条件は常に満たされていました。
 
Stanislav Korotky #:
「2つのセッションを設定する」とはどういう意味ですか?

sunputでは、日ごとにセッションを個別に設定することができます。プログラムはそれに基づいて動作します。

を接続します #define LoadSessionFromInputs // 入力からセッションを読み込みます

Stanislav Korotky#:
この場合、SymbolInfoSessionTradeは追加の日数を考慮した「to」の時間を返します(少なくとも以前はそうでした。今すぐ確認はしていませんが)。つまり、「from < to 」という条件は常に満たされていました。

つまり、20:00 ~ 32:00 ということですか?

ブローカーからテスト可能な実例が提供されれば、その例に合わせて修正し、確認することができます。
現時点では、深夜0時を境にセッションを2つに分割するという簡単な解決策があります。また、どの日に分割するかを指定することも可能です。例えば、土曜日の8:00までは金曜日の残り、日曜日の20:00からは月曜日の開始とするなどです。

 
Forester #:

つまり、20:00~32:00ということですか?

はい。そのようなサーバーを備えた既成のデータセンターは、今のところ見当たりません。ニュージーランドのどこかで探す必要があります。
 
Stanislav Korotky #:
はい。そのようなサーバーを備えた既製のデータセンターは、今のところ見当たりません。ニュージーランドのどこかで探す必要があります。

カスタム記号エディタで次のように設定しました:


 
Forester #:

カスタム記号のエディタでは、次のように設定しました:

スクリーンショットにあるような設定、つまり20:00~08:00の時間帯で、翌日に移行するセッションをプログラムしました。
以下の関数を変更しました:
      for (int i = 0; i < this.TradeSessions[DayOfWeek]; i++){//その曜日のセッションを一通り確認する
         if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] )){ //セッションが開始された - 終了点を検索
            if(Sec < this.TradeTimeTo[i][DayOfWeek]){//まだ終わっていない、覚えておく
               this.NextTradeStop = (datetime)(day * 86400) + this.TradeTimeTo[i][DayOfWeek]; //現在のセッションの終了時刻。これまでは、次のセッションを検証する必要はない = (当日の開始時刻 + セッションの時間) 
               //Print("new Stop ",this.NextTradeStop);
               return true; 
            }else if (this.TradeTimeTo[i][DayOfWeek] < this.TradeTimeFrom[i][DayOfWeek]){// 終了 < 開始(例:20:00~04:00 - 翌日に切り替わり、時刻に1日を加算)
               this.NextTradeStop = (datetime)((day+1) * 86400) + this.TradeTimeTo[i][DayOfWeek]; //現在のセッションの終了時刻。これまでは、次のセッションを検証する必要はない = (当日の開始時刻 + セッションの時間) 
               //Print("new Stop ",this.NextTradeStop);
               return true;
            }
         }
      }

追加したコードは、終了時刻がセッションの開始時刻より前であるかどうかを確認し、その後、終了時刻に 1日を加算する だけです。

以下のセッションで 検証しました:

日: 1 取引セッション: 1: 23:55-00:05
日: 2 取引セッション: 1: 00:15-00:17


翌日にまたがる最初のセッション:

2020.06.29 23:55:03 2020.06.29 23:55:03
2020.06.29 23:55:09 2020.06.29 23:55:09
2020.06.29 23:56:39 2020.06.29 23:56:39
2020.06.29 23:57:01 2020.06.29 23:57:01
2020.06.29 23:59:59 2020.06.29 23:59:59
2020.06.30 00:00:00 2020.06.30 00:00:00
2020.06.30 00:00:08 2020.06.30 00:00:08
2020.06.30 00:01:52 2020.06.30 00:01:52
2020.06.30 00:02:02 2020.06.30 00:02:02
2020.06.30 00:02:30 2020.06.30 00:02:30
2020.06.30 00:03:25 2020.06.30 00:03:25
2020.06.30 00:03:31 2020.06.30 00:03:31

第2セッション(通常は1日で行われる):
2020.06.30 00:15:29 2020.06.30 00:15:29
2020.06.30 00:16:01 2020.06.30 00:16:01
2020.06.30 00:16:09 2020.06.30 00:16:09

1週間後の第1回セッション:
2020.07.06 23:55:01 2020.07.06 23:55:01
2020.07.06 23:55:09 2020.07.06 23:55:09