Judge_SummerAndMarketOpen_ver2

概要

夏時間,冬時間を判別する&その日の取引可否を判別する.

引数

%Y-%m-%dT%H:%M:%S形式の日時(datetime型)

戻り値

  1. 夏時間チェックフラグ(1なら夏時間,0なら冬時間)
  2. 取引可否チェックフラグ(1なら可,0なら不可=close)

コード

#201204 夏時間,冬時間を判別する&その日の取引可否を判別する関数
# 2020年12月26日(土)の6時台を取引不可能とする(「取引可能」となったバグを取り除く)
def Judge_SummerAndMarketOpen_ver2(time_s):
    #入力は%Y-%m-%dT%H:%M:%S形式の日時(datetime型)
    DateYear = int(time_s.year)
    DateMonth = int(time_s.month)
    DateDay = int(time_s.day)
    DateHour = int(time_s.hour)
    DateMinute = int(time_s.minute)

    Nwd=int(time_s.weekday())

    if (DateMonth>=1 and DateMonth<=2) or DateMonth==12:
        SummerCheck=0
    elif DateMonth>=4 and DateMonth<=10:
        SummerCheck=1
    elif DateMonth==3:
        if DateDay - Nwd > 13:#3月の夏時間への切り替えは14日以降っぽい…
            SummerCheck = 1
        else:
            SummerCheck = 0
    elif DateMonth==11:
        if DateDay - Nwd > 0:
            SummerCheck = 0
        else:
            SummerCheck = 1

    #市場がオープンかを判断する
    MarketCheck = 0
    if Nwd ==0:  # 月なら,朝からオープン
        if SummerCheck == 1:
            if (DateHour == 6 and DateMinute >= 10) or DateHour >= 7:
                MarketCheck = 1
        else:
            if (DateHour == 7 and DateMinute >= 10) or DateHour >= 8:
                MarketCheck = 1
    if Nwd>=1 and Nwd<=4:#火~金なら,メンテ時間以外はオープン
        if SummerCheck==1:
            if DateHour<=4 or (DateHour==5 and DateMinute <55) or (DateHour==6 and DateMinute >=10) or DateHour>=7:
                MarketCheck=1
        else:
            if DateHour<=5 or (DateHour==6 and DateMinute <55) or (DateHour==7 and DateMinute >=10) or DateHour>=8:
                MarketCheck=1
    elif Nwd==5:#土曜なら朝まではオープン
        if SummerCheck==1:
            if DateHour<=4 or (DateHour==5 and DateMinute <55):
                MarketCheck=1
        else:
            if DateHour<=5 or (DateHour==6 and DateMinute <55):
                MarketCheck=1

    #以下,例外的にクローズになる条件
    #1/1の朝7時以降で,かつ平日なら,クローズ,
    if DateMonth==1 and DateDay==1 and Nwd<=4:
        if (DateHour==6 and DateMinute>55) or DateHour>=7:
            MarketCheck=0
    # 1/2かつ月曜(1/1が日曜)なら,クローズ,
    elif DateMonth==1 and DateDay==2 and Nwd==0:
        MarketCheck = 0
    # 1/3かつ火曜(1/1が日曜)かつ7時10分以下なら,クローズ(1/2が終日クローズなので,再開は1/3の7時10分以降)
    elif DateMonth == 1 and DateDay == 3 and Nwd == 1:
        if DateHour<=6 or (DateHour==7 and DateMinute<10):
            MarketCheck = 0
    #12/25かつ平日かつ6時55分以降ならクローズ
    elif DateMonth == 12 and DateDay == 25 and Nwd <= 4:
        if (DateHour == 6 and DateMinute >= 55) or DateHour>=7:
            MarketCheck = 0
    #12/26かつ月曜(12/25が日曜)ならクローズ
    elif DateMonth==12 and DateDay==26 and Nwd==0:
        MarketCheck = 0
    # 12/26かつ土曜かつ6時台ならクローズ(12/25(金)の7時~12/28(月)~6時台はクローズ)
    elif DateMonth == 12 and DateDay == 26 and Nwd == 5:
        if DateHour <= 6:
            MarketCheck = 0
    # 12/27かつ火曜(12/25が日曜)かつ7時10分以下なら,クローズ(12/26が終日クローズなので,再開は12/27の7時10分以降)
    elif DateMonth == 12 and DateDay == 27 and Nwd == 1:
        if DateHour <= 6 or (DateHour == 7 and DateMinute < 10):
            MarketCheck = 0

    return(SummerCheck,MarketCheck)

夏時間,冬時間の切り替えとなる3月,11月については,pythonに於いて,月~日曜の曜日を0~6で表すことを用いて判断している.具体的には,11月1日(DateDay=1)が月曜(Nwd=0)なら,冬時間(DateDay-Nwd>0).逆を言えば,DateDay-Nwd<=0となる条件では,11月でも,10月最終週始まりの週なので,まだ夏時間と判断する.

取引可能な日時かどうかは,基本的には,OandaFXの営業スケジュールを反映させている.基本的に,平日は取引可で記載し,証券会社のスケジュールを見て,例外的に「平日だけど市場close」となっている条件を追加している.

コメント

タイトルとURLをコピーしました