라이브러리: Control_Trade_Sessions - 페이지 2

Forester #:
단순히 시간 기준으로 비교가 이루어집니다.
대신 원하는 값을 자유롭게 설정할 수 있습니다.

세션 시간은 브로커에서 가져오거나 수동으로 설정할 수 있습니다.

제가 말한 건 내부 코드에 관한 것이지, 호출이나 입력 매개변수에 관한 것이 아닙니다.

datetime Sec = TimeSec(time); //현재 날짜의 초
...
if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] ) && ( Sec < this.TradeTimeTo[i][DayOfWeek] ))

여기서 Sec는 24시간 범위로 지정되어 있지만, from-to 경계는 없습니다. 예를 들어, 오전 3시를 요청했는데 세션이 밤 9시부터 오전 8시까지 거래된다면 true가 반환되어야 하지만, 조건이 충족되지 않아 false가 반환됩니다.

Stanislav Korotky #:

저는 호출이나 입력 매개변수가 아니라 내부 코드에 대해 말한 것입니다.

여기서 Sec는 24시간 단위로 표시되어 있지만, from-to 범위가 없습니다. 예를 들어, 오전 3시를 요청했는데 세션 거래 시간이 저녁 9시부터 오전 8시까지라면 true가 반환되어야 하지만, 조건이 충족되지 않아 false가 반환됩니다.

이는 두 개의 세션(
, 21-24 및 0-8)으로 설정할 수 있습니다.

이것은 이론적인 질문인가요, 아니면 거래 센터에 실제로 이와 유사한 from-to 범위가 존재하나요?

Forester #:

이는 두 세션으로 설정할 수 있습니다:
21-24 및 0-8

이건 이론적인 질문인가요, 아니면 데이터 센터에 실제로 이런 from-to 범위가 존재하나요?

두 개의 세션으로 설정한다는 게 무슨 뜻인가요? - 세션 정보는 MT5 설정에서 반환되는 것이지, 우리가 직접 설정하는 게 아니잖아요. 게다가 MT5에서는 하나의 세션이 하나의 기록에 해당합니다. 일부 브로커(시장과의 지리적 거리 때문에)에서는 이런 경우가 있을 수 있습니다. 이 경우 SymbolInfoSessionTrade는 추가 일수를 고려한 to 시간을 반환합니다(적어도 예전에는 그랬습니다 - 지금 당장은 확인해 보지 않았습니다). 즉, from < to 조건은 항상 유지되었습니다.
Stanislav Korotky #:
두 개의 세션을 설정한다는 것이 무슨 뜻인가요?

sunput에서 매일 세션을 직접 설정할 수 있습니다. 이 설정에 따라 작동합니다.
연결하기
#define LoadSessionFromInputs // 입력에서 세션 읽기

Stanislav Korotky #:
이 경우 SymbolInfoSessionTrade는 추가 일수를 고려한 to 시간을 반환합니다(적어도 예전에는 그랬습니다. 지금 당장은 확인하지 않았습니다). 즉,from < to 조건은항상 유지되었습니다.

즉, 20:00 - 32:00인가요?

브로커 측에서 테스트해 볼 수 있는 실제 예시가 있다면, 해당 예시에 맞춰 수정하고 확인할 수 있을 것입니다.
현재는 간단한 해결책이 있습니다. 자정을 기준으로 세션을 두 개로 직접 나누는 것입니다. 또한 어느 요일에 해당하는지 지정할 수 있습니다. 예를 들어 토요일 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

두 번째 세션, 평소와 같이 하루에 진행:
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

일주일 뒤 첫 세션:
2020.07.06 23:55:01 2020.07.06 23:55:01
2020.07.06 23:55:09 2020.07.06 23:55:09