Scheduling regular actions on Blueshift娦
Scheduling functions¶
On Blueshift®, we can schedule a particular function to be called at a
particular time interval. This is useful if our strategy (or some part
of it) is executed at pre-determined time interval. A typical example
will be weekly or monthly portfolio rebalance or a daily end-of-day
square-off for an intraday strategy. For such cases, we can
use the schedule_function
API function, instead of checking for the
time condition in handle_data
ourselves.
Scheduling function
Call to schedule_function
must be done at the initialize
function. Also, make sure they are scheduled before at least 2
minutes from the close of the markets, else they might get
triggered next day (to avoid potential forward-looking bias). We
recommend scheduling time at least 5 minutes before day close.
Examples below:
from blueshift.api import schedule_function, date_rules, time_rules
def initialize(context):
schedule_function(my_func, date_rules.month_start(),
time_rules.market_open(hours=1, minutes=5)))
def my_func(context, data):
pass
Here we schedule a function called my_func
in the initialize
function. The periodicity is specified by specifying the date periodicity
and the time periodicity, date_rules
and time_rules
respectively.
Here we use the month_start
method of date_rule
. The offset
can
be specified too. For example to run a function 5th of every month, we
can specify date_rules.month_start
with a offset of 5
. Similarly,
the time rules (via time_rules
) specifies the the function to be
called after 1 hour and 5 minutes after the market_open
. Note hours
and minutes denote after
for market_open
and before
for
market_close
. Other possiblities are:
Date rules¶
date_rules.every_day()
: call every daydate_rules.month_start(offset)
: Calloffset
days after start of the month.date_rules.month_end(offset)
: Calloffset
days before end of the month.date_rules.week_start(offset)
: Calloffset
days after start of the week.date_rules.week_end(offset)
: Calloffset
days before end of the week.
Time rules¶
time_rules.every_minute()
: call every minute on the scheduled datetime_rules.market_open(hours, minutes)
: callhours
andminutes
after the market opens on scheduled datetime_rules.market_close(hours, minutes)
: callhours
andminutes
before the market cloes on scheduled date
On the live platform you also can use time_rules.every_nth_minute(n)
for a call every n-th minute and time_rules.every_nth_hour(n)
for
calls every n-th hour.
For more details on the scheduling APIs, see the API doc.
Scheduling in live runs¶
Call time on live trading
In live trading you should not make any assumption on the
call timing of any functions - either scheduled
or the
main entry-point functions. However, the call orders will be
maintained.
The concept of time is different between backtest and a live run. In a
backtest, we control the time, as we feed the time-stamps to the
simulation engine. On a live run, we have no control. A function
scheduled to be called at exactly 18:00 hours can be called later, if
other routines part of the algorithm were busy executing as it waits
in the line. This is particularly important if you are using the
schedule_function
API function to carry out end-of-day squaring off
of positions in an intraday strategy. Make sure the timing of the
scheduling is comfortably before the market close, so that it has a
chance to run while the market is still trading.