2013-03-17 4 views
0

Я использую rrule python для того, чтобы выработать торговые часы. Это легко в течение нескольких дней, я использую слегка измененный пример, который я нашел на этом самом сайте:RRule установлен для дней и часов в день

def get_rset(start_date):  
    # Create a rule to recur every weekday starting today 
    r = rrule.rrule(rrule.DAILY, 
        byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR], 
        dtstart=start_date) 
    # Create a rruleset 
    rs = rrule.rruleset() 
    # Attach our rrule to it 
    rs.rrule(r) 
    # Add holidays as exclusion days 
    for exdate in holidays: 
     rs.exdate(exdate) 
    return rs 

Проблема в том, в то время как это прекрасно работает для акций, мне нужно рассчитать даты форекса по-разному. Мне нужно работать на почасовой основе, добавлять в праздничные дни и т. Д.

В UTC Я считаю, что рынки открыты с 10:00 до 22:00 в следующую пятницу.

Чтобы сделать это в руле, мне теперь нужно 6 разных дней с воскресеньем и пятницей, требующими особых часов, а остальные будни считаются всеми часами. Я почти уверен, что мне нужно смешивать rrule byday и byhour, но я не могу привести никаких хороших примеров.

Любая помощь очень приветствуется!

ответ

1

Я выяснил более простой способ, следующий через Google, документы с кодом и классом. Он использует небольшой (но соответствующий) чит. См. Пример ниже.

from dateutil import rrule 
from datetime import timedelta , datetime 
holidays = [] # This is just a list of dates to exclude 

def datetime_in_x_trading_hours(start_dt,future_hours): 
    # First we add two hours. This is because its simpler to view the timeset 
    # as 24hrs MON - FRI. (This also helps align the dates for the holidays) 
    print start_dt 
    start_dt += timedelta(hours=2) 
    rs = get_fx_rset(start_dt) 
    # Now using the set get the desired time and put the the missing hours 
    future_time = rs[future_hours] 
    future_time -= timedelta(hours=2) 
    return future_time 

def get_fx_rset(start_date_time): 

    # Create a rule to recur every weekday starting today 
    r = rrule.rrule(rrule.HOURLY, 
        byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR], 
        byhour=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23], 
        byminute=[0], 
        bysecond=[0], 
        dtstart=start_date_time) 

    # Create a rruleset 
    rs = rrule.rruleset() 
    # Attach our rrule to it 
    rs.rrule(r) 
    # Add holidays as exclusion days 
    for exdate in holidays: 
     rs.exdate(exdate) 

    return rs 

today = datetime.now() - timedelta(days=2) 
print datetime_in_x_trading_hours(today, 7)