Skip to content

Commit

Permalink
Merge d29040c into 6d1887f
Browse files Browse the repository at this point in the history
  • Loading branch information
rambo committed Oct 24, 2017
2 parents 6d1887f + d29040c commit b117ceb
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 44 deletions.
2 changes: 1 addition & 1 deletion rqalpha/__main__.py
Expand Up @@ -90,7 +90,7 @@ def update_bundle(data_bundle_path, locale):
@click.option('-bm', '--benchmark', 'base__benchmark', type=click.STRING, default=None)
@click.option('-mm', '--margin-multiplier', 'base__margin_multiplier', type=click.FLOAT)
@click.option('-a', '--account', 'base__accounts', nargs=2, multiple=True, help="set account type with starting cash")
@click.option('--position', 'base__init_positions', nargs=2, multiple=True, help="set init position")
@click.option('--position', 'base__init_positions', help="set init position")
@click.option('-fq', '--frequency', 'base__frequency', type=click.Choice(['1d', '1m', 'tick']))
@click.option('-rt', '--run-type', 'base__run_type', type=click.Choice(['b', 'p', 'r']), default="b")
@click.option('--resume', 'base__resume_mode', is_flag=True)
Expand Down
50 changes: 29 additions & 21 deletions rqalpha/mod/rqalpha_mod_sys_simulation/utils.py
Expand Up @@ -32,6 +32,15 @@ def _fake_trade(order_book_id, quantity, price):
POSITION_EFFECT.OPEN, order_book_id)


def _filter_positions(env, account_type):
positions = env.config.base.init_positions
futures = [ins.order_book_id for ins in env.data_proxy.all_instruments('Future')]
if account_type == 'FUTURE':
return list(filter(lambda p: p[0] in futures, positions))
else:
return list(filter(lambda p: p[0] not in futures, positions))


def init_portfolio(env):
accounts = {}
config = env.config
Expand All @@ -50,27 +59,26 @@ def init_portfolio(env):
position_model = env.get_position_model(account_type)
positions = Positions(position_model)

if account_type in config.base.init_positions:
for order_book_id, quantity in config.base.init_positions[account_type]:
instrument = env.get_instrument(order_book_id)
if instrument is None:
raise RuntimeError(_(u'invalid order book id {} in initial positions').format(order_book_id))
if not instrument.listing:
raise RuntimeError(_(u'instrument {} in initial positions is not listing').format(order_book_id))

bars = env.data_proxy.history_bars(order_book_id, 1, '1d', 'close',
env.data_proxy.get_previous_trading_date(start_date),
adjust_type='none')
if bars is None:
raise RuntimeError(_(u'the close price of {} in initial positions is not available').format(order_book_id))

price = bars[0]
trade = _fake_trade(order_book_id, quantity, price)
if order_book_id not in positions:
positions[order_book_id] = position_model(order_book_id)
positions[order_book_id].apply_trade(trade)
# FIXME
positions[order_book_id]._last_price = price
for order_book_id, quantity in _filter_positions(env, account_type):
instrument = env.get_instrument(order_book_id)
if instrument is None:
raise RuntimeError(_(u'invalid order book id {} in initial positions').format(order_book_id))
if not instrument.listing:
raise RuntimeError(_(u'instrument {} in initial positions is not listing').format(order_book_id))

bars = env.data_proxy.history_bars(order_book_id, 1, '1d', 'close',
env.data_proxy.get_previous_trading_date(start_date),
adjust_type='none')
if bars is None:
raise RuntimeError(_(u'the close price of {} in initial positions is not available').format(order_book_id))

price = bars[0]
trade = _fake_trade(order_book_id, quantity, price)
if order_book_id not in positions:
positions[order_book_id] = position_model(order_book_id)
positions[order_book_id].apply_trade(trade)
# FIXME
positions[order_book_id]._last_price = price

account = account_model(starting_cash, positions)
units += account.total_value
Expand Down
38 changes: 16 additions & 22 deletions rqalpha/utils/config.py
Expand Up @@ -215,29 +215,23 @@ def parse_accounts(accounts):
return a


def parse_init_positions(init_positions):
# --position stock 000001.XSHE:1000,000003.XSHE:200
# --position future IF1701:-1,IF1701:2
def to_position_list(positions):
result = []
for s in positions.split(','):
try:
order_book_id, quantity = s.split(':')
except ValueError:
raise RuntimeError(_(u"invalid init position {}, should be in format 'order_book_id:quantity'").format(s))

try:
result.append((order_book_id, float(quantity)))
except ValueError:
raise RuntimeError(_(u"invalid quantity for instrument {order_book_id}: {quantity}").format(
order_book_id=order_book_id, quantity=quantity))

def parse_init_positions(positions):
# --position 000001.XSHE:1000,IF1701:-1
result = []
if not isinstance(positions, str):
return result

return {
account_type.upper(): to_position_list(positions)
for account_type, positions in init_positions
}
for s in positions.split(','):
try:
order_book_id, quantity = s.split(':')
except ValueError:
raise RuntimeError(_(u"invalid init position {}, should be in format 'order_book_id:quantity'").format(s))

try:
result.append((order_book_id, float(quantity)))
except ValueError:
raise RuntimeError(_(u"invalid quantity for instrument {order_book_id}: {quantity}").format(
order_book_id=order_book_id, quantity=quantity))
return result


def parse_run_type(rt_str):
Expand Down

0 comments on commit b117ceb

Please sign in to comment.