Generated by Cython 0.29.36

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: _protocol.c

+001: #
  __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 002: # Copyright 2016 Quantopian, Inc.
 003: #
 004: # Licensed under the Apache License, Version 2.0 (the "License");
 005: # you may not use this file except in compliance with the License.
 006: # You may obtain a copy of the License at
 007: #
 008: #     http://www.apache.org/licenses/LICENSE-2.0
 009: #
 010: # Unless required by applicable law or agreed to in writing, software
 011: # distributed under the License is distributed on an "AS IS" BASIS,
 012: # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 013: # See the License for the specific language governing permissions and
 014: # limitations under the License.
+015: import warnings
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_warnings, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_warnings, __pyx_t_1) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+016: from contextlib import contextmanager
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_contextmanager);
  __Pyx_GIVEREF(__pyx_n_s_contextmanager);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_contextmanager);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_contextlib, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_contextmanager); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_contextmanager, __pyx_t_1) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+017: from functools import wraps
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_wraps);
  __Pyx_GIVEREF(__pyx_n_s_wraps);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_wraps);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_functools, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_wraps); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_wraps, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+018: import pandas as pd
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_pandas, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pd, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+019: import numpy as np
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 020: 
 021: from cpython cimport bool
+022: from collections.abc import Iterable
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Iterable);
  __Pyx_GIVEREF(__pyx_n_s_Iterable);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Iterable);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_collections_abc, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Iterable); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Iterable, __pyx_t_1) < 0) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 023: 
+024: from zipline.assets import (
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_zipline_assets, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_PricingDataAssociable); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_PricingDataAssociable, __pyx_t_2) < 0) __PYX_ERR(0, 25, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+025:     PricingDataAssociable,
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_PricingDataAssociable);
  __Pyx_GIVEREF(__pyx_n_s_PricingDataAssociable);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PricingDataAssociable);
 026: )
 027: from zipline.assets._assets cimport Asset
+028: from zipline.assets.continuous_futures import ContinuousFuture
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 28, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_ContinuousFuture);
  __Pyx_GIVEREF(__pyx_n_s_ContinuousFuture);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_ContinuousFuture);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_zipline_assets_continuous_future, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 28, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ContinuousFuture); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 28, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ContinuousFuture, __pyx_t_1) < 0) __PYX_ERR(0, 28, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+029: from zipline.utils.pandas_utils import normalize_date
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_normalize_date);
  __Pyx_GIVEREF(__pyx_n_s_normalize_date);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_normalize_date);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_zipline_utils_pandas_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_normalize_date); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_normalize_date, __pyx_t_2) < 0) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+030: from zipline.zipline_warnings import ZiplineDeprecationWarning
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_ZiplineDeprecationWarning);
  __Pyx_GIVEREF(__pyx_n_s_ZiplineDeprecationWarning);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_ZiplineDeprecationWarning);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_zipline_zipline_warnings, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ZiplineDeprecationWarning); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ZiplineDeprecationWarning, __pyx_t_1) < 0) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 031: 
+032: cdef bool _is_iterable(obj):
static PyBoolObject *__pyx_f_7zipline_9_protocol__is_iterable(PyObject *__pyx_v_obj) {
  PyBoolObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_is_iterable", 0);
  __Pyx_TraceCall("_is_iterable", __pyx_f[0], 32, 0, __PYX_ERR(0, 32, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("zipline._protocol._is_iterable", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+033:     return isinstance(obj, Iterable) and not isinstance(obj, str)
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_Iterable); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyObject_IsInstance(__pyx_v_obj, __pyx_t_2); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {
  } else {
    __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 33, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (!(likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_7cpython_4bool_bool)))) __PYX_ERR(0, 33, __pyx_L1_error)
    __pyx_t_1 = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_3 = PyUnicode_Check(__pyx_v_obj); 
  __pyx_t_4 = (!(__pyx_t_3 != 0));
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_7cpython_4bool_bool)))) __PYX_ERR(0, 33, __pyx_L1_error)
  __pyx_t_1 = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_L3_bool_binop_done:;
  __pyx_r = ((PyBoolObject *)__pyx_t_1);
  __pyx_t_1 = 0;
  goto __pyx_L0;
 034: 
+035: cdef class check_parameters(object):
struct __pyx_obj_7zipline_9_protocol_check_parameters {
  PyObject_HEAD
  PyObject *keyword_names;
  PyObject *types;
  PyObject *keys_to_types;
};

 036:     """
 037:     Asserts that the keywords passed into the wrapped function are included
 038:     in those passed into this decorator. If not, raise a TypeError with a
 039:     meaningful message, unlike the one Cython returns by default.
 040: 
 041:     Also asserts that the arguments passed into the wrapped function are
 042:     consistent with the types passed into this decorator. If not, raise a
 043:     TypeError with a meaningful message.
 044:     """
 045:     cdef tuple keyword_names
 046:     cdef tuple types
 047:     cdef dict keys_to_types
 048: 
+049:     def __init__(self, keyword_names, types):
/* Python wrapper */
static int __pyx_pw_7zipline_9_protocol_16check_parameters_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7zipline_9_protocol_16check_parameters_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_keyword_names = 0;
  PyObject *__pyx_v_types = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_keyword_names,&__pyx_n_s_types,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_keyword_names)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_types)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 49, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 49, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_keyword_names = values[0];
    __pyx_v_types = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 49, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("zipline._protocol.check_parameters.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7zipline_9_protocol_16check_parameters___init__(((struct __pyx_obj_7zipline_9_protocol_check_parameters *)__pyx_v_self), __pyx_v_keyword_names, __pyx_v_types);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7zipline_9_protocol_16check_parameters___init__(struct __pyx_obj_7zipline_9_protocol_check_parameters *__pyx_v_self, PyObject *__pyx_v_keyword_names, PyObject *__pyx_v_types) {
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
  __Pyx_TraceCall("__init__", __pyx_f[0], 49, 0, __PYX_ERR(0, 49, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("zipline._protocol.check_parameters.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+050:         self.keyword_names = keyword_names
  if (!(likely(PyTuple_CheckExact(__pyx_v_keyword_names))||((__pyx_v_keyword_names) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v_keyword_names)->tp_name), 0))) __PYX_ERR(0, 50, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_keyword_names;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->keyword_names);
  __Pyx_DECREF(__pyx_v_self->keyword_names);
  __pyx_v_self->keyword_names = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+051:         self.types = types
  if (!(likely(PyTuple_CheckExact(__pyx_v_types))||((__pyx_v_types) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v_types)->tp_name), 0))) __PYX_ERR(0, 51, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_types;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->types);
  __Pyx_DECREF(__pyx_v_self->types);
  __pyx_v_self->types = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 052: 
+053:         self.keys_to_types = dict(zip(keyword_names, types))
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_keyword_names);
  __Pyx_GIVEREF(__pyx_v_keyword_names);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_keyword_names);
  __Pyx_INCREF(__pyx_v_types);
  __Pyx_GIVEREF(__pyx_v_types);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_types);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyDict_Type)), __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->keys_to_types);
  __Pyx_DECREF(__pyx_v_self->keys_to_types);
  __pyx_v_self->keys_to_types = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 054: 
+055:     def __call__(self, func):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_16check_parameters_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_16check_parameters_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_func = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_func,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_func)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__call__") < 0)) __PYX_ERR(0, 55, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_func = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__call__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 55, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("zipline._protocol.check_parameters.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7zipline_9_protocol_16check_parameters_2__call__(((struct __pyx_obj_7zipline_9_protocol_check_parameters *)__pyx_v_self), __pyx_v_func);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_7zipline_9_protocol_16check_parameters_2__call__(struct __pyx_obj_7zipline_9_protocol_check_parameters *__pyx_v_self, PyObject *__pyx_v_func) {
  struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ *__pyx_cur_scope;
  PyObject *__pyx_v_assert_keywords_and_call = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__", 0);
  __pyx_cur_scope = (struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ *)__pyx_tp_new_7zipline_9_protocol___pyx_scope_struct____call__(__pyx_ptype_7zipline_9_protocol___pyx_scope_struct____call__, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 55, __pyx_L1_error)
  } else {
    __Pyx_GOTREF(__pyx_cur_scope);
  }
  __Pyx_TraceCall("__call__", __pyx_f[0], 55, 0, __PYX_ERR(0, 55, __pyx_L1_error));
  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __pyx_cur_scope->__pyx_v_func = __pyx_v_func;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_func);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_func);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("zipline._protocol.check_parameters.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_assert_keywords_and_call);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ {
  PyObject_HEAD
  PyObject *__pyx_v_func;
  struct __pyx_obj_7zipline_9_protocol_check_parameters *__pyx_v_self;
};

+056:         @wraps(func)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_wraps); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_cur_scope->__pyx_v_func) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_cur_scope->__pyx_v_func);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+057:         def assert_keywords_and_call(*args, **kwargs):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_16check_parameters_8__call___1assert_keywords_and_call(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_7zipline_9_protocol_16check_parameters_8__call___1assert_keywords_and_call = {"assert_keywords_and_call", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7zipline_9_protocol_16check_parameters_8__call___1assert_keywords_and_call, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_7zipline_9_protocol_16check_parameters_8__call___1assert_keywords_and_call(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("assert_keywords_and_call (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "assert_keywords_and_call", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_7zipline_9_protocol_16check_parameters_8__call___assert_keywords_and_call(__pyx_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_16check_parameters_8__call___assert_keywords_and_call(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ *__pyx_cur_scope;
  struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ *__pyx_outer_scope;
  short __pyx_v_i;
  PyObject *__pyx_v_field = NULL;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_expected_type = NULL;
  PyObject *__pyx_v_expected_type_name = NULL;
  PyObject *__pyx_v_keyword = NULL;
  PyObject *__pyx_7genexpr__pyx_v_type_ = NULL;
  PyObject *__pyx_8genexpr1__pyx_v_type_ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("assert_keywords_and_call", 0);
  __pyx_outer_scope = (struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct____call__ *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
  __Pyx_TraceCall("assert_keywords_and_call", __pyx_f[0], 57, 0, __PYX_ERR(0, 57, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_AddTraceback("zipline._protocol.check_parameters.__call__.assert_keywords_and_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_field);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_expected_type);
  __Pyx_XDECREF(__pyx_v_expected_type_name);
  __Pyx_XDECREF(__pyx_v_keyword);
  __Pyx_XDECREF(__pyx_7genexpr__pyx_v_type_);
  __Pyx_XDECREF(__pyx_8genexpr1__pyx_v_type_);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__4 = PyTuple_Pack(10, __pyx_n_s_args, __pyx_n_s_kwargs, __pyx_n_s_i, __pyx_n_s_field, __pyx_n_s_arg, __pyx_n_s_expected_type, __pyx_n_s_expected_type_name, __pyx_n_s_keyword, __pyx_n_s_type, __pyx_n_s_type); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 57, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
/* … */
  __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7zipline_9_protocol_16check_parameters_8__call___1assert_keywords_and_call, 0, __pyx_n_s_call___locals_assert_keywords, ((PyObject*)__pyx_cur_scope), __pyx_n_s_zipline__protocol, __pyx_d, ((PyObject *)__pyx_codeobj__5)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 57, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_assert_keywords_and_call = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(0, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_zipline__protocol_pyx, __pyx_n_s_assert_keywords_and_call, 57, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(0, 57, __pyx_L1_error)
 058:             cdef short i
 059: 
 060:             # verify all the keyword arguments
+061:             for field in kwargs:
  __pyx_t_2 = 0;
  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_kwargs, 1, ((PyObject *)NULL), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_5;
  __pyx_t_5 = 0;
  while (1) {
    __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, NULL, NULL, __pyx_t_4);
    if (unlikely(__pyx_t_6 == 0)) break;
    if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_XDECREF_SET(__pyx_v_field, __pyx_t_5);
    __pyx_t_5 = 0;
+062:                 if field not in self.keyword_names:
    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 62, __pyx_L1_error) }
    __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_v_field, __pyx_cur_scope->__pyx_v_self->keyword_names, Py_NE)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 62, __pyx_L1_error)
    __pyx_t_8 = (__pyx_t_7 != 0);
    if (unlikely(__pyx_t_8)) {
/* … */
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+063:                     raise TypeError("%s() got an unexpected keyword argument"
      __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 63, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_9 = 0;
      __pyx_t_10 = 127;
/* … */
      __pyx_t_12 = __Pyx_PyUnicode_Join(__pyx_t_5, 4, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 63, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_12); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 63, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_Raise(__pyx_t_5, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __PYX_ERR(0, 63, __pyx_L1_error)
+064:                                     " '%s'" % (func.__name__, field))
      if (unlikely(!__pyx_cur_scope->__pyx_v_func)) { __Pyx_RaiseClosureNameError("func"); __PYX_ERR(0, 64, __pyx_L1_error) }
      __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_func, __pyx_n_s_name); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_t_11), __pyx_empty_unicode); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_12) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_12) : __pyx_t_10;
      __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_12);
      __Pyx_GIVEREF(__pyx_t_12);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_12);
      __pyx_t_12 = 0;
      __Pyx_INCREF(__pyx_kp_u_got_an_unexpected_keyword_argum);
      __pyx_t_9 += 39;
      __Pyx_GIVEREF(__pyx_kp_u_got_an_unexpected_keyword_argum);
      PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_kp_u_got_an_unexpected_keyword_argum);
      __pyx_t_12 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_v_field), __pyx_empty_unicode); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_12) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_12) : __pyx_t_10;
      __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_12);
      __Pyx_GIVEREF(__pyx_t_12);
      PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_12);
      __pyx_t_12 = 0;
      __Pyx_INCREF(__pyx_kp_u_);
      __pyx_t_9 += 1;
      __Pyx_GIVEREF(__pyx_kp_u_);
      PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_kp_u_);
 065: 
 066:             # verify type of each argument
+067:             for i, arg in enumerate(args[1:]):
  __pyx_t_13 = 0;
  __pyx_t_1 = __Pyx_PyTuple_GetSlice(__pyx_v_args, 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __pyx_t_1; __Pyx_INCREF(__pyx_t_5); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
    __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 67, __pyx_L1_error)
    #else
    __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    #endif
    __Pyx_XDECREF_SET(__pyx_v_arg, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_v_i = __pyx_t_13;
    __pyx_t_13 = (__pyx_t_13 + 1);
/* … */
    __pyx_L6_continue:;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+068:                 expected_type = self.types[i]
    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 68, __pyx_L1_error) }
    if (unlikely(__pyx_cur_scope->__pyx_v_self->types == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 68, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_cur_scope->__pyx_v_self->types, __pyx_v_i, short, 1, __Pyx_PyInt_From_short, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_XDECREF_SET(__pyx_v_expected_type, __pyx_t_1);
    __pyx_t_1 = 0;
 069: 
+070:                 if (i == 0 or i == 1) and _is_iterable(arg):
    switch (__pyx_v_i) {
      case 0:
      case 1:
      __pyx_t_7 = 1;
      break;
      default:
      __pyx_t_7 = 0;
      break;
    }
    if (__pyx_t_7) {
    } else {
      __pyx_t_8 = __pyx_t_7;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_1 = ((PyObject *)__pyx_f_7zipline_9_protocol__is_iterable(__pyx_v_arg)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 70, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_8 = __pyx_t_7;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_8) {
/* … */
    }
+071:                     if len(arg) == 0:
      __pyx_t_2 = PyObject_Length(__pyx_v_arg); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 71, __pyx_L1_error)
      __pyx_t_8 = ((__pyx_t_2 == 0) != 0);
      if (__pyx_t_8) {
/* … */
      }
+072:                         continue
        goto __pyx_L6_continue;
+073:                     arg = arg[0]
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_arg, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_1);
      __pyx_t_1 = 0;
 074: 
+075:                 if not isinstance(arg, expected_type):
    __pyx_t_8 = PyObject_IsInstance(__pyx_v_arg, __pyx_v_expected_type); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 75, __pyx_L1_error)
    __pyx_t_7 = ((!(__pyx_t_8 != 0)) != 0);
    if (unlikely(__pyx_t_7)) {
/* … */
    }
+076:                     expected_type_name = expected_type.__name__ \
        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_expected_type, __pyx_n_s_name); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 76, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_1 = __pyx_t_12;
        __pyx_t_12 = 0;
      } else {
+077:                         if not _is_iterable(expected_type) \
      __pyx_t_12 = ((PyObject *)__pyx_f_7zipline_9_protocol__is_iterable(__pyx_v_expected_type)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 77, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 77, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      if (((!__pyx_t_7) != 0)) {
+078:                         else ', '.join([type_.__name__ for type_ in expected_type])
        { /* enter inner scope */
          __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 78, __pyx_L15_error)
          __Pyx_GOTREF(__pyx_t_12);
          if (likely(PyList_CheckExact(__pyx_v_expected_type)) || PyTuple_CheckExact(__pyx_v_expected_type)) {
            __pyx_t_11 = __pyx_v_expected_type; __Pyx_INCREF(__pyx_t_11); __pyx_t_2 = 0;
            __pyx_t_14 = NULL;
          } else {
            __pyx_t_2 = -1; __pyx_t_11 = PyObject_GetIter(__pyx_v_expected_type); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 78, __pyx_L15_error)
            __Pyx_GOTREF(__pyx_t_11);
            __pyx_t_14 = Py_TYPE(__pyx_t_11)->tp_iternext; if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 78, __pyx_L15_error)
          }
          for (;;) {
            if (likely(!__pyx_t_14)) {
              if (likely(PyList_CheckExact(__pyx_t_11))) {
                if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_11)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_15 = PyList_GET_ITEM(__pyx_t_11, __pyx_t_2); __Pyx_INCREF(__pyx_t_15); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 78, __pyx_L15_error)
                #else
                __pyx_t_15 = PySequence_ITEM(__pyx_t_11, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 78, __pyx_L15_error)
                __Pyx_GOTREF(__pyx_t_15);
                #endif
              } else {
                if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_11)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_11, __pyx_t_2); __Pyx_INCREF(__pyx_t_15); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 78, __pyx_L15_error)
                #else
                __pyx_t_15 = PySequence_ITEM(__pyx_t_11, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 78, __pyx_L15_error)
                __Pyx_GOTREF(__pyx_t_15);
                #endif
              }
            } else {
              __pyx_t_15 = __pyx_t_14(__pyx_t_11);
              if (unlikely(!__pyx_t_15)) {
                PyObject* exc_type = PyErr_Occurred();
                if (exc_type) {
                  if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                  else __PYX_ERR(0, 78, __pyx_L15_error)
                }
                break;
              }
              __Pyx_GOTREF(__pyx_t_15);
            }
            __Pyx_XDECREF_SET(__pyx_7genexpr__pyx_v_type_, __pyx_t_15);
            __pyx_t_15 = 0;
            __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_7genexpr__pyx_v_type_, __pyx_n_s_name); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 78, __pyx_L15_error)
            __Pyx_GOTREF(__pyx_t_15);
            if (unlikely(__Pyx_ListComp_Append(__pyx_t_12, (PyObject*)__pyx_t_15))) __PYX_ERR(0, 78, __pyx_L15_error)
            __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          }
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_XDECREF(__pyx_7genexpr__pyx_v_type_); __pyx_7genexpr__pyx_v_type_ = 0;
          goto __pyx_L18_exit_scope;
          __pyx_L15_error:;
          __Pyx_XDECREF(__pyx_7genexpr__pyx_v_type_); __pyx_7genexpr__pyx_v_type_ = 0;
          goto __pyx_L1_error;
          __pyx_L18_exit_scope:;
        } /* exit inner scope */
        __pyx_t_11 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_12); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 78, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __pyx_t_1 = __pyx_t_11;
        __pyx_t_11 = 0;
      }
      __pyx_v_expected_type_name = __pyx_t_1;
      __pyx_t_1 = 0;
 079: 
+080:                     raise TypeError("Expected %s argument to be of type %s%s" %
      __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = 0;
      __pyx_t_10 = 127;
      __Pyx_INCREF(__pyx_kp_u_Expected);
      __pyx_t_2 += 9;
      __Pyx_GIVEREF(__pyx_kp_u_Expected);
      PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_Expected);
/* … */
      __pyx_t_11 = __Pyx_PyUnicode_Join(__pyx_t_1, 5, __pyx_t_2, __pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 80, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __PYX_ERR(0, 80, __pyx_L1_error)
+081:                                     (self.keyword_names[i],
      if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 81, __pyx_L1_error) }
      if (unlikely(__pyx_cur_scope->__pyx_v_self->keyword_names == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 81, __pyx_L1_error)
      }
      __pyx_t_11 = __Pyx_GetItemInt_Tuple(__pyx_cur_scope->__pyx_v_self->keyword_names, __pyx_v_i, short, 1, __Pyx_PyInt_From_short, 0, 1, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 81, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_t_11), __pyx_empty_unicode); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 81, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_12) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_12) : __pyx_t_10;
      __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_12);
      __Pyx_GIVEREF(__pyx_t_12);
      PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
      __pyx_t_12 = 0;
      __Pyx_INCREF(__pyx_kp_u_argument_to_be_of_type);
      __pyx_t_2 += 24;
      __Pyx_GIVEREF(__pyx_kp_u_argument_to_be_of_type);
      PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_argument_to_be_of_type);
+082:                                      'or iterable of type ' if i in (0, 1) else '',
      switch (__pyx_v_i) {
        case 0:
        case 1:
        __Pyx_INCREF(__pyx_kp_u_or_iterable_of_type);
        __pyx_t_12 = __pyx_kp_u_or_iterable_of_type;
        break;
        default:
        __Pyx_INCREF(__pyx_kp_u__3);
        __pyx_t_12 = __pyx_kp_u__3;
        break;
      }
      __pyx_t_11 = __Pyx_PyUnicode_Unicode(__pyx_t_12); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 82, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) : __pyx_t_10;
      __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_11);
      __Pyx_GIVEREF(__pyx_t_11);
      PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_11);
      __pyx_t_11 = 0;
+083:                                      expected_type_name)
      __pyx_t_11 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_v_expected_type_name), __pyx_empty_unicode); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 83, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) : __pyx_t_10;
      __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_11);
      __Pyx_GIVEREF(__pyx_t_11);
      PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_11);
      __pyx_t_11 = 0;
 084:                                     )
 085: 
 086:             # verify type of each kwarg
+087:             for keyword, arg in kwargs.items():
  __pyx_t_3 = 0;
  __pyx_t_1 = __Pyx_dict_iterator(__pyx_v_kwargs, 1, __pyx_n_s_items, (&__pyx_t_2), (&__pyx_t_4)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 87, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __pyx_t_5 = __pyx_t_1;
  __pyx_t_1 = 0;
  while (1) {
    __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_2, &__pyx_t_3, &__pyx_t_1, &__pyx_t_11, NULL, __pyx_t_4);
    if (unlikely(__pyx_t_6 == 0)) break;
    if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 87, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_XDECREF_SET(__pyx_v_keyword, __pyx_t_1);
    __pyx_t_1 = 0;
    __Pyx_XDECREF_SET(__pyx_v_arg, __pyx_t_11);
    __pyx_t_11 = 0;
+088:                 if keyword in ('assets', 'fields') and _is_iterable(arg):
    __Pyx_INCREF(__pyx_v_keyword);
    __pyx_t_11 = __pyx_v_keyword;
    __pyx_t_16 = (__Pyx_PyUnicode_Equals(__pyx_t_11, __pyx_n_u_assets, Py_EQ)); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 88, __pyx_L1_error)
    if (!__pyx_t_16) {
    } else {
      __pyx_t_8 = __pyx_t_16;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_16 = (__Pyx_PyUnicode_Equals(__pyx_t_11, __pyx_n_u_fields, Py_EQ)); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 88, __pyx_L1_error)
    __pyx_t_8 = __pyx_t_16;
    __pyx_L24_bool_binop_done:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_16 = (__pyx_t_8 != 0);
    if (__pyx_t_16) {
    } else {
      __pyx_t_7 = __pyx_t_16;
      goto __pyx_L22_bool_binop_done;
    }
    __pyx_t_11 = ((PyObject *)__pyx_f_7zipline_9_protocol__is_iterable(__pyx_v_arg)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 88, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 88, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_7 = __pyx_t_16;
    __pyx_L22_bool_binop_done:;
    if (__pyx_t_7) {
/* … */
    }
+089:                     if len(arg) == 0:
      __pyx_t_9 = PyObject_Length(__pyx_v_arg); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 89, __pyx_L1_error)
      __pyx_t_7 = ((__pyx_t_9 == 0) != 0);
      if (__pyx_t_7) {
/* … */
      }
+090:                         continue
        goto __pyx_L19_continue;
+091:                     arg = arg[0]
      __pyx_t_11 = __Pyx_GetItemInt(__pyx_v_arg, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 91, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_11);
      __pyx_t_11 = 0;
+092:                 if not isinstance(arg, self.keys_to_types[keyword]):
    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 92, __pyx_L1_error) }
    if (unlikely(__pyx_cur_scope->__pyx_v_self->keys_to_types == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 92, __pyx_L1_error)
    }
    __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_cur_scope->__pyx_v_self->keys_to_types, __pyx_v_keyword); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 92, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_7 = PyObject_IsInstance(__pyx_v_arg, __pyx_t_11); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(0, 92, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_16 = ((!(__pyx_t_7 != 0)) != 0);
    if (unlikely(__pyx_t_16)) {
/* … */
    }
    __pyx_L19_continue:;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+093:                     expected_type = self.keys_to_types[keyword].__name__ \
        if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 93, __pyx_L1_error) }
        if (unlikely(__pyx_cur_scope->__pyx_v_self->keys_to_types == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
          __PYX_ERR(0, 93, __pyx_L1_error)
        }
        __pyx_t_12 = __Pyx_PyDict_GetItem(__pyx_cur_scope->__pyx_v_self->keys_to_types, __pyx_v_keyword); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 93, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __pyx_t_11 = __pyx_t_1;
        __pyx_t_1 = 0;
      } else {
+094:                         if not _is_iterable(self.keys_to_types[keyword]) \
      if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 94, __pyx_L1_error) }
      if (unlikely(__pyx_cur_scope->__pyx_v_self->keys_to_types == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 94, __pyx_L1_error)
      }
      __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_cur_scope->__pyx_v_self->keys_to_types, __pyx_v_keyword); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 94, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_12 = ((PyObject *)__pyx_f_7zipline_9_protocol__is_iterable(__pyx_t_1)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 94, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 94, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      if (((!__pyx_t_16) != 0)) {
+095:                         else ', '.join([type_.__name__ for type_ in
        { /* enter inner scope */
          __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 95, __pyx_L30_error)
          __Pyx_GOTREF(__pyx_t_1);
/* … */
            __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_8genexpr1__pyx_v_type_, __pyx_n_s_name); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 95, __pyx_L30_error)
            __Pyx_GOTREF(__pyx_t_12);
            if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_12))) __PYX_ERR(0, 95, __pyx_L30_error)
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          }
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_XDECREF(__pyx_8genexpr1__pyx_v_type_); __pyx_8genexpr1__pyx_v_type_ = 0;
          goto __pyx_L33_exit_scope;
          __pyx_L30_error:;
          __Pyx_XDECREF(__pyx_8genexpr1__pyx_v_type_); __pyx_8genexpr1__pyx_v_type_ = 0;
          goto __pyx_L1_error;
          __pyx_L33_exit_scope:;
        } /* exit inner scope */
        __pyx_t_15 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 95, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_11 = __pyx_t_15;
        __pyx_t_15 = 0;
      }
      __Pyx_XDECREF_SET(__pyx_v_expected_type, __pyx_t_11);
      __pyx_t_11 = 0;
+096:                                         self.keys_to_types[keyword]])
          if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 96, __pyx_L30_error) }
          if (unlikely(__pyx_cur_scope->__pyx_v_self->keys_to_types == Py_None)) {
            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
            __PYX_ERR(0, 96, __pyx_L30_error)
          }
          __pyx_t_12 = __Pyx_PyDict_GetItem(__pyx_cur_scope->__pyx_v_self->keys_to_types, __pyx_v_keyword); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 96, __pyx_L30_error)
          __Pyx_GOTREF(__pyx_t_12);
          if (likely(PyList_CheckExact(__pyx_t_12)) || PyTuple_CheckExact(__pyx_t_12)) {
            __pyx_t_15 = __pyx_t_12; __Pyx_INCREF(__pyx_t_15); __pyx_t_9 = 0;
            __pyx_t_14 = NULL;
          } else {
            __pyx_t_9 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 96, __pyx_L30_error)
            __Pyx_GOTREF(__pyx_t_15);
            __pyx_t_14 = Py_TYPE(__pyx_t_15)->tp_iternext; if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 96, __pyx_L30_error)
          }
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          for (;;) {
            if (likely(!__pyx_t_14)) {
              if (likely(PyList_CheckExact(__pyx_t_15))) {
                if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_15)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_12 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_9); __Pyx_INCREF(__pyx_t_12); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 96, __pyx_L30_error)
                #else
                __pyx_t_12 = PySequence_ITEM(__pyx_t_15, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 96, __pyx_L30_error)
                __Pyx_GOTREF(__pyx_t_12);
                #endif
              } else {
                if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_9); __Pyx_INCREF(__pyx_t_12); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 96, __pyx_L30_error)
                #else
                __pyx_t_12 = PySequence_ITEM(__pyx_t_15, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 96, __pyx_L30_error)
                __Pyx_GOTREF(__pyx_t_12);
                #endif
              }
            } else {
              __pyx_t_12 = __pyx_t_14(__pyx_t_15);
              if (unlikely(!__pyx_t_12)) {
                PyObject* exc_type = PyErr_Occurred();
                if (exc_type) {
                  if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                  else __PYX_ERR(0, 96, __pyx_L30_error)
                }
                break;
              }
              __Pyx_GOTREF(__pyx_t_12);
            }
            __Pyx_XDECREF_SET(__pyx_8genexpr1__pyx_v_type_, __pyx_t_12);
            __pyx_t_12 = 0;
 097: 
+098:                     raise TypeError("Expected %s argument to be of type %s%s" %
      __pyx_t_11 = PyTuple_New(5); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 98, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_9 = 0;
      __pyx_t_10 = 127;
      __Pyx_INCREF(__pyx_kp_u_Expected);
      __pyx_t_9 += 9;
      __Pyx_GIVEREF(__pyx_kp_u_Expected);
      PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_kp_u_Expected);
/* … */
      __pyx_t_1 = __Pyx_PyUnicode_Join(__pyx_t_11, 5, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 98, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_Raise(__pyx_t_11, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __PYX_ERR(0, 98, __pyx_L1_error)
+099:                                     (keyword,
      __pyx_t_15 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_v_keyword), __pyx_empty_unicode); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 99, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_15);
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_15) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_15) : __pyx_t_10;
      __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_15);
      __Pyx_GIVEREF(__pyx_t_15);
      PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_15);
      __pyx_t_15 = 0;
      __Pyx_INCREF(__pyx_kp_u_argument_to_be_of_type);
      __pyx_t_9 += 24;
      __Pyx_GIVEREF(__pyx_kp_u_argument_to_be_of_type);
      PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_kp_u_argument_to_be_of_type);
+100:                                      'or iterable of type ' if keyword in
      __Pyx_INCREF(__pyx_v_keyword);
      __pyx_t_1 = __pyx_v_keyword;
      __pyx_t_7 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_assets, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 100, __pyx_L1_error)
      if (!__pyx_t_7) {
      } else {
        __pyx_t_16 = __pyx_t_7;
        goto __pyx_L34_bool_binop_done;
      }
      __pyx_t_7 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_fields, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 100, __pyx_L1_error)
      __pyx_t_16 = __pyx_t_7;
      __pyx_L34_bool_binop_done:;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if ((__pyx_t_16 != 0)) {
        __Pyx_INCREF(__pyx_kp_u_or_iterable_of_type);
        __pyx_t_15 = __pyx_kp_u_or_iterable_of_type;
      } else {
        __Pyx_INCREF(__pyx_kp_u__3);
        __pyx_t_15 = __pyx_kp_u__3;
      }
      __pyx_t_1 = __Pyx_PyUnicode_Unicode(__pyx_t_15); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 100, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) : __pyx_t_10;
      __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_11, 3, __pyx_t_1);
      __pyx_t_1 = 0;
 101:                                                                ('assets', 'fields') else '',
+102:                                      expected_type)
      __pyx_t_1 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_v_expected_type), __pyx_empty_unicode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 102, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_10 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) > __pyx_t_10) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) : __pyx_t_10;
      __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_11, 4, __pyx_t_1);
      __pyx_t_1 = 0;
 103:                                     )
 104: 
+105:             return func(*args, **kwargs)
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_cur_scope->__pyx_v_func)) { __Pyx_RaiseClosureNameError("func"); __PYX_ERR(0, 105, __pyx_L1_error) }
  __pyx_t_5 = PyDict_Copy(__pyx_v_kwargs); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 105, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_11 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_v_func, __pyx_v_args, __pyx_t_5); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 105, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_r = __pyx_t_11;
  __pyx_t_11 = 0;
  goto __pyx_L0;
 106: 
+107:         return assert_keywords_and_call
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_assert_keywords_and_call);
  __pyx_r = __pyx_v_assert_keywords_and_call;
  goto __pyx_L0;
 108: 
+109: @contextmanager
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_contextmanager); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
/* … */
  __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 109, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_non_market_minutes, __pyx_t_3) < 0) __PYX_ERR(0, 110, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+110: def handle_non_market_minutes(bar_data):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_1handle_non_market_minutes(PyObject *__pyx_self, PyObject *__pyx_v_bar_data); /*proto*/
static PyMethodDef __pyx_mdef_7zipline_9_protocol_1handle_non_market_minutes = {"handle_non_market_minutes", (PyCFunction)__pyx_pw_7zipline_9_protocol_1handle_non_market_minutes, METH_O, 0};
static PyObject *__pyx_pw_7zipline_9_protocol_1handle_non_market_minutes(PyObject *__pyx_self, PyObject *__pyx_v_bar_data) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("handle_non_market_minutes (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_handle_non_market_minutes(__pyx_self, ((PyObject *)__pyx_v_bar_data));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_handle_non_market_minutes(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_bar_data) {
  struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct_1_handle_non_market_minutes *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("handle_non_market_minutes", 0);
  __pyx_cur_scope = (struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct_1_handle_non_market_minutes *)__pyx_tp_new_7zipline_9_protocol___pyx_scope_struct_1_handle_non_market_minutes(__pyx_ptype_7zipline_9_protocol___pyx_scope_struct_1_handle_non_market_minutes, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct_1_handle_non_market_minutes *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 110, __pyx_L1_error)
  } else {
    __Pyx_GOTREF(__pyx_cur_scope);
  }
  __pyx_cur_scope->__pyx_v_bar_data = __pyx_v_bar_data;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_bar_data);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_bar_data);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7zipline_9_protocol_2generator, __pyx_codeobj__6, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_non_market_minutes, __pyx_n_s_handle_non_market_minutes, __pyx_n_s_zipline__protocol); if (unlikely(!gen)) __PYX_ERR(0, 110, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("zipline._protocol.handle_non_market_minutes", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_7zipline_9_protocol_2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
{
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("handle_non_market_minutes", 0);
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__6)
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 110, __pyx_L1_error)
/* … */
  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("handle_non_market_minutes", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  #if !CYTHON_USE_EXC_INFO_STACK
  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
  #endif
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__22 = PyTuple_Pack(1, __pyx_n_s_bar_data); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 110, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7zipline_9_protocol_1handle_non_market_minutes, NULL, __pyx_n_s_zipline__protocol); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 110, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_zipline__protocol_pyx, __pyx_n_s_handle_non_market_minutes, 110, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 110, __pyx_L1_error)
/* … */
struct __pyx_obj_7zipline_9_protocol___pyx_scope_struct_1_handle_non_market_minutes {
  PyObject_HEAD
  PyObject *__pyx_v_bar_data;
};


+111:     try:
  /*try:*/ {
+112:         bar_data._handle_non_market_minutes = True
    if (__Pyx_PyObject_SetAttrStr(__pyx_cur_scope->__pyx_v_bar_data, __pyx_n_s_handle_non_market_minutes_2, Py_True) < 0) __PYX_ERR(0, 112, __pyx_L5_error)
+113:         yield
    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_TraceReturn(__pyx_r, 0);
    __Pyx_RefNannyFinishContext();
    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 1;
    return __pyx_r;
    __pyx_L7_resume_from_yield:;
    if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 113, __pyx_L5_error)
  }
 114:     finally:
+115:         bar_data._handle_non_market_minutes = False
  /*finally:*/ {
    /*normal exit:*/{
      if (__Pyx_PyObject_SetAttrStr(__pyx_cur_scope->__pyx_v_bar_data, __pyx_n_s_handle_non_market_minutes_2, Py_False) < 0) __PYX_ERR(0, 115, __pyx_L1_error)
      goto __pyx_L6;
    }
    __pyx_L5_error:;
    /*exception exit:*/{
      __Pyx_PyThreadState_assign
      __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0;
      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6) < 0)) __Pyx_ErrFetch(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
      __Pyx_XGOTREF(__pyx_t_4);
      __Pyx_XGOTREF(__pyx_t_5);
      __Pyx_XGOTREF(__pyx_t_6);
      __Pyx_XGOTREF(__pyx_t_7);
      __Pyx_XGOTREF(__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_9);
      __pyx_t_1 = __pyx_lineno; __pyx_t_2 = __pyx_clineno; __pyx_t_3 = __pyx_filename;
      {
        if (__Pyx_PyObject_SetAttrStr(__pyx_cur_scope->__pyx_v_bar_data, __pyx_n_s_handle_non_market_minutes_2, Py_False) < 0) __PYX_ERR(0, 115, __pyx_L9_error)
      }
      if (PY_MAJOR_VERSION >= 3) {
        __Pyx_XGIVEREF(__pyx_t_7);
        __Pyx_XGIVEREF(__pyx_t_8);
        __Pyx_XGIVEREF(__pyx_t_9);
        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
      }
      __Pyx_XGIVEREF(__pyx_t_4);
      __Pyx_XGIVEREF(__pyx_t_5);
      __Pyx_XGIVEREF(__pyx_t_6);
      __Pyx_ErrRestore(__pyx_t_4, __pyx_t_5, __pyx_t_6);
      __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0;
      __pyx_lineno = __pyx_t_1; __pyx_clineno = __pyx_t_2; __pyx_filename = __pyx_t_3;
      goto __pyx_L1_error;
      __pyx_L9_error:;
      if (PY_MAJOR_VERSION >= 3) {
        __Pyx_XGIVEREF(__pyx_t_7);
        __Pyx_XGIVEREF(__pyx_t_8);
        __Pyx_XGIVEREF(__pyx_t_9);
        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
      }
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0;
      goto __pyx_L1_error;
    }
    __pyx_L6:;
  }
  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
 116: 
+117: cdef class BarData:
struct __pyx_obj_7zipline_9_protocol_BarData {
  PyObject_HEAD
  struct __pyx_vtabstruct_7zipline_9_protocol_BarData *__pyx_vtab;
  PyObject *data_portal;
  PyObject *simulation_dt_func;
  PyObject *data_frequency;
  PyObject *restrictions;
  PyObject *_views;
  PyBoolObject *_daily_mode;
  PyObject *_trading_calendar;
  PyObject *_is_restricted;
  PyBoolObject *_adjust_minutes;
};
/* … */
struct __pyx_vtabstruct_7zipline_9_protocol_BarData {
  PyObject *(*_get_current_minute)(struct __pyx_obj_7zipline_9_protocol_BarData *);
  PyBoolObject *(*_can_trade_for_asset)(struct __pyx_obj_7zipline_9_protocol_BarData *, PyObject *, PyObject *, PyObject *, PyObject *);
  PyBoolObject *(*_is_stale_for_asset)(struct __pyx_obj_7zipline_9_protocol_BarData *, PyObject *, PyObject *, PyObject *, PyObject *);
};
static struct __pyx_vtabstruct_7zipline_9_protocol_BarData *__pyx_vtabptr_7zipline_9_protocol_BarData;
 118:     """
 119:     Provides methods for accessing minutely and daily price/volume data from
 120:     Algorithm API functions.
 121: 
 122:     Also provides utility methods to determine if an asset is alive, and if it
 123:     has recent trade data.
 124: 
 125:     An instance of this object is passed as ``data`` to
 126:     :func:`~zipline.api.handle_data` and
 127:     :func:`~zipline.api.before_trading_start`.
 128: 
 129:     Parameters
 130:     ----------
 131:     data_portal : DataPortal
 132:         Provider for bar pricing data.
 133:     simulation_dt_func : callable
 134:         Function which returns the current simulation time.
 135:         This is usually bound to a method of TradingSimulation.
 136:     data_frequency : {'minute', 'daily'}
 137:         The frequency of the bar data; i.e. whether the data is
 138:         daily or minute bars
 139:     restrictions : zipline.finance.asset_restrictions.Restrictions
 140:         Object that combines and returns restricted list information from
 141:         multiple sources
 142:     """
 143:     cdef object data_portal
 144:     cdef object simulation_dt_func
 145:     cdef object data_frequency
 146:     cdef object restrictions
 147:     cdef dict _views
 148:     cdef bool _daily_mode
 149:     cdef object _trading_calendar
 150:     cdef object _is_restricted
 151: 
 152:     cdef bool _adjust_minutes
 153: 
+154:     def __init__(self, data_portal, simulation_dt_func, data_frequency,
/* Python wrapper */
static int __pyx_pw_7zipline_9_protocol_7BarData_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7zipline_9_protocol_7BarData_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_data_portal = 0;
  PyObject *__pyx_v_simulation_dt_func = 0;
  PyObject *__pyx_v_data_frequency = 0;
  PyObject *__pyx_v_trading_calendar = 0;
  PyObject *__pyx_v_restrictions = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_data_portal,&__pyx_n_s_simulation_dt_func,&__pyx_n_s_data_frequency,&__pyx_n_s_trading_calendar,&__pyx_n_s_restrictions,0};
    PyObject* values[5] = {0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data_portal)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_simulation_dt_func)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 5, 5, 1); __PYX_ERR(0, 154, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data_frequency)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 5, 5, 2); __PYX_ERR(0, 154, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_trading_calendar)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 5, 5, 3); __PYX_ERR(0, 154, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_restrictions)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 5, 5, 4); __PYX_ERR(0, 154, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 154, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 5) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
    }
    __pyx_v_data_portal = values[0];
    __pyx_v_simulation_dt_func = values[1];
    __pyx_v_data_frequency = values[2];
    __pyx_v_trading_calendar = values[3];
    __pyx_v_restrictions = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 154, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("zipline._protocol.BarData.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData___init__(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), __pyx_v_data_portal, __pyx_v_simulation_dt_func, __pyx_v_data_frequency, __pyx_v_trading_calendar, __pyx_v_restrictions);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7zipline_9_protocol_7BarData___init__(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_data_portal, PyObject *__pyx_v_simulation_dt_func, PyObject *__pyx_v_data_frequency, PyObject *__pyx_v_trading_calendar, PyObject *__pyx_v_restrictions) {
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
  __Pyx_TraceCall("__init__", __pyx_f[0], 154, 0, __PYX_ERR(0, 154, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("zipline._protocol.BarData.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 155:                  trading_calendar, restrictions):
+156:         self.data_portal = data_portal
  __Pyx_INCREF(__pyx_v_data_portal);
  __Pyx_GIVEREF(__pyx_v_data_portal);
  __Pyx_GOTREF(__pyx_v_self->data_portal);
  __Pyx_DECREF(__pyx_v_self->data_portal);
  __pyx_v_self->data_portal = __pyx_v_data_portal;
+157:         self.simulation_dt_func = simulation_dt_func
  __Pyx_INCREF(__pyx_v_simulation_dt_func);
  __Pyx_GIVEREF(__pyx_v_simulation_dt_func);
  __Pyx_GOTREF(__pyx_v_self->simulation_dt_func);
  __Pyx_DECREF(__pyx_v_self->simulation_dt_func);
  __pyx_v_self->simulation_dt_func = __pyx_v_simulation_dt_func;
+158:         self.data_frequency = data_frequency
  __Pyx_INCREF(__pyx_v_data_frequency);
  __Pyx_GIVEREF(__pyx_v_data_frequency);
  __Pyx_GOTREF(__pyx_v_self->data_frequency);
  __Pyx_DECREF(__pyx_v_self->data_frequency);
  __pyx_v_self->data_frequency = __pyx_v_data_frequency;
+159:         self._views = {}
  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_views);
  __Pyx_DECREF(__pyx_v_self->_views);
  __pyx_v_self->_views = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 160: 
+161:         self._daily_mode = (self.data_frequency == "daily")
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_self->data_frequency, __pyx_n_u_daily, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error)
  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7cpython_4bool_bool))))) __PYX_ERR(0, 161, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_daily_mode);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->_daily_mode));
  __pyx_v_self->_daily_mode = ((PyBoolObject *)__pyx_t_1);
  __pyx_t_1 = 0;
 162: 
+163:         self._adjust_minutes = False
  __Pyx_INCREF(Py_False);
  __Pyx_GIVEREF(Py_False);
  __Pyx_GOTREF(__pyx_v_self->_adjust_minutes);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->_adjust_minutes));
  __pyx_v_self->_adjust_minutes = ((PyBoolObject *)Py_False);
 164: 
+165:         self._trading_calendar = trading_calendar
  __Pyx_INCREF(__pyx_v_trading_calendar);
  __Pyx_GIVEREF(__pyx_v_trading_calendar);
  __Pyx_GOTREF(__pyx_v_self->_trading_calendar);
  __Pyx_DECREF(__pyx_v_self->_trading_calendar);
  __pyx_v_self->_trading_calendar = __pyx_v_trading_calendar;
+166:         self._is_restricted = restrictions.is_restricted
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_restrictions, __pyx_n_s_is_restricted); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 166, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_is_restricted);
  __Pyx_DECREF(__pyx_v_self->_is_restricted);
  __pyx_v_self->_is_restricted = __pyx_t_1;
  __pyx_t_1 = 0;
 167: 
+168:     cdef _get_current_minute(self):
static PyObject *__pyx_f_7zipline_9_protocol_7BarData__get_current_minute(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self) {
  PyObject *__pyx_v_dt = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_get_current_minute", 0);
  __Pyx_TraceCall("_get_current_minute", __pyx_f[0], 168, 0, __PYX_ERR(0, 168, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("zipline._protocol.BarData._get_current_minute", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dt);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 169:         """
 170:         Internal utility method to get the current simulation time.
 171: 
 172:         Possible answers are:
 173:         - whatever the algorithm's get_datetime() method returns (this is what
 174:             `self.simulation_dt_func()` points to)
 175:         - sometimes we're knowingly not in a market minute, like if we're in
 176:             before_trading_start.  In that case, `self._adjust_minutes` is
 177:             True, and we get the previous market minute.
 178:         - if we're in daily mode, get the session label for this minute.
 179:         """
+180:         dt = self.simulation_dt_func()
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_2 = __pyx_v_self->simulation_dt_func; __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_dt = __pyx_t_1;
  __pyx_t_1 = 0;
 181: 
+182:         if self._adjust_minutes:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 182, __pyx_L1_error)
  if (__pyx_t_4) {
/* … */
  }
 183:             dt = \
+184:                 self.data_portal.trading_calendar.previous_minute(dt)
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_trading_calendar); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 184, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_previous_minute); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_v_dt) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_dt);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF_SET(__pyx_v_dt, __pyx_t_1);
    __pyx_t_1 = 0;
 185: 
+186:         if self._daily_mode:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_daily_mode)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 186, __pyx_L1_error)
  if (__pyx_t_4) {
/* … */
  }
 187:             # if we're in daily mode, take the given dt (which is the last
 188:             # minute of the session) and get the session label for it.
+189:             dt = self.data_portal.trading_calendar.minute_to_session_label(dt)
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_trading_calendar); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_minute_to_session_label); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 189, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_dt) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_dt);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 189, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_dt, __pyx_t_1);
    __pyx_t_1 = 0;
 190: 
+191:         return dt
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_dt);
  __pyx_r = __pyx_v_dt;
  goto __pyx_L0;
 192: 
+193:     @check_parameters(('assets', 'fields'),
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7zipline_9_protocol_check_parameters), __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
  __pyx_tuple__23 = PyTuple_Pack(2, __pyx_n_u_assets, __pyx_n_u_fields); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);
+194:                       ((Asset, ContinuousFuture, str), (str,)))
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_ContinuousFuture); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __Pyx_INCREF(((PyObject *)(&PyUnicode_Type)));
  __Pyx_GIVEREF(((PyObject *)(&PyUnicode_Type)));
  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)(&PyUnicode_Type)));
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)(&PyUnicode_Type)));
  __Pyx_GIVEREF(((PyObject *)(&PyUnicode_Type)));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)(&PyUnicode_Type)));
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
+195:     def current(self, assets, fields):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_3current(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7zipline_9_protocol_7BarData_2current[] = "\n        Returns the \"current\" value of the given fields for the given assets\n        at the current simulation time.\n\n        Parameters\n        ----------\n        assets : zipline.assets.Asset or iterable of zipline.assets.Asset\n            The asset(s) for which data is requested.\n        fields : str or iterable[str].\n            Requested data field(s). Valid field names are: \"price\",\n            \"last_traded\", \"open\", \"high\", \"low\", \"close\", and \"volume\".\n\n        Returns\n        -------\n        current_value : Scalar, pandas Series, or pandas DataFrame.\n            See notes below.\n\n        Notes\n        -----\n        The return type of this function depends on the types of its inputs:\n\n        - If a single asset and a single field are requested, the returned\n          value is a scalar (either a float or a ``pd.Timestamp`` depending on\n          the field).\n\n        - If a single asset and a list of fields are requested, the returned\n          value is a :class:`pd.Series` whose indices are the requested fields.\n\n        - If a list of assets and a single field are requested, the returned\n          value is a :class:`pd.Series` whose indices are the assets.\n\n        - If a list of assets and a list of fields are requested, the returned\n          value is a :class:`pd.DataFrame`.  The columns of the returned frame\n          will be the requested fields, and the index of the frame will be the\n          requested assets.\n\n        The values produced for ``fields`` are as follows:\n\n        - Requesting \"price\" produces the last known close price for the asset,\n          forward-filled from an earlier minute if there is no trade this\n          minute. If there is no last known value (either because the asset\n          has never traded, or because it has delisted) NaN is returned. If a\n          value is found, and we had to cross an adjustment boundary (split,\n          dividend, etc) to get it, the va""lue is adjusted to the current\n          simulation time before being returned.\n\n        - Requesting \"open\", \"high\", \"low\", or \"close\" produces the open, high,\n          low, or close for the current minute. If no trades occurred this\n          minute, ``NaN`` is returned.\n\n        - Requesting \"volume\" produces the trade volume for the current\n          minute. If no trades occurred this minute, 0 is returned.\n\n        - Requesting \"last_traded\" produces the datetime of the last minute in\n          which the asset traded, even if the asset has stopped trading. If\n          there is no last known value, ``pd.NaT`` is returned.\n\n        If the current simulation time is not a valid market time for an asset,\n        we use the most recent market close instead.\n        ";
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_3current(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_assets = 0;
  PyObject *__pyx_v_fields = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("current (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_assets,&__pyx_n_s_fields,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_assets)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fields)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("current", 1, 2, 2, 1); __PYX_ERR(0, 195, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "current") < 0)) __PYX_ERR(0, 195, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_assets = values[0];
    __pyx_v_fields = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("current", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 195, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("zipline._protocol.BarData.current", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_2current(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), __pyx_v_assets, __pyx_v_fields);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_2current(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_assets, PyObject *__pyx_v_fields) {
  PyBoolObject *__pyx_v_multiple_assets = NULL;
  PyBoolObject *__pyx_v_multiple_fields = NULL;
  PyObject *__pyx_v_asset = NULL;
  PyObject *__pyx_v_field = NULL;
  PyObject *__pyx_v_data = NULL;
  PyObject *__pyx_v_series = NULL;
  PyObject *__pyx_8genexpr2__pyx_v_field = NULL;
  PyObject *__pyx_8genexpr3__pyx_v_field = NULL;
  PyObject *__pyx_8genexpr4__pyx_v_asset = NULL;
  PyObject *__pyx_8genexpr5__pyx_v_asset = NULL;
  PyObject *__pyx_8genexpr6__pyx_v_asset = NULL;
  PyObject *__pyx_8genexpr7__pyx_v_asset = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("current", 0);
  __Pyx_TraceCall("current", __pyx_f[0], 195, 0, __PYX_ERR(0, 195, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_XDECREF(__pyx_t_18);
  __Pyx_AddTraceback("zipline._protocol.BarData.current", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_multiple_assets);
  __Pyx_XDECREF((PyObject *)__pyx_v_multiple_fields);
  __Pyx_XDECREF(__pyx_v_asset);
  __Pyx_XDECREF(__pyx_v_field);
  __Pyx_XDECREF(__pyx_v_data);
  __Pyx_XDECREF(__pyx_v_series);
  __Pyx_XDECREF(__pyx_8genexpr2__pyx_v_field);
  __Pyx_XDECREF(__pyx_8genexpr3__pyx_v_field);
  __Pyx_XDECREF(__pyx_8genexpr4__pyx_v_asset);
  __Pyx_XDECREF(__pyx_8genexpr5__pyx_v_asset);
  __Pyx_XDECREF(__pyx_8genexpr6__pyx_v_asset);
  __Pyx_XDECREF(__pyx_8genexpr7__pyx_v_asset);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_1, (PyObject *)__pyx_ptype_7zipline_9_protocol_BarData, __pyx_n_s_current); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_2, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7zipline_9_protocol_BarData->tp_dict, __pyx_n_s_current, __pyx_t_3) < 0) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  PyType_Modified(__pyx_ptype_7zipline_9_protocol_BarData);
 196:         """
 197:         Returns the "current" value of the given fields for the given assets
 198:         at the current simulation time.
 199: 
 200:         Parameters
 201:         ----------
 202:         assets : zipline.assets.Asset or iterable of zipline.assets.Asset
 203:             The asset(s) for which data is requested.
 204:         fields : str or iterable[str].
 205:             Requested data field(s). Valid field names are: "price",
 206:             "last_traded", "open", "high", "low", "close", and "volume".
 207: 
 208:         Returns
 209:         -------
 210:         current_value : Scalar, pandas Series, or pandas DataFrame.
 211:             See notes below.
 212: 
 213:         Notes
 214:         -----
 215:         The return type of this function depends on the types of its inputs:
 216: 
 217:         - If a single asset and a single field are requested, the returned
 218:           value is a scalar (either a float or a ``pd.Timestamp`` depending on
 219:           the field).
 220: 
 221:         - If a single asset and a list of fields are requested, the returned
 222:           value is a :class:`pd.Series` whose indices are the requested fields.
 223: 
 224:         - If a list of assets and a single field are requested, the returned
 225:           value is a :class:`pd.Series` whose indices are the assets.
 226: 
 227:         - If a list of assets and a list of fields are requested, the returned
 228:           value is a :class:`pd.DataFrame`.  The columns of the returned frame
 229:           will be the requested fields, and the index of the frame will be the
 230:           requested assets.
 231: 
 232:         The values produced for ``fields`` are as follows:
 233: 
 234:         - Requesting "price" produces the last known close price for the asset,
 235:           forward-filled from an earlier minute if there is no trade this
 236:           minute. If there is no last known value (either because the asset
 237:           has never traded, or because it has delisted) NaN is returned. If a
 238:           value is found, and we had to cross an adjustment boundary (split,
 239:           dividend, etc) to get it, the value is adjusted to the current
 240:           simulation time before being returned.
 241: 
 242:         - Requesting "open", "high", "low", or "close" produces the open, high,
 243:           low, or close for the current minute. If no trades occurred this
 244:           minute, ``NaN`` is returned.
 245: 
 246:         - Requesting "volume" produces the trade volume for the current
 247:           minute. If no trades occurred this minute, 0 is returned.
 248: 
 249:         - Requesting "last_traded" produces the datetime of the last minute in
 250:           which the asset traded, even if the asset has stopped trading. If
 251:           there is no last known value, ``pd.NaT`` is returned.
 252: 
 253:         If the current simulation time is not a valid market time for an asset,
 254:         we use the most recent market close instead.
 255:         """
+256:         multiple_assets = _is_iterable(assets)
  __pyx_t_1 = ((PyObject *)__pyx_f_7zipline_9_protocol__is_iterable(__pyx_v_assets)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 256, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_multiple_assets = ((PyBoolObject *)__pyx_t_1);
  __pyx_t_1 = 0;
+257:         multiple_fields = _is_iterable(fields)
  __pyx_t_1 = ((PyObject *)__pyx_f_7zipline_9_protocol__is_iterable(__pyx_v_fields)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_multiple_fields = ((PyBoolObject *)__pyx_t_1);
  __pyx_t_1 = 0;
 258: 
 259:         # There's some overly verbose code in here, particularly around
 260:         # 'do something if self._adjust_minutes is False, otherwise do
 261:         # something else'. This could be less verbose, but the 99% case is that
 262:         # `self._adjust_minutes` is False, so it's important to keep that code
 263:         # path as fast as possible.
 264: 
 265:         # There's probably a way to make this method (and `history`) less
 266:         # verbose, but this is OK for now.
 267: 
+268:         if not multiple_assets:
  __pyx_t_2 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_multiple_assets)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 268, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
/* … */
  }
+269:             asset = assets
    __Pyx_INCREF(__pyx_v_assets);
    __pyx_v_asset = __pyx_v_assets;
 270: 
+271:             if not multiple_fields:
    __pyx_t_3 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_multiple_fields)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 271, __pyx_L1_error)
    __pyx_t_2 = ((!__pyx_t_3) != 0);
    if (__pyx_t_2) {
/* … */
    }
+272:                 field = fields
      __Pyx_INCREF(__pyx_v_fields);
      __pyx_v_field = __pyx_v_fields;
 273: 
 274:                 # return scalar value
+275:                 if not self._adjust_minutes:
      __pyx_t_2 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 275, __pyx_L1_error)
      __pyx_t_3 = ((!__pyx_t_2) != 0);
      if (__pyx_t_3) {
/* … */
      }
+276:                     return self.data_portal.get_spot_value(
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 276, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
 277:                         asset,
 278:                         field,
+279:                         self._get_current_minute(),
        __pyx_t_5 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 279, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
+280:                         self.data_frequency
        __pyx_t_6 = NULL;
        __pyx_t_7 = 0;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
          if (likely(__pyx_t_6)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_4, function);
            __pyx_t_7 = 1;
          }
        }
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_4)) {
          PyObject *__pyx_temp[5] = {__pyx_t_6, __pyx_v_asset, __pyx_v_field, __pyx_t_5, __pyx_v_self->data_frequency};
          __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 276, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
          PyObject *__pyx_temp[5] = {__pyx_t_6, __pyx_v_asset, __pyx_v_field, __pyx_t_5, __pyx_v_self->data_frequency};
          __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 276, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        } else
        #endif
        {
          __pyx_t_8 = PyTuple_New(4+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 276, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_8);
          if (__pyx_t_6) {
            __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __pyx_t_6 = NULL;
          }
          __Pyx_INCREF(__pyx_v_asset);
          __Pyx_GIVEREF(__pyx_v_asset);
          PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_v_asset);
          __Pyx_INCREF(__pyx_v_field);
          __Pyx_GIVEREF(__pyx_v_field);
          PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_field);
          __Pyx_GIVEREF(__pyx_t_5);
          PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_7, __pyx_t_5);
          __Pyx_INCREF(__pyx_v_self->data_frequency);
          __Pyx_GIVEREF(__pyx_v_self->data_frequency);
          PyTuple_SET_ITEM(__pyx_t_8, 3+__pyx_t_7, __pyx_v_self->data_frequency);
          __pyx_t_5 = 0;
          __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 276, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        }
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_r = __pyx_t_1;
        __pyx_t_1 = 0;
        goto __pyx_L0;
 281:                     )
 282:                 else:
+283:                     return self.data_portal.get_adjusted_value(
      /*else*/ {
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_adjusted_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 283, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
 284:                         asset,
 285:                         field,
+286:                         self._get_current_minute(),
        __pyx_t_8 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 286, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
+287:                         self.simulation_dt_func(),
        __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
        __pyx_t_6 = __pyx_v_self->simulation_dt_func; __pyx_t_9 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_9)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_9);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        __pyx_t_5 = (__pyx_t_9) ? __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_9) : __Pyx_PyObject_CallNoArg(__pyx_t_6);
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 287, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+288:                         self.data_frequency
        __pyx_t_6 = NULL;
        __pyx_t_7 = 0;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
          if (likely(__pyx_t_6)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_4, function);
            __pyx_t_7 = 1;
          }
        }
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_4)) {
          PyObject *__pyx_temp[6] = {__pyx_t_6, __pyx_v_asset, __pyx_v_field, __pyx_t_8, __pyx_t_5, __pyx_v_self->data_frequency};
          __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 283, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
          PyObject *__pyx_temp[6] = {__pyx_t_6, __pyx_v_asset, __pyx_v_field, __pyx_t_8, __pyx_t_5, __pyx_v_self->data_frequency};
          __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 283, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        } else
        #endif
        {
          __pyx_t_9 = PyTuple_New(5+__pyx_t_7); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 283, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_9);
          if (__pyx_t_6) {
            __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_6); __pyx_t_6 = NULL;
          }
          __Pyx_INCREF(__pyx_v_asset);
          __Pyx_GIVEREF(__pyx_v_asset);
          PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_7, __pyx_v_asset);
          __Pyx_INCREF(__pyx_v_field);
          __Pyx_GIVEREF(__pyx_v_field);
          PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_7, __pyx_v_field);
          __Pyx_GIVEREF(__pyx_t_8);
          PyTuple_SET_ITEM(__pyx_t_9, 2+__pyx_t_7, __pyx_t_8);
          __Pyx_GIVEREF(__pyx_t_5);
          PyTuple_SET_ITEM(__pyx_t_9, 3+__pyx_t_7, __pyx_t_5);
          __Pyx_INCREF(__pyx_v_self->data_frequency);
          __Pyx_GIVEREF(__pyx_v_self->data_frequency);
          PyTuple_SET_ITEM(__pyx_t_9, 4+__pyx_t_7, __pyx_v_self->data_frequency);
          __pyx_t_8 = 0;
          __pyx_t_5 = 0;
          __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 283, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        }
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_r = __pyx_t_1;
        __pyx_t_1 = 0;
        goto __pyx_L0;
      }
 289:                     )
 290:             else:
 291:                 # assume fields is iterable
 292:                 # return a Series indexed by field
+293:                 if not self._adjust_minutes:
    /*else*/ {
      __pyx_t_3 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 293, __pyx_L1_error)
      __pyx_t_2 = ((!__pyx_t_3) != 0);
      if (__pyx_t_2) {
/* … */
      }
+294:                     return pd.Series(data={
        __Pyx_XDECREF(__pyx_r);
        __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pd); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 294, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        { /* enter inner scope */
          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 294, __pyx_L9_error)
          __Pyx_GOTREF(__pyx_t_9);
/* … */
        __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 294, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_r = __pyx_t_9;
        __pyx_t_9 = 0;
        goto __pyx_L0;
+295:                         field: self.data_portal.get_spot_value(
            __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 295, __pyx_L9_error)
            __Pyx_GOTREF(__pyx_t_6);
 296:                             asset,
 297:                             field,
+298:                             self._get_current_minute(),
            __pyx_t_12 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 298, __pyx_L9_error)
            __Pyx_GOTREF(__pyx_t_12);
+299:                             self.data_frequency
            __pyx_t_13 = NULL;
            __pyx_t_7 = 0;
            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
              __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_6);
              if (likely(__pyx_t_13)) {
                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
                __Pyx_INCREF(__pyx_t_13);
                __Pyx_INCREF(function);
                __Pyx_DECREF_SET(__pyx_t_6, function);
                __pyx_t_7 = 1;
              }
            }
            #if CYTHON_FAST_PYCALL
            if (PyFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[5] = {__pyx_t_13, __pyx_v_asset, __pyx_8genexpr2__pyx_v_field, __pyx_t_12, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 295, __pyx_L9_error)
              __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
            } else
            #endif
            #if CYTHON_FAST_PYCCALL
            if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[5] = {__pyx_t_13, __pyx_v_asset, __pyx_8genexpr2__pyx_v_field, __pyx_t_12, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 295, __pyx_L9_error)
              __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
            } else
            #endif
            {
              __pyx_t_14 = PyTuple_New(4+__pyx_t_7); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 295, __pyx_L9_error)
              __Pyx_GOTREF(__pyx_t_14);
              if (__pyx_t_13) {
                __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13); __pyx_t_13 = NULL;
              }
              __Pyx_INCREF(__pyx_v_asset);
              __Pyx_GIVEREF(__pyx_v_asset);
              PyTuple_SET_ITEM(__pyx_t_14, 0+__pyx_t_7, __pyx_v_asset);
              __Pyx_INCREF(__pyx_8genexpr2__pyx_v_field);
              __Pyx_GIVEREF(__pyx_8genexpr2__pyx_v_field);
              PyTuple_SET_ITEM(__pyx_t_14, 1+__pyx_t_7, __pyx_8genexpr2__pyx_v_field);
              __Pyx_GIVEREF(__pyx_t_12);
              PyTuple_SET_ITEM(__pyx_t_14, 2+__pyx_t_7, __pyx_t_12);
              __Pyx_INCREF(__pyx_v_self->data_frequency);
              __Pyx_GIVEREF(__pyx_v_self->data_frequency);
              PyTuple_SET_ITEM(__pyx_t_14, 3+__pyx_t_7, __pyx_v_self->data_frequency);
              __pyx_t_12 = 0;
              __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 295, __pyx_L9_error)
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
            }
            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
            if (unlikely(PyDict_SetItem(__pyx_t_9, (PyObject*)__pyx_8genexpr2__pyx_v_field, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 295, __pyx_L9_error)
            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 300:                         )
+301:                         for field in fields
          if (likely(PyList_CheckExact(__pyx_v_fields)) || PyTuple_CheckExact(__pyx_v_fields)) {
            __pyx_t_5 = __pyx_v_fields; __Pyx_INCREF(__pyx_t_5); __pyx_t_10 = 0;
            __pyx_t_11 = NULL;
          } else {
            __pyx_t_10 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_fields); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 301, __pyx_L9_error)
            __Pyx_GOTREF(__pyx_t_5);
            __pyx_t_11 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 301, __pyx_L9_error)
          }
          for (;;) {
            if (likely(!__pyx_t_11)) {
              if (likely(PyList_CheckExact(__pyx_t_5))) {
                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 301, __pyx_L9_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 301, __pyx_L9_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              } else {
                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 301, __pyx_L9_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 301, __pyx_L9_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              }
            } else {
              __pyx_t_8 = __pyx_t_11(__pyx_t_5);
              if (unlikely(!__pyx_t_8)) {
                PyObject* exc_type = PyErr_Occurred();
                if (exc_type) {
                  if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                  else __PYX_ERR(0, 301, __pyx_L9_error)
                }
                break;
              }
              __Pyx_GOTREF(__pyx_t_8);
            }
            __Pyx_XDECREF_SET(__pyx_8genexpr2__pyx_v_field, __pyx_t_8);
            __pyx_t_8 = 0;
/* … */
          }
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_XDECREF(__pyx_8genexpr2__pyx_v_field); __pyx_8genexpr2__pyx_v_field = 0;
          goto __pyx_L12_exit_scope;
          __pyx_L9_error:;
          __Pyx_XDECREF(__pyx_8genexpr2__pyx_v_field); __pyx_8genexpr2__pyx_v_field = 0;
          goto __pyx_L1_error;
          __pyx_L12_exit_scope:;
        } /* exit inner scope */
        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_data, __pyx_t_9) < 0) __PYX_ERR(0, 294, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+302:                     }, index=fields, name=assets.symbol)
        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_index, __pyx_v_fields) < 0) __PYX_ERR(0, 294, __pyx_L1_error)
        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_assets, __pyx_n_s_symbol); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 302, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_name_2, __pyx_t_9) < 0) __PYX_ERR(0, 294, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 303:                 else:
+304:                     return pd.Series(data={
      /*else*/ {
        __Pyx_XDECREF(__pyx_r);
        __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_pd); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 304, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_Series); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 304, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_t_9 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 304, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        { /* enter inner scope */
          __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 304, __pyx_L15_error)
          __Pyx_GOTREF(__pyx_t_4);
/* … */
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 304, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_r = __pyx_t_4;
        __pyx_t_4 = 0;
        goto __pyx_L0;
      }
    }
+305:                         field: self.data_portal.get_adjusted_value(
            __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_adjusted_value); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 305, __pyx_L15_error)
            __Pyx_GOTREF(__pyx_t_6);
 306:                             asset,
 307:                             field,
+308:                             self._get_current_minute(),
            __pyx_t_14 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 308, __pyx_L15_error)
            __Pyx_GOTREF(__pyx_t_14);
+309:                             self.simulation_dt_func(),
            __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
            __pyx_t_13 = __pyx_v_self->simulation_dt_func; __pyx_t_15 = NULL;
            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
              __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_13);
              if (likely(__pyx_t_15)) {
                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
                __Pyx_INCREF(__pyx_t_15);
                __Pyx_INCREF(function);
                __Pyx_DECREF_SET(__pyx_t_13, function);
              }
            }
            __pyx_t_12 = (__pyx_t_15) ? __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_t_15) : __Pyx_PyObject_CallNoArg(__pyx_t_13);
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 309, __pyx_L15_error)
            __Pyx_GOTREF(__pyx_t_12);
            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+310:                             self.data_frequency
            __pyx_t_13 = NULL;
            __pyx_t_7 = 0;
            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
              __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_6);
              if (likely(__pyx_t_13)) {
                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
                __Pyx_INCREF(__pyx_t_13);
                __Pyx_INCREF(function);
                __Pyx_DECREF_SET(__pyx_t_6, function);
                __pyx_t_7 = 1;
              }
            }
            #if CYTHON_FAST_PYCALL
            if (PyFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[6] = {__pyx_t_13, __pyx_v_asset, __pyx_8genexpr3__pyx_v_field, __pyx_t_14, __pyx_t_12, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 305, __pyx_L15_error)
              __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
            } else
            #endif
            #if CYTHON_FAST_PYCCALL
            if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[6] = {__pyx_t_13, __pyx_v_asset, __pyx_8genexpr3__pyx_v_field, __pyx_t_14, __pyx_t_12, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 305, __pyx_L15_error)
              __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
            } else
            #endif
            {
              __pyx_t_15 = PyTuple_New(5+__pyx_t_7); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 305, __pyx_L15_error)
              __Pyx_GOTREF(__pyx_t_15);
              if (__pyx_t_13) {
                __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13); __pyx_t_13 = NULL;
              }
              __Pyx_INCREF(__pyx_v_asset);
              __Pyx_GIVEREF(__pyx_v_asset);
              PyTuple_SET_ITEM(__pyx_t_15, 0+__pyx_t_7, __pyx_v_asset);
              __Pyx_INCREF(__pyx_8genexpr3__pyx_v_field);
              __Pyx_GIVEREF(__pyx_8genexpr3__pyx_v_field);
              PyTuple_SET_ITEM(__pyx_t_15, 1+__pyx_t_7, __pyx_8genexpr3__pyx_v_field);
              __Pyx_GIVEREF(__pyx_t_14);
              PyTuple_SET_ITEM(__pyx_t_15, 2+__pyx_t_7, __pyx_t_14);
              __Pyx_GIVEREF(__pyx_t_12);
              PyTuple_SET_ITEM(__pyx_t_15, 3+__pyx_t_7, __pyx_t_12);
              __Pyx_INCREF(__pyx_v_self->data_frequency);
              __Pyx_GIVEREF(__pyx_v_self->data_frequency);
              PyTuple_SET_ITEM(__pyx_t_15, 4+__pyx_t_7, __pyx_v_self->data_frequency);
              __pyx_t_14 = 0;
              __pyx_t_12 = 0;
              __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_15, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 305, __pyx_L15_error)
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
            }
            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
            if (unlikely(PyDict_SetItem(__pyx_t_4, (PyObject*)__pyx_8genexpr3__pyx_v_field, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 305, __pyx_L15_error)
            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 311:                         )
+312:                         for field in fields
          if (likely(PyList_CheckExact(__pyx_v_fields)) || PyTuple_CheckExact(__pyx_v_fields)) {
            __pyx_t_5 = __pyx_v_fields; __Pyx_INCREF(__pyx_t_5); __pyx_t_10 = 0;
            __pyx_t_11 = NULL;
          } else {
            __pyx_t_10 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_fields); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 312, __pyx_L15_error)
            __Pyx_GOTREF(__pyx_t_5);
            __pyx_t_11 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 312, __pyx_L15_error)
          }
          for (;;) {
            if (likely(!__pyx_t_11)) {
              if (likely(PyList_CheckExact(__pyx_t_5))) {
                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 312, __pyx_L15_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 312, __pyx_L15_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              } else {
                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 312, __pyx_L15_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 312, __pyx_L15_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              }
            } else {
              __pyx_t_8 = __pyx_t_11(__pyx_t_5);
              if (unlikely(!__pyx_t_8)) {
                PyObject* exc_type = PyErr_Occurred();
                if (exc_type) {
                  if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                  else __PYX_ERR(0, 312, __pyx_L15_error)
                }
                break;
              }
              __Pyx_GOTREF(__pyx_t_8);
            }
            __Pyx_XDECREF_SET(__pyx_8genexpr3__pyx_v_field, __pyx_t_8);
            __pyx_t_8 = 0;
/* … */
          }
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_XDECREF(__pyx_8genexpr3__pyx_v_field); __pyx_8genexpr3__pyx_v_field = 0;
          goto __pyx_L18_exit_scope;
          __pyx_L15_error:;
          __Pyx_XDECREF(__pyx_8genexpr3__pyx_v_field); __pyx_8genexpr3__pyx_v_field = 0;
          goto __pyx_L1_error;
          __pyx_L18_exit_scope:;
        } /* exit inner scope */
        if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_data, __pyx_t_4) < 0) __PYX_ERR(0, 304, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+313:                     }, index=fields, name=assets.symbol)
        if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_index, __pyx_v_fields) < 0) __PYX_ERR(0, 304, __pyx_L1_error)
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_assets, __pyx_n_s_symbol); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 313, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_name_2, __pyx_t_4) < 0) __PYX_ERR(0, 304, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 314:         else:
+315:             if not multiple_fields:
  /*else*/ {
    __pyx_t_2 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_multiple_fields)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 315, __pyx_L1_error)
    __pyx_t_3 = ((!__pyx_t_2) != 0);
    if (__pyx_t_3) {
/* … */
    }
+316:                 field = fields
      __Pyx_INCREF(__pyx_v_fields);
      __pyx_v_field = __pyx_v_fields;
 317: 
 318:                 # assume assets is iterable
 319:                 # return a Series indexed by asset
+320:                 if not self._adjust_minutes:
      __pyx_t_3 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 320, __pyx_L1_error)
      __pyx_t_2 = ((!__pyx_t_3) != 0);
      if (__pyx_t_2) {
/* … */
      }
+321:                     return pd.Series(data={
        __Pyx_XDECREF(__pyx_r);
        __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pd); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Series); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_t_4 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        { /* enter inner scope */
          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 321, __pyx_L23_error)
          __Pyx_GOTREF(__pyx_t_1);
/* … */
        __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_empty_tuple, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_r = __pyx_t_1;
        __pyx_t_1 = 0;
        goto __pyx_L0;
+322:                         asset: self.data_portal.get_spot_value(
            __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 322, __pyx_L23_error)
            __Pyx_GOTREF(__pyx_t_6);
 323:                             asset,
 324:                             field,
+325:                             self._get_current_minute(),
            __pyx_t_15 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 325, __pyx_L23_error)
            __Pyx_GOTREF(__pyx_t_15);
+326:                             self.data_frequency
            __pyx_t_12 = NULL;
            __pyx_t_7 = 0;
            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
              __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_6);
              if (likely(__pyx_t_12)) {
                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
                __Pyx_INCREF(__pyx_t_12);
                __Pyx_INCREF(function);
                __Pyx_DECREF_SET(__pyx_t_6, function);
                __pyx_t_7 = 1;
              }
            }
            #if CYTHON_FAST_PYCALL
            if (PyFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[5] = {__pyx_t_12, __pyx_8genexpr4__pyx_v_asset, __pyx_v_field, __pyx_t_15, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 322, __pyx_L23_error)
              __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
            } else
            #endif
            #if CYTHON_FAST_PYCCALL
            if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[5] = {__pyx_t_12, __pyx_8genexpr4__pyx_v_asset, __pyx_v_field, __pyx_t_15, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 322, __pyx_L23_error)
              __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
            } else
            #endif
            {
              __pyx_t_14 = PyTuple_New(4+__pyx_t_7); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 322, __pyx_L23_error)
              __Pyx_GOTREF(__pyx_t_14);
              if (__pyx_t_12) {
                __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_12); __pyx_t_12 = NULL;
              }
              __Pyx_INCREF(__pyx_8genexpr4__pyx_v_asset);
              __Pyx_GIVEREF(__pyx_8genexpr4__pyx_v_asset);
              PyTuple_SET_ITEM(__pyx_t_14, 0+__pyx_t_7, __pyx_8genexpr4__pyx_v_asset);
              __Pyx_INCREF(__pyx_v_field);
              __Pyx_GIVEREF(__pyx_v_field);
              PyTuple_SET_ITEM(__pyx_t_14, 1+__pyx_t_7, __pyx_v_field);
              __Pyx_GIVEREF(__pyx_t_15);
              PyTuple_SET_ITEM(__pyx_t_14, 2+__pyx_t_7, __pyx_t_15);
              __Pyx_INCREF(__pyx_v_self->data_frequency);
              __Pyx_GIVEREF(__pyx_v_self->data_frequency);
              PyTuple_SET_ITEM(__pyx_t_14, 3+__pyx_t_7, __pyx_v_self->data_frequency);
              __pyx_t_15 = 0;
              __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 322, __pyx_L23_error)
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
            }
            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
            if (unlikely(PyDict_SetItem(__pyx_t_1, (PyObject*)__pyx_8genexpr4__pyx_v_asset, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 322, __pyx_L23_error)
            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 327:                         )
+328:                         for asset in assets
          if (likely(PyList_CheckExact(__pyx_v_assets)) || PyTuple_CheckExact(__pyx_v_assets)) {
            __pyx_t_5 = __pyx_v_assets; __Pyx_INCREF(__pyx_t_5); __pyx_t_10 = 0;
            __pyx_t_11 = NULL;
          } else {
            __pyx_t_10 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_assets); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 328, __pyx_L23_error)
            __Pyx_GOTREF(__pyx_t_5);
            __pyx_t_11 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 328, __pyx_L23_error)
          }
          for (;;) {
            if (likely(!__pyx_t_11)) {
              if (likely(PyList_CheckExact(__pyx_t_5))) {
                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 328, __pyx_L23_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 328, __pyx_L23_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              } else {
                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 328, __pyx_L23_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 328, __pyx_L23_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              }
            } else {
              __pyx_t_8 = __pyx_t_11(__pyx_t_5);
              if (unlikely(!__pyx_t_8)) {
                PyObject* exc_type = PyErr_Occurred();
                if (exc_type) {
                  if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                  else __PYX_ERR(0, 328, __pyx_L23_error)
                }
                break;
              }
              __Pyx_GOTREF(__pyx_t_8);
            }
            __Pyx_XDECREF_SET(__pyx_8genexpr4__pyx_v_asset, __pyx_t_8);
            __pyx_t_8 = 0;
/* … */
          }
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_XDECREF(__pyx_8genexpr4__pyx_v_asset); __pyx_8genexpr4__pyx_v_asset = 0;
          goto __pyx_L26_exit_scope;
          __pyx_L23_error:;
          __Pyx_XDECREF(__pyx_8genexpr4__pyx_v_asset); __pyx_8genexpr4__pyx_v_asset = 0;
          goto __pyx_L1_error;
          __pyx_L26_exit_scope:;
        } /* exit inner scope */
        if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_data, __pyx_t_1) < 0) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+329:                     }, index=assets, name=fields)
        if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_index, __pyx_v_assets) < 0) __PYX_ERR(0, 321, __pyx_L1_error)
        if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_name_2, __pyx_v_fields) < 0) __PYX_ERR(0, 321, __pyx_L1_error)
 330:                 else:
+331:                     return pd.Series(data={
      /*else*/ {
        __Pyx_XDECREF(__pyx_r);
        __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pd); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 331, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 331, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 331, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        { /* enter inner scope */
          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 331, __pyx_L29_error)
          __Pyx_GOTREF(__pyx_t_9);
/* … */
        __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 331, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_r = __pyx_t_9;
        __pyx_t_9 = 0;
        goto __pyx_L0;
      }
+332:                         asset: self.data_portal.get_adjusted_value(
            __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_adjusted_value); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 332, __pyx_L29_error)
            __Pyx_GOTREF(__pyx_t_6);
 333:                             asset,
 334:                             field,
+335:                             self._get_current_minute(),
            __pyx_t_14 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 335, __pyx_L29_error)
            __Pyx_GOTREF(__pyx_t_14);
+336:                             self.simulation_dt_func(),
            __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
            __pyx_t_12 = __pyx_v_self->simulation_dt_func; __pyx_t_13 = NULL;
            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_12))) {
              __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_12);
              if (likely(__pyx_t_13)) {
                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
                __Pyx_INCREF(__pyx_t_13);
                __Pyx_INCREF(function);
                __Pyx_DECREF_SET(__pyx_t_12, function);
              }
            }
            __pyx_t_15 = (__pyx_t_13) ? __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_13) : __Pyx_PyObject_CallNoArg(__pyx_t_12);
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 336, __pyx_L29_error)
            __Pyx_GOTREF(__pyx_t_15);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+337:                             self.data_frequency
            __pyx_t_12 = NULL;
            __pyx_t_7 = 0;
            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
              __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_6);
              if (likely(__pyx_t_12)) {
                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
                __Pyx_INCREF(__pyx_t_12);
                __Pyx_INCREF(function);
                __Pyx_DECREF_SET(__pyx_t_6, function);
                __pyx_t_7 = 1;
              }
            }
            #if CYTHON_FAST_PYCALL
            if (PyFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[6] = {__pyx_t_12, __pyx_8genexpr5__pyx_v_asset, __pyx_v_field, __pyx_t_14, __pyx_t_15, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 332, __pyx_L29_error)
              __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
            } else
            #endif
            #if CYTHON_FAST_PYCCALL
            if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
              PyObject *__pyx_temp[6] = {__pyx_t_12, __pyx_8genexpr5__pyx_v_asset, __pyx_v_field, __pyx_t_14, __pyx_t_15, __pyx_v_self->data_frequency};
              __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 332, __pyx_L29_error)
              __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
            } else
            #endif
            {
              __pyx_t_13 = PyTuple_New(5+__pyx_t_7); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 332, __pyx_L29_error)
              __Pyx_GOTREF(__pyx_t_13);
              if (__pyx_t_12) {
                __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __pyx_t_12 = NULL;
              }
              __Pyx_INCREF(__pyx_8genexpr5__pyx_v_asset);
              __Pyx_GIVEREF(__pyx_8genexpr5__pyx_v_asset);
              PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_7, __pyx_8genexpr5__pyx_v_asset);
              __Pyx_INCREF(__pyx_v_field);
              __Pyx_GIVEREF(__pyx_v_field);
              PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_7, __pyx_v_field);
              __Pyx_GIVEREF(__pyx_t_14);
              PyTuple_SET_ITEM(__pyx_t_13, 2+__pyx_t_7, __pyx_t_14);
              __Pyx_GIVEREF(__pyx_t_15);
              PyTuple_SET_ITEM(__pyx_t_13, 3+__pyx_t_7, __pyx_t_15);
              __Pyx_INCREF(__pyx_v_self->data_frequency);
              __Pyx_GIVEREF(__pyx_v_self->data_frequency);
              PyTuple_SET_ITEM(__pyx_t_13, 4+__pyx_t_7, __pyx_v_self->data_frequency);
              __pyx_t_14 = 0;
              __pyx_t_15 = 0;
              __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 332, __pyx_L29_error)
              __Pyx_GOTREF(__pyx_t_8);
              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
            }
            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
            if (unlikely(PyDict_SetItem(__pyx_t_9, (PyObject*)__pyx_8genexpr5__pyx_v_asset, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 332, __pyx_L29_error)
            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 338:                         )
+339:                         for asset in assets
          if (likely(PyList_CheckExact(__pyx_v_assets)) || PyTuple_CheckExact(__pyx_v_assets)) {
            __pyx_t_5 = __pyx_v_assets; __Pyx_INCREF(__pyx_t_5); __pyx_t_10 = 0;
            __pyx_t_11 = NULL;
          } else {
            __pyx_t_10 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_assets); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 339, __pyx_L29_error)
            __Pyx_GOTREF(__pyx_t_5);
            __pyx_t_11 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 339, __pyx_L29_error)
          }
          for (;;) {
            if (likely(!__pyx_t_11)) {
              if (likely(PyList_CheckExact(__pyx_t_5))) {
                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 339, __pyx_L29_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 339, __pyx_L29_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              } else {
                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_8); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 339, __pyx_L29_error)
                #else
                __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 339, __pyx_L29_error)
                __Pyx_GOTREF(__pyx_t_8);
                #endif
              }
            } else {
              __pyx_t_8 = __pyx_t_11(__pyx_t_5);
              if (unlikely(!__pyx_t_8)) {
                PyObject* exc_type = PyErr_Occurred();
                if (exc_type) {
                  if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                  else __PYX_ERR(0, 339, __pyx_L29_error)
                }
                break;
              }
              __Pyx_GOTREF(__pyx_t_8);
            }
            __Pyx_XDECREF_SET(__pyx_8genexpr5__pyx_v_asset, __pyx_t_8);
            __pyx_t_8 = 0;
/* … */
          }
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_XDECREF(__pyx_8genexpr5__pyx_v_asset); __pyx_8genexpr5__pyx_v_asset = 0;
          goto __pyx_L32_exit_scope;
          __pyx_L29_error:;
          __Pyx_XDECREF(__pyx_8genexpr5__pyx_v_asset); __pyx_8genexpr5__pyx_v_asset = 0;
          goto __pyx_L1_error;
          __pyx_L32_exit_scope:;
        } /* exit inner scope */
        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_data, __pyx_t_9) < 0) __PYX_ERR(0, 331, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+340:                     }, index=assets, name=fields)
        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_index, __pyx_v_assets) < 0) __PYX_ERR(0, 331, __pyx_L1_error)
        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_name_2, __pyx_v_fields) < 0) __PYX_ERR(0, 331, __pyx_L1_error)
 341: 
 342:             else:
 343:                 # both assets and fields are iterable
+344:                 data = {}
    /*else*/ {
      __pyx_t_9 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 344, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_v_data = ((PyObject*)__pyx_t_9);
      __pyx_t_9 = 0;
 345: 
+346:                 if not self._adjust_minutes:
      __pyx_t_2 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 346, __pyx_L1_error)
      __pyx_t_3 = ((!__pyx_t_2) != 0);
      if (__pyx_t_3) {
/* … */
        goto __pyx_L33;
      }
+347:                     for field in fields:
        if (likely(PyList_CheckExact(__pyx_v_fields)) || PyTuple_CheckExact(__pyx_v_fields)) {
          __pyx_t_9 = __pyx_v_fields; __Pyx_INCREF(__pyx_t_9); __pyx_t_10 = 0;
          __pyx_t_11 = NULL;
        } else {
          __pyx_t_10 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_v_fields); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 347, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_9);
          __pyx_t_11 = Py_TYPE(__pyx_t_9)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 347, __pyx_L1_error)
        }
        for (;;) {
          if (likely(!__pyx_t_11)) {
            if (likely(PyList_CheckExact(__pyx_t_9))) {
              if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_9)) break;
              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 347, __pyx_L1_error)
              #else
              __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 347, __pyx_L1_error)
              __Pyx_GOTREF(__pyx_t_1);
              #endif
            } else {
              if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 347, __pyx_L1_error)
              #else
              __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 347, __pyx_L1_error)
              __Pyx_GOTREF(__pyx_t_1);
              #endif
            }
          } else {
            __pyx_t_1 = __pyx_t_11(__pyx_t_9);
            if (unlikely(!__pyx_t_1)) {
              PyObject* exc_type = PyErr_Occurred();
              if (exc_type) {
                if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                else __PYX_ERR(0, 347, __pyx_L1_error)
              }
              break;
            }
            __Pyx_GOTREF(__pyx_t_1);
          }
          __Pyx_XDECREF_SET(__pyx_v_field, __pyx_t_1);
          __pyx_t_1 = 0;
/* … */
        }
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+348:                         series = pd.Series(data={
          __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pd); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 348, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          { /* enter inner scope */
            __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 348, __pyx_L38_error)
            __Pyx_GOTREF(__pyx_t_5);
/* … */
          __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 348, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_XDECREF_SET(__pyx_v_series, __pyx_t_5);
          __pyx_t_5 = 0;
+349:                             asset: self.data_portal.get_spot_value(
              __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 349, __pyx_L38_error)
              __Pyx_GOTREF(__pyx_t_13);
 350:                                 asset,
 351:                                 field,
+352:                                 self._get_current_minute(),
              __pyx_t_15 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 352, __pyx_L38_error)
              __Pyx_GOTREF(__pyx_t_15);
+353:                                 self.data_frequency
              __pyx_t_14 = NULL;
              __pyx_t_7 = 0;
              if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
                __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
                if (likely(__pyx_t_14)) {
                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
                  __Pyx_INCREF(__pyx_t_14);
                  __Pyx_INCREF(function);
                  __Pyx_DECREF_SET(__pyx_t_13, function);
                  __pyx_t_7 = 1;
                }
              }
              #if CYTHON_FAST_PYCALL
              if (PyFunction_Check(__pyx_t_13)) {
                PyObject *__pyx_temp[5] = {__pyx_t_14, __pyx_8genexpr6__pyx_v_asset, __pyx_v_field, __pyx_t_15, __pyx_v_self->data_frequency};
                __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 349, __pyx_L38_error)
                __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
              } else
              #endif
              #if CYTHON_FAST_PYCCALL
              if (__Pyx_PyFastCFunction_Check(__pyx_t_13)) {
                PyObject *__pyx_temp[5] = {__pyx_t_14, __pyx_8genexpr6__pyx_v_asset, __pyx_v_field, __pyx_t_15, __pyx_v_self->data_frequency};
                __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_7, 4+__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 349, __pyx_L38_error)
                __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
              } else
              #endif
              {
                __pyx_t_12 = PyTuple_New(4+__pyx_t_7); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 349, __pyx_L38_error)
                __Pyx_GOTREF(__pyx_t_12);
                if (__pyx_t_14) {
                  __Pyx_GIVEREF(__pyx_t_14); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_14); __pyx_t_14 = NULL;
                }
                __Pyx_INCREF(__pyx_8genexpr6__pyx_v_asset);
                __Pyx_GIVEREF(__pyx_8genexpr6__pyx_v_asset);
                PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_7, __pyx_8genexpr6__pyx_v_asset);
                __Pyx_INCREF(__pyx_v_field);
                __Pyx_GIVEREF(__pyx_v_field);
                PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_7, __pyx_v_field);
                __Pyx_GIVEREF(__pyx_t_15);
                PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_7, __pyx_t_15);
                __Pyx_INCREF(__pyx_v_self->data_frequency);
                __Pyx_GIVEREF(__pyx_v_self->data_frequency);
                PyTuple_SET_ITEM(__pyx_t_12, 3+__pyx_t_7, __pyx_v_self->data_frequency);
                __pyx_t_15 = 0;
                __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_12, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 349, __pyx_L38_error)
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
              }
              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
              if (unlikely(PyDict_SetItem(__pyx_t_5, (PyObject*)__pyx_8genexpr6__pyx_v_asset, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 349, __pyx_L38_error)
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 354:                             )
+355:                             for asset in assets
            if (likely(PyList_CheckExact(__pyx_v_assets)) || PyTuple_CheckExact(__pyx_v_assets)) {
              __pyx_t_8 = __pyx_v_assets; __Pyx_INCREF(__pyx_t_8); __pyx_t_16 = 0;
              __pyx_t_17 = NULL;
            } else {
              __pyx_t_16 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_assets); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 355, __pyx_L38_error)
              __Pyx_GOTREF(__pyx_t_8);
              __pyx_t_17 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 355, __pyx_L38_error)
            }
            for (;;) {
              if (likely(!__pyx_t_17)) {
                if (likely(PyList_CheckExact(__pyx_t_8))) {
                  if (__pyx_t_16 >= PyList_GET_SIZE(__pyx_t_8)) break;
                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                  __pyx_t_6 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_16); __Pyx_INCREF(__pyx_t_6); __pyx_t_16++; if (unlikely(0 < 0)) __PYX_ERR(0, 355, __pyx_L38_error)
                  #else
                  __pyx_t_6 = PySequence_ITEM(__pyx_t_8, __pyx_t_16); __pyx_t_16++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 355, __pyx_L38_error)
                  __Pyx_GOTREF(__pyx_t_6);
                  #endif
                } else {
                  if (__pyx_t_16 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                  __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_16); __Pyx_INCREF(__pyx_t_6); __pyx_t_16++; if (unlikely(0 < 0)) __PYX_ERR(0, 355, __pyx_L38_error)
                  #else
                  __pyx_t_6 = PySequence_ITEM(__pyx_t_8, __pyx_t_16); __pyx_t_16++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 355, __pyx_L38_error)
                  __Pyx_GOTREF(__pyx_t_6);
                  #endif
                }
              } else {
                __pyx_t_6 = __pyx_t_17(__pyx_t_8);
                if (unlikely(!__pyx_t_6)) {
                  PyObject* exc_type = PyErr_Occurred();
                  if (exc_type) {
                    if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                    else __PYX_ERR(0, 355, __pyx_L38_error)
                  }
                  break;
                }
                __Pyx_GOTREF(__pyx_t_6);
              }
              __Pyx_XDECREF_SET(__pyx_8genexpr6__pyx_v_asset, __pyx_t_6);
              __pyx_t_6 = 0;
/* … */
            }
            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
            __Pyx_XDECREF(__pyx_8genexpr6__pyx_v_asset); __pyx_8genexpr6__pyx_v_asset = 0;
            goto __pyx_L41_exit_scope;
            __pyx_L38_error:;
            __Pyx_XDECREF(__pyx_8genexpr6__pyx_v_asset); __pyx_8genexpr6__pyx_v_asset = 0;
            goto __pyx_L1_error;
            __pyx_L41_exit_scope:;
          } /* exit inner scope */
          if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_data, __pyx_t_5) < 0) __PYX_ERR(0, 348, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+356:                         }, index=assets, name=field)
          if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_index, __pyx_v_assets) < 0) __PYX_ERR(0, 348, __pyx_L1_error)
          if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_name_2, __pyx_v_field) < 0) __PYX_ERR(0, 348, __pyx_L1_error)
+357:                         data[field] = series
          if (unlikely(PyDict_SetItem(__pyx_v_data, __pyx_v_field, __pyx_v_series) < 0)) __PYX_ERR(0, 357, __pyx_L1_error)
 358:                 else:
+359:                     for field in fields:
      /*else*/ {
        if (likely(PyList_CheckExact(__pyx_v_fields)) || PyTuple_CheckExact(__pyx_v_fields)) {
          __pyx_t_9 = __pyx_v_fields; __Pyx_INCREF(__pyx_t_9); __pyx_t_10 = 0;
          __pyx_t_11 = NULL;
        } else {
          __pyx_t_10 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_v_fields); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 359, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_9);
          __pyx_t_11 = Py_TYPE(__pyx_t_9)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 359, __pyx_L1_error)
        }
        for (;;) {
          if (likely(!__pyx_t_11)) {
            if (likely(PyList_CheckExact(__pyx_t_9))) {
              if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_9)) break;
              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
              __pyx_t_5 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_10); __Pyx_INCREF(__pyx_t_5); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 359, __pyx_L1_error)
              #else
              __pyx_t_5 = PySequence_ITEM(__pyx_t_9, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 359, __pyx_L1_error)
              __Pyx_GOTREF(__pyx_t_5);
              #endif
            } else {
              if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
              __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_10); __Pyx_INCREF(__pyx_t_5); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 359, __pyx_L1_error)
              #else
              __pyx_t_5 = PySequence_ITEM(__pyx_t_9, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 359, __pyx_L1_error)
              __Pyx_GOTREF(__pyx_t_5);
              #endif
            }
          } else {
            __pyx_t_5 = __pyx_t_11(__pyx_t_9);
            if (unlikely(!__pyx_t_5)) {
              PyObject* exc_type = PyErr_Occurred();
              if (exc_type) {
                if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                else __PYX_ERR(0, 359, __pyx_L1_error)
              }
              break;
            }
            __Pyx_GOTREF(__pyx_t_5);
          }
          __Pyx_XDECREF_SET(__pyx_v_field, __pyx_t_5);
          __pyx_t_5 = 0;
/* … */
        }
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      }
      __pyx_L33:;
+360:                         series = pd.Series(data={
          __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pd); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 360, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Series); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 360, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __pyx_t_5 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 360, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          { /* enter inner scope */
            __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 360, __pyx_L46_error)
            __Pyx_GOTREF(__pyx_t_4);
/* … */
          __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 360, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_XDECREF_SET(__pyx_v_series, __pyx_t_4);
          __pyx_t_4 = 0;
+361:                             asset: self.data_portal.get_adjusted_value(
              __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_adjusted_value); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 361, __pyx_L46_error)
              __Pyx_GOTREF(__pyx_t_13);
 362:                                 asset,
 363:                                 field,
+364:                                 self._get_current_minute(),
              __pyx_t_12 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 364, __pyx_L46_error)
              __Pyx_GOTREF(__pyx_t_12);
+365:                                 self.simulation_dt_func(),
              __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
              __pyx_t_14 = __pyx_v_self->simulation_dt_func; __pyx_t_18 = NULL;
              if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_14))) {
                __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_14);
                if (likely(__pyx_t_18)) {
                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14);
                  __Pyx_INCREF(__pyx_t_18);
                  __Pyx_INCREF(function);
                  __Pyx_DECREF_SET(__pyx_t_14, function);
                }
              }
              __pyx_t_15 = (__pyx_t_18) ? __Pyx_PyObject_CallOneArg(__pyx_t_14, __pyx_t_18) : __Pyx_PyObject_CallNoArg(__pyx_t_14);
              __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
              if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 365, __pyx_L46_error)
              __Pyx_GOTREF(__pyx_t_15);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+366:                                 self.data_frequency
              __pyx_t_14 = NULL;
              __pyx_t_7 = 0;
              if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
                __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
                if (likely(__pyx_t_14)) {
                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
                  __Pyx_INCREF(__pyx_t_14);
                  __Pyx_INCREF(function);
                  __Pyx_DECREF_SET(__pyx_t_13, function);
                  __pyx_t_7 = 1;
                }
              }
              #if CYTHON_FAST_PYCALL
              if (PyFunction_Check(__pyx_t_13)) {
                PyObject *__pyx_temp[6] = {__pyx_t_14, __pyx_8genexpr7__pyx_v_asset, __pyx_v_field, __pyx_t_12, __pyx_t_15, __pyx_v_self->data_frequency};
                __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 361, __pyx_L46_error)
                __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
              } else
              #endif
              #if CYTHON_FAST_PYCCALL
              if (__Pyx_PyFastCFunction_Check(__pyx_t_13)) {
                PyObject *__pyx_temp[6] = {__pyx_t_14, __pyx_8genexpr7__pyx_v_asset, __pyx_v_field, __pyx_t_12, __pyx_t_15, __pyx_v_self->data_frequency};
                __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_7, 5+__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 361, __pyx_L46_error)
                __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
              } else
              #endif
              {
                __pyx_t_18 = PyTuple_New(5+__pyx_t_7); if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 361, __pyx_L46_error)
                __Pyx_GOTREF(__pyx_t_18);
                if (__pyx_t_14) {
                  __Pyx_GIVEREF(__pyx_t_14); PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_14); __pyx_t_14 = NULL;
                }
                __Pyx_INCREF(__pyx_8genexpr7__pyx_v_asset);
                __Pyx_GIVEREF(__pyx_8genexpr7__pyx_v_asset);
                PyTuple_SET_ITEM(__pyx_t_18, 0+__pyx_t_7, __pyx_8genexpr7__pyx_v_asset);
                __Pyx_INCREF(__pyx_v_field);
                __Pyx_GIVEREF(__pyx_v_field);
                PyTuple_SET_ITEM(__pyx_t_18, 1+__pyx_t_7, __pyx_v_field);
                __Pyx_GIVEREF(__pyx_t_12);
                PyTuple_SET_ITEM(__pyx_t_18, 2+__pyx_t_7, __pyx_t_12);
                __Pyx_GIVEREF(__pyx_t_15);
                PyTuple_SET_ITEM(__pyx_t_18, 3+__pyx_t_7, __pyx_t_15);
                __Pyx_INCREF(__pyx_v_self->data_frequency);
                __Pyx_GIVEREF(__pyx_v_self->data_frequency);
                PyTuple_SET_ITEM(__pyx_t_18, 4+__pyx_t_7, __pyx_v_self->data_frequency);
                __pyx_t_12 = 0;
                __pyx_t_15 = 0;
                __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_18, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 361, __pyx_L46_error)
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
              }
              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
              if (unlikely(PyDict_SetItem(__pyx_t_4, (PyObject*)__pyx_8genexpr7__pyx_v_asset, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 361, __pyx_L46_error)
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 367:                             )
+368:                             for asset in assets
            if (likely(PyList_CheckExact(__pyx_v_assets)) || PyTuple_CheckExact(__pyx_v_assets)) {
              __pyx_t_8 = __pyx_v_assets; __Pyx_INCREF(__pyx_t_8); __pyx_t_16 = 0;
              __pyx_t_17 = NULL;
            } else {
              __pyx_t_16 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_assets); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 368, __pyx_L46_error)
              __Pyx_GOTREF(__pyx_t_8);
              __pyx_t_17 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 368, __pyx_L46_error)
            }
            for (;;) {
              if (likely(!__pyx_t_17)) {
                if (likely(PyList_CheckExact(__pyx_t_8))) {
                  if (__pyx_t_16 >= PyList_GET_SIZE(__pyx_t_8)) break;
                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                  __pyx_t_6 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_16); __Pyx_INCREF(__pyx_t_6); __pyx_t_16++; if (unlikely(0 < 0)) __PYX_ERR(0, 368, __pyx_L46_error)
                  #else
                  __pyx_t_6 = PySequence_ITEM(__pyx_t_8, __pyx_t_16); __pyx_t_16++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 368, __pyx_L46_error)
                  __Pyx_GOTREF(__pyx_t_6);
                  #endif
                } else {
                  if (__pyx_t_16 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
                  __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_16); __Pyx_INCREF(__pyx_t_6); __pyx_t_16++; if (unlikely(0 < 0)) __PYX_ERR(0, 368, __pyx_L46_error)
                  #else
                  __pyx_t_6 = PySequence_ITEM(__pyx_t_8, __pyx_t_16); __pyx_t_16++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 368, __pyx_L46_error)
                  __Pyx_GOTREF(__pyx_t_6);
                  #endif
                }
              } else {
                __pyx_t_6 = __pyx_t_17(__pyx_t_8);
                if (unlikely(!__pyx_t_6)) {
                  PyObject* exc_type = PyErr_Occurred();
                  if (exc_type) {
                    if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                    else __PYX_ERR(0, 368, __pyx_L46_error)
                  }
                  break;
                }
                __Pyx_GOTREF(__pyx_t_6);
              }
              __Pyx_XDECREF_SET(__pyx_8genexpr7__pyx_v_asset, __pyx_t_6);
              __pyx_t_6 = 0;
/* … */
            }
            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
            __Pyx_XDECREF(__pyx_8genexpr7__pyx_v_asset); __pyx_8genexpr7__pyx_v_asset = 0;
            goto __pyx_L49_exit_scope;
            __pyx_L46_error:;
            __Pyx_XDECREF(__pyx_8genexpr7__pyx_v_asset); __pyx_8genexpr7__pyx_v_asset = 0;
            goto __pyx_L1_error;
            __pyx_L49_exit_scope:;
          } /* exit inner scope */
          if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_data, __pyx_t_4) < 0) __PYX_ERR(0, 360, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+369:                         }, index=assets, name=field)
          if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_index, __pyx_v_assets) < 0) __PYX_ERR(0, 360, __pyx_L1_error)
          if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_name_2, __pyx_v_field) < 0) __PYX_ERR(0, 360, __pyx_L1_error)
+370:                         data[field] = series
          if (unlikely(PyDict_SetItem(__pyx_v_data, __pyx_v_field, __pyx_v_series) < 0)) __PYX_ERR(0, 370, __pyx_L1_error)
 371: 
+372:                 return pd.DataFrame(data)
      __Pyx_XDECREF(__pyx_r);
      __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pd); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 372, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_DataFrame); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 372, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      __pyx_t_9 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_4, __pyx_v_data) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_data);
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 372, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_r = __pyx_t_9;
      __pyx_t_9 = 0;
      goto __pyx_L0;
    }
  }
 373: 
+374:     @check_parameters(('continuous_future',),
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 374, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7zipline_9_protocol_check_parameters), __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 374, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_n_u_continuous_future); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 374, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
+375:                       (ContinuousFuture,))
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ContinuousFuture); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
  __pyx_t_4 = 0;
+376:     def current_chain(self, continuous_future):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_5current_chain(PyObject *__pyx_v_self, PyObject *__pyx_v_continuous_future); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_5current_chain(PyObject *__pyx_v_self, PyObject *__pyx_v_continuous_future) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("current_chain (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_4current_chain(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), ((PyObject *)__pyx_v_continuous_future));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_4current_chain(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_continuous_future) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("current_chain", 0);
  __Pyx_TraceCall("current_chain", __pyx_f[0], 376, 0, __PYX_ERR(0, 376, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("zipline._protocol.BarData.current_chain", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_4, (PyObject *)__pyx_ptype_7zipline_9_protocol_BarData, __pyx_n_s_current_chain); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 374, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7zipline_9_protocol_BarData->tp_dict, __pyx_n_s_current_chain, __pyx_t_3) < 0) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  PyType_Modified(__pyx_ptype_7zipline_9_protocol_BarData);
+377:         return self.data_portal.get_current_future_chain(
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_current_future_chain); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
 378:             continuous_future,
+379:             self.simulation_dt_func())
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_4 = __pyx_v_self->simulation_dt_func; __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5) : __Pyx_PyObject_CallNoArg(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 379, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  __pyx_t_6 = 0;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_6 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_continuous_future, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 377, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_continuous_future, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 377, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else
  #endif
  {
    __pyx_t_5 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 377, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (__pyx_t_4) {
      __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    }
    __Pyx_INCREF(__pyx_v_continuous_future);
    __Pyx_GIVEREF(__pyx_v_continuous_future);
    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_6, __pyx_v_continuous_future);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_6, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 377, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 380: 
+381:     @check_parameters(('assets',), (Asset,))
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7zipline_9_protocol_check_parameters), __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_tuple__25 = PyTuple_Pack(1, __pyx_n_u_assets); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
+382:     def can_trade(self, assets):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_7can_trade(PyObject *__pyx_v_self, PyObject *__pyx_v_assets); /*proto*/
static char __pyx_doc_7zipline_9_protocol_7BarData_6can_trade[] = "\n        For the given asset or iterable of assets, returns True if all of the\n        following are true:\n\n        1. The asset is alive for the session of the current simulation time\n           (if current simulation time is not a market minute, we use the next\n           session).\n        2. The asset's exchange is open at the current simulation time or at\n           the simulation calendar's next market minute.\n        3. There is a known last price for the asset.\n\n        Parameters\n        ----------\n        assets: zipline.assets.Asset or iterable of zipline.assets.Asset\n            Asset(s) for which tradability should be determined.\n\n        Notes\n        -----\n        The second condition above warrants some further explanation:\n\n        - If the asset's exchange calendar is identical to the simulation\n          calendar, then this condition always returns True.\n        - If there are market minutes in the simulation calendar outside of\n          this asset's exchange's trading hours (for example, if the simulation\n          is running on the CMES calendar but the asset is MSFT, which trades\n          on the NYSE), during those minutes, this condition will return False\n          (for example, 3:15 am Eastern on a weekday, during which the CMES is\n          open but the NYSE is closed).\n\n        Returns\n        -------\n        can_trade : bool or pd.Series[bool]\n            Bool or series of bools indicating whether the requested asset(s)\n            can be traded in the current minute.\n        ";
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_7can_trade(PyObject *__pyx_v_self, PyObject *__pyx_v_assets) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("can_trade (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_6can_trade(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), ((PyObject *)__pyx_v_assets));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_6can_trade(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_assets) {
  PyObject *__pyx_v_dt = NULL;
  PyObject *__pyx_v_adjusted_dt = NULL;
  PyObject *__pyx_v_data_portal = NULL;
  PyObject *__pyx_v_tradeable = NULL;
  PyObject *__pyx_8genexpr8__pyx_v_asset = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("can_trade", 0);
  __Pyx_TraceCall("can_trade", __pyx_f[0], 382, 0, __PYX_ERR(0, 382, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("zipline._protocol.BarData.can_trade", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dt);
  __Pyx_XDECREF(__pyx_v_adjusted_dt);
  __Pyx_XDECREF(__pyx_v_data_portal);
  __Pyx_XDECREF(__pyx_v_tradeable);
  __Pyx_XDECREF(__pyx_8genexpr8__pyx_v_asset);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_4, (PyObject *)__pyx_ptype_7zipline_9_protocol_BarData, __pyx_n_s_can_trade); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7zipline_9_protocol_BarData->tp_dict, __pyx_n_s_can_trade, __pyx_t_3) < 0) __PYX_ERR(0, 382, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  PyType_Modified(__pyx_ptype_7zipline_9_protocol_BarData);
 383:         """
 384:         For the given asset or iterable of assets, returns True if all of the
 385:         following are true:
 386: 
 387:         1. The asset is alive for the session of the current simulation time
 388:            (if current simulation time is not a market minute, we use the next
 389:            session).
 390:         2. The asset's exchange is open at the current simulation time or at
 391:            the simulation calendar's next market minute.
 392:         3. There is a known last price for the asset.
 393: 
 394:         Parameters
 395:         ----------
 396:         assets: zipline.assets.Asset or iterable of zipline.assets.Asset
 397:             Asset(s) for which tradability should be determined.
 398: 
 399:         Notes
 400:         -----
 401:         The second condition above warrants some further explanation:
 402: 
 403:         - If the asset's exchange calendar is identical to the simulation
 404:           calendar, then this condition always returns True.
 405:         - If there are market minutes in the simulation calendar outside of
 406:           this asset's exchange's trading hours (for example, if the simulation
 407:           is running on the CMES calendar but the asset is MSFT, which trades
 408:           on the NYSE), during those minutes, this condition will return False
 409:           (for example, 3:15 am Eastern on a weekday, during which the CMES is
 410:           open but the NYSE is closed).
 411: 
 412:         Returns
 413:         -------
 414:         can_trade : bool or pd.Series[bool]
 415:             Bool or series of bools indicating whether the requested asset(s)
 416:             can be traded in the current minute.
 417:         """
+418:         dt = self.simulation_dt_func()
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_2 = __pyx_v_self->simulation_dt_func; __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_dt = __pyx_t_1;
  __pyx_t_1 = 0;
 419: 
+420:         if self._adjust_minutes:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 420, __pyx_L1_error)
  if (__pyx_t_4) {
/* … */
    goto __pyx_L3;
  }
+421:             adjusted_dt = self._get_current_minute()
    __pyx_t_1 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 421, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_adjusted_dt = __pyx_t_1;
    __pyx_t_1 = 0;
 422:         else:
+423:             adjusted_dt = dt
  /*else*/ {
    __Pyx_INCREF(__pyx_v_dt);
    __pyx_v_adjusted_dt = __pyx_v_dt;
  }
  __pyx_L3:;
 424: 
+425:         data_portal = self.data_portal
  __pyx_t_1 = __pyx_v_self->data_portal;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_data_portal = __pyx_t_1;
  __pyx_t_1 = 0;
 426: 
+427:         if isinstance(assets, Asset):
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_assets, __pyx_ptype_7zipline_6assets_7_assets_Asset); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (__pyx_t_5) {
/* … */
  }
+428:             return self._can_trade_for_asset(
    __Pyx_XDECREF(__pyx_r);
/* … */
    __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_can_trade_for_asset(__pyx_v_self, __pyx_v_assets, __pyx_v_dt, __pyx_v_adjusted_dt, __pyx_v_data_portal)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 428, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 429:                 assets, dt, adjusted_dt, data_portal
 430:             )
 431:         else:
+432:             tradeable = [
  /*else*/ {
    { /* enter inner scope */
      __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 432, __pyx_L7_error)
      __Pyx_GOTREF(__pyx_t_1);
+433:                 self._can_trade_for_asset(
        __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_can_trade_for_asset(__pyx_v_self, __pyx_8genexpr8__pyx_v_asset, __pyx_v_dt, __pyx_v_adjusted_dt, __pyx_v_data_portal)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 433, __pyx_L7_error)
        __Pyx_GOTREF(__pyx_t_3);
        if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) __PYX_ERR(0, 432, __pyx_L7_error)
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 434:                     asset, dt, adjusted_dt, data_portal
 435:                 )
+436:                 for asset in assets
      if (likely(PyList_CheckExact(__pyx_v_assets)) || PyTuple_CheckExact(__pyx_v_assets)) {
        __pyx_t_2 = __pyx_v_assets; __Pyx_INCREF(__pyx_t_2); __pyx_t_6 = 0;
        __pyx_t_7 = NULL;
      } else {
        __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_assets); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 436, __pyx_L7_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_7 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 436, __pyx_L7_error)
      }
      for (;;) {
        if (likely(!__pyx_t_7)) {
          if (likely(PyList_CheckExact(__pyx_t_2))) {
            if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break;
            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 436, __pyx_L7_error)
            #else
            __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 436, __pyx_L7_error)
            __Pyx_GOTREF(__pyx_t_3);
            #endif
          } else {
            if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 436, __pyx_L7_error)
            #else
            __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 436, __pyx_L7_error)
            __Pyx_GOTREF(__pyx_t_3);
            #endif
          }
        } else {
          __pyx_t_3 = __pyx_t_7(__pyx_t_2);
          if (unlikely(!__pyx_t_3)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else __PYX_ERR(0, 436, __pyx_L7_error)
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_3);
        }
        __Pyx_XDECREF_SET(__pyx_8genexpr8__pyx_v_asset, __pyx_t_3);
        __pyx_t_3 = 0;
/* … */
      }
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_XDECREF(__pyx_8genexpr8__pyx_v_asset); __pyx_8genexpr8__pyx_v_asset = 0;
      goto __pyx_L10_exit_scope;
      __pyx_L7_error:;
      __Pyx_XDECREF(__pyx_8genexpr8__pyx_v_asset); __pyx_8genexpr8__pyx_v_asset = 0;
      goto __pyx_L1_error;
      __pyx_L10_exit_scope:;
    } /* exit inner scope */
    __pyx_v_tradeable = ((PyObject*)__pyx_t_1);
    __pyx_t_1 = 0;
 437:             ]
+438:             return pd.Series(data=tradeable, index=assets, dtype=bool)
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pd); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 438, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 438, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 438, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_data, __pyx_v_tradeable) < 0) __PYX_ERR(0, 438, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_index, __pyx_v_assets) < 0) __PYX_ERR(0, 438, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, ((PyObject *)__pyx_ptype_7cpython_4bool_bool)) < 0) __PYX_ERR(0, 438, __pyx_L1_error)
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 438, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }
 439: 
+440:     cdef bool _can_trade_for_asset(self, asset, dt, adjusted_dt, data_portal):
static PyBoolObject *__pyx_f_7zipline_9_protocol_7BarData__can_trade_for_asset(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_asset, PyObject *__pyx_v_dt, PyObject *__pyx_v_adjusted_dt, PyObject *__pyx_v_data_portal) {
  PyObject *__pyx_v_session_label = 0;
  PyObject *__pyx_v_dt_to_use_for_exchange_check = 0;
  PyBoolObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_can_trade_for_asset", 0);
  __Pyx_TraceCall("_can_trade_for_asset", __pyx_f[0], 440, 0, __PYX_ERR(0, 440, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("zipline._protocol.BarData._can_trade_for_asset", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_session_label);
  __Pyx_XDECREF(__pyx_v_dt_to_use_for_exchange_check);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 441:         cdef object session_label
 442:         cdef object dt_to_use_for_exchange_check,
 443: 
+444:         if self._is_restricted(asset, adjusted_dt):
  __Pyx_INCREF(__pyx_v_self->_is_restricted);
  __pyx_t_2 = __pyx_v_self->_is_restricted; __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_asset, __pyx_v_adjusted_dt};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 444, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_asset, __pyx_v_adjusted_dt};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 444, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  {
    __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 444, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (__pyx_t_3) {
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
    }
    __Pyx_INCREF(__pyx_v_asset);
    __Pyx_GIVEREF(__pyx_v_asset);
    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_asset);
    __Pyx_INCREF(__pyx_v_adjusted_dt);
    __Pyx_GIVEREF(__pyx_v_adjusted_dt);
    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_adjusted_dt);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 444, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 444, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {
/* … */
  }
+445:             return False
    __Pyx_XDECREF(((PyObject *)__pyx_r));
    __Pyx_INCREF(Py_False);
    __pyx_r = ((PyBoolObject *)Py_False);
    goto __pyx_L0;
 446: 
+447:         session_label = self._trading_calendar.minute_to_session_label(dt)
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_trading_calendar, __pyx_n_s_minute_to_session_label); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 447, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_v_dt) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_dt);
  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 447, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_session_label = __pyx_t_1;
  __pyx_t_1 = 0;
 448: 
+449:         if not asset.is_alive_for_session(session_label):
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_asset, __pyx_n_s_is_alive_for_session); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 449, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_v_session_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_session_label);
  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 449, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 449, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_7 = ((!__pyx_t_6) != 0);
  if (__pyx_t_7) {
/* … */
  }
 450:             # asset isn't alive
+451:             return False
    __Pyx_XDECREF(((PyObject *)__pyx_r));
    __Pyx_INCREF(Py_False);
    __pyx_r = ((PyBoolObject *)Py_False);
    goto __pyx_L0;
 452: 
+453:         if asset.auto_close_date and session_label > asset.auto_close_date:
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_asset, __pyx_n_s_auto_close_date); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {
  } else {
    __pyx_t_7 = __pyx_t_6;
    goto __pyx_L6_bool_binop_done;
  }
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_asset, __pyx_n_s_auto_close_date); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_session_label, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_7 = __pyx_t_6;
  __pyx_L6_bool_binop_done:;
  if (__pyx_t_7) {
/* … */
  }
+454:             return False
    __Pyx_XDECREF(((PyObject *)__pyx_r));
    __Pyx_INCREF(Py_False);
    __pyx_r = ((PyBoolObject *)Py_False);
    goto __pyx_L0;
 455: 
+456:         if not self._daily_mode:
  __pyx_t_7 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_daily_mode)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 456, __pyx_L1_error)
  __pyx_t_6 = ((!__pyx_t_7) != 0);
  if (__pyx_t_6) {
/* … */
  }
 457:             # Find the next market minute for this calendar, and check if this
 458:             # asset's exchange is open at that minute.
+459:             if self._trading_calendar.is_open_on_minute(dt):
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_trading_calendar, __pyx_n_s_is_open_on_minute); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
      }
    }
    __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v_dt) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_dt);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_6) {
/* … */
      goto __pyx_L9;
    }
+460:                 dt_to_use_for_exchange_check = dt
      __Pyx_INCREF(__pyx_v_dt);
      __pyx_v_dt_to_use_for_exchange_check = __pyx_v_dt;
 461:             else:
 462:                 dt_to_use_for_exchange_check = \
+463:                     self._trading_calendar.next_open(dt)
    /*else*/ {
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_trading_calendar, __pyx_n_s_next_open); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 463, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_5 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) {
        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
        if (likely(__pyx_t_5)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_5);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_1, function);
        }
      }
      __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v_dt) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_dt);
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 463, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_dt_to_use_for_exchange_check = __pyx_t_2;
      __pyx_t_2 = 0;
    }
    __pyx_L9:;
 464: 
+465:             if not asset.is_exchange_open(dt_to_use_for_exchange_check):
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_asset, __pyx_n_s_is_exchange_open); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
      }
    }
    __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v_dt_to_use_for_exchange_check) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_dt_to_use_for_exchange_check);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 465, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 465, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_7 = ((!__pyx_t_6) != 0);
    if (__pyx_t_7) {
/* … */
    }
+466:                 return False
      __Pyx_XDECREF(((PyObject *)__pyx_r));
      __Pyx_INCREF(Py_False);
      __pyx_r = ((PyBoolObject *)Py_False);
      goto __pyx_L0;
 467: 
 468:         # is there a last price?
+469:         return not np.isnan(
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_isnan); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 469, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 469, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyBool_FromLong((!__pyx_t_7)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 469, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_7cpython_4bool_bool)))) __PYX_ERR(0, 469, __pyx_L1_error)
  __pyx_r = ((PyBoolObject *)__pyx_t_2);
  __pyx_t_2 = 0;
  goto __pyx_L0;
+470:             data_portal.get_spot_value(
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
+471:                 asset, "price", adjusted_dt, self.data_frequency
  __pyx_t_8 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_8)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_4 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_3)) {
    PyObject *__pyx_temp[5] = {__pyx_t_8, __pyx_v_asset, __pyx_n_u_price, __pyx_v_adjusted_dt, __pyx_v_self->data_frequency};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 4+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
    PyObject *__pyx_temp[5] = {__pyx_t_8, __pyx_v_asset, __pyx_n_u_price, __pyx_v_adjusted_dt, __pyx_v_self->data_frequency};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 4+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  {
    __pyx_t_9 = PyTuple_New(4+__pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 470, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__pyx_t_8) {
      __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); __pyx_t_8 = NULL;
    }
    __Pyx_INCREF(__pyx_v_asset);
    __Pyx_GIVEREF(__pyx_v_asset);
    PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_4, __pyx_v_asset);
    __Pyx_INCREF(__pyx_n_u_price);
    __Pyx_GIVEREF(__pyx_n_u_price);
    PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_4, __pyx_n_u_price);
    __Pyx_INCREF(__pyx_v_adjusted_dt);
    __Pyx_GIVEREF(__pyx_v_adjusted_dt);
    PyTuple_SET_ITEM(__pyx_t_9, 2+__pyx_t_4, __pyx_v_adjusted_dt);
    __Pyx_INCREF(__pyx_v_self->data_frequency);
    __Pyx_GIVEREF(__pyx_v_self->data_frequency);
    PyTuple_SET_ITEM(__pyx_t_9, 3+__pyx_t_4, __pyx_v_self->data_frequency);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 469, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 472:             )
 473:         )
 474: 
+475:     @check_parameters(('assets',), (Asset,))
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7zipline_9_protocol_check_parameters), __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+476:     def is_stale(self, assets):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_9is_stale(PyObject *__pyx_v_self, PyObject *__pyx_v_assets); /*proto*/
static char __pyx_doc_7zipline_9_protocol_7BarData_8is_stale[] = "\n        For the given asset or iterable of assets, returns True if the asset\n        is alive and there is no trade data for the current simulation time.\n\n        If the asset has never traded, returns False.\n\n        If the current simulation time is not a valid market time, we use the\n        current time to check if the asset is alive, but we use the last\n        market minute/day for the trade data check.\n\n        Parameters\n        ----------\n        assets: zipline.assets.Asset or iterable of zipline.assets.Asset\n            Asset(s) for which staleness should be determined.\n\n        Returns\n        -------\n        is_stale : bool or pd.Series[bool]\n            Bool or series of bools indicating whether the requested asset(s)\n            are stale.\n        ";
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_9is_stale(PyObject *__pyx_v_self, PyObject *__pyx_v_assets) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_stale (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_8is_stale(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), ((PyObject *)__pyx_v_assets));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_8is_stale(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_assets) {
  PyObject *__pyx_v_dt = NULL;
  PyObject *__pyx_v_adjusted_dt = NULL;
  PyObject *__pyx_v_data_portal = NULL;
  PyObject *__pyx_8genexpr9__pyx_v_asset = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_stale", 0);
  __Pyx_TraceCall("is_stale", __pyx_f[0], 476, 0, __PYX_ERR(0, 476, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("zipline._protocol.BarData.is_stale", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dt);
  __Pyx_XDECREF(__pyx_v_adjusted_dt);
  __Pyx_XDECREF(__pyx_v_data_portal);
  __Pyx_XDECREF(__pyx_8genexpr9__pyx_v_asset);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_4, (PyObject *)__pyx_ptype_7zipline_9_protocol_BarData, __pyx_n_s_is_stale); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 476, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7zipline_9_protocol_BarData->tp_dict, __pyx_n_s_is_stale, __pyx_t_3) < 0) __PYX_ERR(0, 476, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  PyType_Modified(__pyx_ptype_7zipline_9_protocol_BarData);
 477:         """
 478:         For the given asset or iterable of assets, returns True if the asset
 479:         is alive and there is no trade data for the current simulation time.
 480: 
 481:         If the asset has never traded, returns False.
 482: 
 483:         If the current simulation time is not a valid market time, we use the
 484:         current time to check if the asset is alive, but we use the last
 485:         market minute/day for the trade data check.
 486: 
 487:         Parameters
 488:         ----------
 489:         assets: zipline.assets.Asset or iterable of zipline.assets.Asset
 490:             Asset(s) for which staleness should be determined.
 491: 
 492:         Returns
 493:         -------
 494:         is_stale : bool or pd.Series[bool]
 495:             Bool or series of bools indicating whether the requested asset(s)
 496:             are stale.
 497:         """
+498:         dt = self.simulation_dt_func()
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_2 = __pyx_v_self->simulation_dt_func; __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_dt = __pyx_t_1;
  __pyx_t_1 = 0;
+499:         if self._adjust_minutes:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 499, __pyx_L1_error)
  if (__pyx_t_4) {
/* … */
    goto __pyx_L3;
  }
+500:             adjusted_dt = self._get_current_minute()
    __pyx_t_1 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 500, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_adjusted_dt = __pyx_t_1;
    __pyx_t_1 = 0;
 501:         else:
+502:             adjusted_dt = dt
  /*else*/ {
    __Pyx_INCREF(__pyx_v_dt);
    __pyx_v_adjusted_dt = __pyx_v_dt;
  }
  __pyx_L3:;
 503: 
+504:         data_portal = self.data_portal
  __pyx_t_1 = __pyx_v_self->data_portal;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_data_portal = __pyx_t_1;
  __pyx_t_1 = 0;
 505: 
+506:         if isinstance(assets, Asset):
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_assets, __pyx_ptype_7zipline_6assets_7_assets_Asset); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (__pyx_t_5) {
/* … */
  }
+507:             return self._is_stale_for_asset(
    __Pyx_XDECREF(__pyx_r);
/* … */
    __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_is_stale_for_asset(__pyx_v_self, __pyx_v_assets, __pyx_v_dt, __pyx_v_adjusted_dt, __pyx_v_data_portal)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 507, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 508:                 assets, dt, adjusted_dt, data_portal
 509:             )
 510:         else:
+511:             return pd.Series(data={
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pd); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 511, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 511, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 511, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    { /* enter inner scope */
      __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 511, __pyx_L7_error)
      __Pyx_GOTREF(__pyx_t_3);
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 511, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }
+512:                 asset: self._is_stale_for_asset(
        __pyx_t_9 = ((PyObject *)((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_is_stale_for_asset(__pyx_v_self, __pyx_8genexpr9__pyx_v_asset, __pyx_v_dt, __pyx_v_adjusted_dt, __pyx_v_data_portal)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 512, __pyx_L7_error)
        __Pyx_GOTREF(__pyx_t_9);
        if (unlikely(PyDict_SetItem(__pyx_t_3, (PyObject*)__pyx_8genexpr9__pyx_v_asset, (PyObject*)__pyx_t_9))) __PYX_ERR(0, 512, __pyx_L7_error)
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 513:                     asset, dt, adjusted_dt, data_portal
 514:                 )
+515:                 for asset in assets
      if (likely(PyList_CheckExact(__pyx_v_assets)) || PyTuple_CheckExact(__pyx_v_assets)) {
        __pyx_t_6 = __pyx_v_assets; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
        __pyx_t_8 = NULL;
      } else {
        __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_assets); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 515, __pyx_L7_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_8 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 515, __pyx_L7_error)
      }
      for (;;) {
        if (likely(!__pyx_t_8)) {
          if (likely(PyList_CheckExact(__pyx_t_6))) {
            if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
            __pyx_t_9 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 515, __pyx_L7_error)
            #else
            __pyx_t_9 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 515, __pyx_L7_error)
            __Pyx_GOTREF(__pyx_t_9);
            #endif
          } else {
            if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
            __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 515, __pyx_L7_error)
            #else
            __pyx_t_9 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 515, __pyx_L7_error)
            __Pyx_GOTREF(__pyx_t_9);
            #endif
          }
        } else {
          __pyx_t_9 = __pyx_t_8(__pyx_t_6);
          if (unlikely(!__pyx_t_9)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else __PYX_ERR(0, 515, __pyx_L7_error)
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_9);
        }
        __Pyx_XDECREF_SET(__pyx_8genexpr9__pyx_v_asset, __pyx_t_9);
        __pyx_t_9 = 0;
/* … */
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_XDECREF(__pyx_8genexpr9__pyx_v_asset); __pyx_8genexpr9__pyx_v_asset = 0;
      goto __pyx_L10_exit_scope;
      __pyx_L7_error:;
      __Pyx_XDECREF(__pyx_8genexpr9__pyx_v_asset); __pyx_8genexpr9__pyx_v_asset = 0;
      goto __pyx_L1_error;
      __pyx_L10_exit_scope:;
    } /* exit inner scope */
    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_data, __pyx_t_3) < 0) __PYX_ERR(0, 511, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 516:             })
 517: 
+518:     cdef bool _is_stale_for_asset(self, asset, dt, adjusted_dt, data_portal):
static PyBoolObject *__pyx_f_7zipline_9_protocol_7BarData__is_stale_for_asset(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_asset, PyObject *__pyx_v_dt, PyObject *__pyx_v_adjusted_dt, PyObject *__pyx_v_data_portal) {
  PyObject *__pyx_v_session_label = NULL;
  PyObject *__pyx_v_current_volume = NULL;
  PyObject *__pyx_v_last_traded_dt = NULL;
  PyBoolObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_is_stale_for_asset", 0);
  __Pyx_TraceCall("_is_stale_for_asset", __pyx_f[0], 518, 0, __PYX_ERR(0, 518, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("zipline._protocol.BarData._is_stale_for_asset", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_session_label);
  __Pyx_XDECREF(__pyx_v_current_volume);
  __Pyx_XDECREF(__pyx_v_last_traded_dt);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+519:         session_label = normalize_date(dt)  # FIXME
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_normalize_date); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_dt) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_dt);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 519, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_session_label = __pyx_t_1;
  __pyx_t_1 = 0;
 520: 
+521:         if not asset.is_alive_for_session(session_label):
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_asset, __pyx_n_s_is_alive_for_session); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 521, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_session_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_session_label);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 521, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 521, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = ((!__pyx_t_4) != 0);
  if (__pyx_t_5) {
/* … */
  }
+522:             return False
    __Pyx_XDECREF(((PyObject *)__pyx_r));
    __Pyx_INCREF(Py_False);
    __pyx_r = ((PyBoolObject *)Py_False);
    goto __pyx_L0;
 523: 
+524:         current_volume = data_portal.get_spot_value(
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 524, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
+525:             asset, "volume", adjusted_dt, self.data_frequency
  __pyx_t_3 = NULL;
  __pyx_t_6 = 0;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_6 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[5] = {__pyx_t_3, __pyx_v_asset, __pyx_n_u_volume, __pyx_v_adjusted_dt, __pyx_v_self->data_frequency};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 524, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[5] = {__pyx_t_3, __pyx_v_asset, __pyx_n_u_volume, __pyx_v_adjusted_dt, __pyx_v_self->data_frequency};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 524, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  {
    __pyx_t_7 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 524, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__pyx_t_3) {
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); __pyx_t_3 = NULL;
    }
    __Pyx_INCREF(__pyx_v_asset);
    __Pyx_GIVEREF(__pyx_v_asset);
    PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_v_asset);
    __Pyx_INCREF(__pyx_n_u_volume);
    __Pyx_GIVEREF(__pyx_n_u_volume);
    PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_n_u_volume);
    __Pyx_INCREF(__pyx_v_adjusted_dt);
    __Pyx_GIVEREF(__pyx_v_adjusted_dt);
    PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_adjusted_dt);
    __Pyx_INCREF(__pyx_v_self->data_frequency);
    __Pyx_GIVEREF(__pyx_v_self->data_frequency);
    PyTuple_SET_ITEM(__pyx_t_7, 3+__pyx_t_6, __pyx_v_self->data_frequency);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 524, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_current_volume = __pyx_t_1;
  __pyx_t_1 = 0;
 526:         )
 527: 
+528:         if current_volume > 0:
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_current_volume, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 528, __pyx_L1_error)
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 528, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_5) {
/* … */
  }
 529:             # found a current value, so we know this asset is not stale.
+530:             return False
    __Pyx_XDECREF(((PyObject *)__pyx_r));
    __Pyx_INCREF(Py_False);
    __pyx_r = ((PyBoolObject *)Py_False);
    goto __pyx_L0;
 531:         else:
 532:             # we need to distinguish between if this asset has ever traded
 533:             # (stale = True) or has never traded (stale = False)
+534:             last_traded_dt = \
  /*else*/ {
+535:                 data_portal.get_spot_value(asset, "last_traded", adjusted_dt,
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_data_portal, __pyx_n_s_get_spot_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 535, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
+536:                                            self.data_frequency)
    __pyx_t_7 = NULL;
    __pyx_t_6 = 0;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
        __pyx_t_6 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_2)) {
      PyObject *__pyx_temp[5] = {__pyx_t_7, __pyx_v_asset, __pyx_n_u_last_traded, __pyx_v_adjusted_dt, __pyx_v_self->data_frequency};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 535, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
      PyObject *__pyx_temp[5] = {__pyx_t_7, __pyx_v_asset, __pyx_n_u_last_traded, __pyx_v_adjusted_dt, __pyx_v_self->data_frequency};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 535, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    {
      __pyx_t_3 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 535, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (__pyx_t_7) {
        __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7); __pyx_t_7 = NULL;
      }
      __Pyx_INCREF(__pyx_v_asset);
      __Pyx_GIVEREF(__pyx_v_asset);
      PyTuple_SET_ITEM(__pyx_t_3, 0+__pyx_t_6, __pyx_v_asset);
      __Pyx_INCREF(__pyx_n_u_last_traded);
      __Pyx_GIVEREF(__pyx_n_u_last_traded);
      PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_6, __pyx_n_u_last_traded);
      __Pyx_INCREF(__pyx_v_adjusted_dt);
      __Pyx_GIVEREF(__pyx_v_adjusted_dt);
      PyTuple_SET_ITEM(__pyx_t_3, 2+__pyx_t_6, __pyx_v_adjusted_dt);
      __Pyx_INCREF(__pyx_v_self->data_frequency);
      __Pyx_GIVEREF(__pyx_v_self->data_frequency);
      PyTuple_SET_ITEM(__pyx_t_3, 3+__pyx_t_6, __pyx_v_self->data_frequency);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 535, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_last_traded_dt = __pyx_t_1;
    __pyx_t_1 = 0;
 537: 
+538:             return not (last_traded_dt is pd.NaT)
    __Pyx_XDECREF(((PyObject *)__pyx_r));
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pd); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 538, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_NaT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 538, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = (__pyx_v_last_traded_dt != __pyx_t_2);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 538, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (!(likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_7cpython_4bool_bool)))) __PYX_ERR(0, 538, __pyx_L1_error)
    __pyx_r = ((PyBoolObject *)__pyx_t_2);
    __pyx_t_2 = 0;
    goto __pyx_L0;
  }
 539: 
+540:     @check_parameters(('assets', 'fields', 'bar_count', 'frequency'),
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 540, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
  __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7zipline_9_protocol_check_parameters), __pyx_t_2, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 540, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_tuple__26 = PyTuple_Pack(4, __pyx_n_u_assets, __pyx_n_u_fields, __pyx_n_u_bar_count, __pyx_n_u_frequency); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 540, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);
+541:                       ((Asset, ContinuousFuture, str),
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_ContinuousFuture); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 541, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 541, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_ptype_7zipline_6assets_7_assets_Asset));
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __Pyx_INCREF(((PyObject *)(&PyUnicode_Type)));
  __Pyx_GIVEREF(((PyObject *)(&PyUnicode_Type)));
  PyTuple_SET_ITEM(__pyx_t_4, 2, ((PyObject *)(&PyUnicode_Type)));
  __pyx_t_1 = 0;
/* … */
  __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 541, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
  __Pyx_INCREF(((PyObject *)(&PyInt_Type)));
  __Pyx_GIVEREF(((PyObject *)(&PyInt_Type)));
  PyTuple_SET_ITEM(__pyx_t_5, 2, ((PyObject *)(&PyInt_Type)));
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_2);
  __pyx_t_4 = 0;
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
+542:                        (str,),
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 542, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)(&PyUnicode_Type)));
  __Pyx_GIVEREF(((PyObject *)(&PyUnicode_Type)));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)(&PyUnicode_Type)));
 543:                        int,
+544:                        (str,)))
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)(&PyUnicode_Type)));
  __Pyx_GIVEREF(((PyObject *)(&PyUnicode_Type)));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)(&PyUnicode_Type)));
+545:     def history(self, assets, fields, bar_count, frequency):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_11history(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7zipline_9_protocol_7BarData_10history[] = "\n        Returns a trailing window of length ``bar_count`` with data for\n        the given assets, fields, and frequency, adjusted for splits, dividends,\n        and mergers as of the current simulation time.\n\n        The semantics for missing data are identical to the ones described in\n        the notes for :meth:`current`.\n\n        Parameters\n        ----------\n        assets: zipline.assets.Asset or iterable of zipline.assets.Asset\n            The asset(s) for which data is requested.\n        fields: string or iterable of string.\n            Requested data field(s). Valid field names are: \"price\",\n            \"last_traded\", \"open\", \"high\", \"low\", \"close\", and \"volume\".\n        bar_count: int\n            Number of data observations requested.\n        frequency: str\n            String indicating whether to load daily or minutely data\n            observations. Pass '1m' for minutely data, '1d' for daily data.\n\n        Returns\n        -------\n        history : pd.Series or pd.DataFrame or pd.Panel\n            See notes below.\n\n        Notes\n        -----\n        The return type of this function depends on the types of ``assets`` and\n        ``fields``:\n\n        - If a single asset and a single field are requested, the returned\n          value is a :class:`pd.Series` of length ``bar_count`` whose index is\n          :class:`pd.DatetimeIndex`.\n\n        - If a single asset and multiple fields are requested, the returned\n          value is a :class:`pd.DataFrame` with shape\n          ``(bar_count, len(fields))``. The frame's index will be a\n          :class:`pd.DatetimeIndex`, and its columns will be ``fields``.\n\n        - If multiple assets and a single field are requested, the returned\n          value is a :class:`pd.DataFrame` with shape\n          ``(bar_count, len(assets))``. The frame's index will be a\n          :class:`pd.DatetimeIndex`, and its columns will be ``assets``.\n\n        - If multiple assets and m""ultiple fields are requested, the returned\n          value is a :class:`pd.DataFrame` with a pd.MultiIndex containing pairs of\n           :class:`pd.DatetimeIndex`, and ``assets``, while the columns while contain the field(s).\n           It has shape``(bar_count * len(assets), len(fields))``. The names of the pd.MultiIndex are\n            - ``date`` if frequency == '1d'`` or ``date_time`` if frequency == '1m``, and\n            - ``asset``\n\n        If the current simulation time is not a valid market time, we use the last market close instead.\n        ";
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_11history(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_assets = 0;
  PyObject *__pyx_v_fields = 0;
  PyObject *__pyx_v_bar_count = 0;
  PyObject *__pyx_v_frequency = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("history (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_assets,&__pyx_n_s_fields,&__pyx_n_s_bar_count,&__pyx_n_s_frequency,0};
    PyObject* values[4] = {0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_assets)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fields)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("history", 1, 4, 4, 1); __PYX_ERR(0, 545, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_bar_count)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("history", 1, 4, 4, 2); __PYX_ERR(0, 545, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_frequency)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("history", 1, 4, 4, 3); __PYX_ERR(0, 545, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "history") < 0)) __PYX_ERR(0, 545, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_assets = values[0];
    __pyx_v_fields = values[1];
    __pyx_v_bar_count = values[2];
    __pyx_v_frequency = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("history", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 545, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("zipline._protocol.BarData.history", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_10history(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), __pyx_v_assets, __pyx_v_fields, __pyx_v_bar_count, __pyx_v_frequency);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_10history(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_assets, PyObject *__pyx_v_fields, PyObject *__pyx_v_bar_count, PyObject *__pyx_v_frequency) {
  int __pyx_v_single_field;
  int __pyx_v_single_asset;
  PyObject *__pyx_v_asset_list = NULL;
  PyObject *__pyx_v_df = NULL;
  PyObject *__pyx_v_adjs = NULL;
  PyObject *__pyx_v_df_dict = NULL;
  PyObject *__pyx_v_dt_label = NULL;
  PyObject *__pyx_9genexpr10__pyx_v_field = NULL;
  PyObject *__pyx_9genexpr11__pyx_v_field = NULL;
  PyObject *__pyx_9genexpr12__pyx_v_field = NULL;
  PyObject *__pyx_9genexpr12__pyx_v_df = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("history", 0);
  __Pyx_TraceCall("history", __pyx_f[0], 545, 0, __PYX_ERR(0, 545, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("zipline._protocol.BarData.history", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_asset_list);
  __Pyx_XDECREF(__pyx_v_df);
  __Pyx_XDECREF(__pyx_v_adjs);
  __Pyx_XDECREF(__pyx_v_df_dict);
  __Pyx_XDECREF(__pyx_v_dt_label);
  __Pyx_XDECREF(__pyx_9genexpr10__pyx_v_field);
  __Pyx_XDECREF(__pyx_9genexpr11__pyx_v_field);
  __Pyx_XDECREF(__pyx_9genexpr12__pyx_v_field);
  __Pyx_XDECREF(__pyx_9genexpr12__pyx_v_df);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_2, (PyObject *)__pyx_ptype_7zipline_9_protocol_BarData, __pyx_n_s_history); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 545, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  __pyx_t_3 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_1, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_2);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 540, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7zipline_9_protocol_BarData->tp_dict, __pyx_n_s_history, __pyx_t_3) < 0) __PYX_ERR(0, 545, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  PyType_Modified(__pyx_ptype_7zipline_9_protocol_BarData);
 546:         """
 547:         Returns a trailing window of length ``bar_count`` with data for
 548:         the given assets, fields, and frequency, adjusted for splits, dividends,
 549:         and mergers as of the current simulation time.
 550: 
 551:         The semantics for missing data are identical to the ones described in
 552:         the notes for :meth:`current`.
 553: 
 554:         Parameters
 555:         ----------
 556:         assets: zipline.assets.Asset or iterable of zipline.assets.Asset
 557:             The asset(s) for which data is requested.
 558:         fields: string or iterable of string.
 559:             Requested data field(s). Valid field names are: "price",
 560:             "last_traded", "open", "high", "low", "close", and "volume".
 561:         bar_count: int
 562:             Number of data observations requested.
 563:         frequency: str
 564:             String indicating whether to load daily or minutely data
 565:             observations. Pass '1m' for minutely data, '1d' for daily data.
 566: 
 567:         Returns
 568:         -------
 569:         history : pd.Series or pd.DataFrame or pd.Panel
 570:             See notes below.
 571: 
 572:         Notes
 573:         -----
 574:         The return type of this function depends on the types of ``assets`` and
 575:         ``fields``:
 576: 
 577:         - If a single asset and a single field are requested, the returned
 578:           value is a :class:`pd.Series` of length ``bar_count`` whose index is
 579:           :class:`pd.DatetimeIndex`.
 580: 
 581:         - If a single asset and multiple fields are requested, the returned
 582:           value is a :class:`pd.DataFrame` with shape
 583:           ``(bar_count, len(fields))``. The frame's index will be a
 584:           :class:`pd.DatetimeIndex`, and its columns will be ``fields``.
 585: 
 586:         - If multiple assets and a single field are requested, the returned
 587:           value is a :class:`pd.DataFrame` with shape
 588:           ``(bar_count, len(assets))``. The frame's index will be a
 589:           :class:`pd.DatetimeIndex`, and its columns will be ``assets``.
 590: 
 591:         - If multiple assets and multiple fields are requested, the returned
 592:           value is a :class:`pd.DataFrame` with a pd.MultiIndex containing pairs of
 593:            :class:`pd.DatetimeIndex`, and ``assets``, while the columns while contain the field(s).
 594:            It has shape``(bar_count * len(assets), len(fields))``. The names of the pd.MultiIndex are
 595:             - ``date`` if frequency == '1d'`` or ``date_time`` if frequency == '1m``, and
 596:             - ``asset``
 597: 
 598:         If the current simulation time is not a valid market time, we use the last market close instead.
 599:         """
 600: 
+601:         single_field = isinstance(fields, str)
  __pyx_t_1 = PyUnicode_Check(__pyx_v_fields); 
  __pyx_v_single_field = __pyx_t_1;
 602: 
+603:         single_asset = isinstance(assets, PricingDataAssociable)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_PricingDataAssociable); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 603, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_assets, __pyx_t_2); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 603, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_single_asset = __pyx_t_1;
+604:         if single_asset:
  __pyx_t_1 = (__pyx_v_single_asset != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+605:             asset_list = [assets]
    __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 605, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_assets);
    __Pyx_GIVEREF(__pyx_v_assets);
    PyList_SET_ITEM(__pyx_t_2, 0, __pyx_v_assets);
    __pyx_v_asset_list = __pyx_t_2;
    __pyx_t_2 = 0;
 606:         else:
+607:             asset_list = assets
  /*else*/ {
    __Pyx_INCREF(__pyx_v_assets);
    __pyx_v_asset_list = __pyx_v_assets;
  }
  __pyx_L3:;
 608: 
+609:         if single_field:  # for one or more assets:
  __pyx_t_1 = (__pyx_v_single_field != 0);
  if (__pyx_t_1) {
/* … */
  }
+610:             df = self.data_portal.get_history_window(
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_history_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
 611:                 asset_list,
+612:                 self._get_current_minute(),
    __pyx_t_4 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 612, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
 613:                 bar_count,
 614:                 frequency,
 615:                 fields,
+616:                 self.data_frequency,
    __pyx_t_5 = NULL;
    __pyx_t_6 = 0;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_6 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[7] = {__pyx_t_5, __pyx_v_asset_list, __pyx_t_4, __pyx_v_bar_count, __pyx_v_frequency, __pyx_v_fields, __pyx_v_self->data_frequency};
      __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 6+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[7] = {__pyx_t_5, __pyx_v_asset_list, __pyx_t_4, __pyx_v_bar_count, __pyx_v_frequency, __pyx_v_fields, __pyx_v_self->data_frequency};
      __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 6+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else
    #endif
    {
      __pyx_t_7 = PyTuple_New(6+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 610, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      if (__pyx_t_5) {
        __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL;
      }
      __Pyx_INCREF(__pyx_v_asset_list);
      __Pyx_GIVEREF(__pyx_v_asset_list);
      PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_v_asset_list);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_t_4);
      __Pyx_INCREF(__pyx_v_bar_count);
      __Pyx_GIVEREF(__pyx_v_bar_count);
      PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_bar_count);
      __Pyx_INCREF(__pyx_v_frequency);
      __Pyx_GIVEREF(__pyx_v_frequency);
      PyTuple_SET_ITEM(__pyx_t_7, 3+__pyx_t_6, __pyx_v_frequency);
      __Pyx_INCREF(__pyx_v_fields);
      __Pyx_GIVEREF(__pyx_v_fields);
      PyTuple_SET_ITEM(__pyx_t_7, 4+__pyx_t_6, __pyx_v_fields);
      __Pyx_INCREF(__pyx_v_self->data_frequency);
      __Pyx_GIVEREF(__pyx_v_self->data_frequency);
      PyTuple_SET_ITEM(__pyx_t_7, 5+__pyx_t_6, __pyx_v_self->data_frequency);
      __pyx_t_4 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_df = __pyx_t_2;
    __pyx_t_2 = 0;
 617:             )
 618: 
+619:             if self._adjust_minutes:
    __pyx_t_1 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 619, __pyx_L1_error)
    if (__pyx_t_1) {
/* … */
    }
+620:                 adjs = self.data_portal.get_adjustments(
      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_adjustments); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 620, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
 621:                     asset_list,
 622:                     fields,
+623:                     self._get_current_minute(),
      __pyx_t_7 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 623, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
+624:                     self.simulation_dt_func()
      __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
      __pyx_t_5 = __pyx_v_self->simulation_dt_func; __pyx_t_8 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_8)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_8);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      __pyx_t_4 = (__pyx_t_8) ? __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_8) : __Pyx_PyObject_CallNoArg(__pyx_t_5);
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 624, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = NULL;
      __pyx_t_6 = 0;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_5)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_5);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
          __pyx_t_6 = 1;
        }
      }
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[5] = {__pyx_t_5, __pyx_v_asset_list, __pyx_v_fields, __pyx_t_7, __pyx_t_4};
        __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 620, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[5] = {__pyx_t_5, __pyx_v_asset_list, __pyx_v_fields, __pyx_t_7, __pyx_t_4};
        __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 620, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else
      #endif
      {
        __pyx_t_8 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 620, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        if (__pyx_t_5) {
          __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL;
        }
        __Pyx_INCREF(__pyx_v_asset_list);
        __Pyx_GIVEREF(__pyx_v_asset_list);
        PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_6, __pyx_v_asset_list);
        __Pyx_INCREF(__pyx_v_fields);
        __Pyx_GIVEREF(__pyx_v_fields);
        PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_6, __pyx_v_fields);
        __Pyx_GIVEREF(__pyx_t_7);
        PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_6, __pyx_t_7);
        __Pyx_GIVEREF(__pyx_t_4);
        PyTuple_SET_ITEM(__pyx_t_8, 3+__pyx_t_6, __pyx_t_4);
        __pyx_t_7 = 0;
        __pyx_t_4 = 0;
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 620, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      }
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_v_adjs = __pyx_t_2;
      __pyx_t_2 = 0;
 625:                 )
 626: 
+627:                 df = df * adjs
      __pyx_t_2 = PyNumber_Multiply(__pyx_v_df, __pyx_v_adjs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 627, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF_SET(__pyx_v_df, __pyx_t_2);
      __pyx_t_2 = 0;
 628: 
+629:             if single_asset:
    __pyx_t_1 = (__pyx_v_single_asset != 0);
    if (__pyx_t_1) {
/* … */
    }
 630:                 # single asset, single field: return pd.Series with pd.DateTimeIndex
+631:                 return df.loc[:, assets]
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_df, __pyx_n_s_loc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 631, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 631, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_slice__7);
      __Pyx_GIVEREF(__pyx_slice__7);
      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_slice__7);
      __Pyx_INCREF(__pyx_v_assets);
      __Pyx_GIVEREF(__pyx_v_assets);
      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_assets);
      __pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 631, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_r = __pyx_t_8;
      __pyx_t_8 = 0;
      goto __pyx_L0;
/* … */
  __pyx_slice__7 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__7)) __PYX_ERR(0, 631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_slice__7);
  __Pyx_GIVEREF(__pyx_slice__7);
 632:             else:
 633:                 # multiple assets, single field: return DataFrame with pd.DateTimeIndex
 634:                 # and assets in columns.
+635:                 return df
    /*else*/ {
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_v_df);
      __pyx_r = __pyx_v_df;
      goto __pyx_L0;
    }
 636:         else:  # multiple fields
 637:             # if single_asset:
 638:             # todo: optimize by querying multiple fields
 639:             # Make multiple history calls, one per field, then combine results
 640: 
+641:             df_dict = {
  /*else*/ {
    { /* enter inner scope */
      __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 641, __pyx_L9_error)
      __Pyx_GOTREF(__pyx_t_8);
+642:                 field: self.data_portal.get_history_window(asset_list,
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_history_window); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 642, __pyx_L9_error)
        __Pyx_GOTREF(__pyx_t_4);
+643:                                                            self._get_current_minute(),
        __pyx_t_7 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 643, __pyx_L9_error)
        __Pyx_GOTREF(__pyx_t_7);
 644:                                                            bar_count,
 645:                                                            frequency,
 646:                                                            field,
+647:                                                            self.data_frequency,
        __pyx_t_5 = NULL;
        __pyx_t_6 = 0;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
          if (likely(__pyx_t_5)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
            __Pyx_INCREF(__pyx_t_5);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_4, function);
            __pyx_t_6 = 1;
          }
        }
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_4)) {
          PyObject *__pyx_temp[7] = {__pyx_t_5, __pyx_v_asset_list, __pyx_t_7, __pyx_v_bar_count, __pyx_v_frequency, __pyx_9genexpr10__pyx_v_field, __pyx_v_self->data_frequency};
          __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 6+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 642, __pyx_L9_error)
          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
          PyObject *__pyx_temp[7] = {__pyx_t_5, __pyx_v_asset_list, __pyx_t_7, __pyx_v_bar_count, __pyx_v_frequency, __pyx_9genexpr10__pyx_v_field, __pyx_v_self->data_frequency};
          __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 6+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 642, __pyx_L9_error)
          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        } else
        #endif
        {
          __pyx_t_11 = PyTuple_New(6+__pyx_t_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 642, __pyx_L9_error)
          __Pyx_GOTREF(__pyx_t_11);
          if (__pyx_t_5) {
            __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_5); __pyx_t_5 = NULL;
          }
          __Pyx_INCREF(__pyx_v_asset_list);
          __Pyx_GIVEREF(__pyx_v_asset_list);
          PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_6, __pyx_v_asset_list);
          __Pyx_GIVEREF(__pyx_t_7);
          PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_6, __pyx_t_7);
          __Pyx_INCREF(__pyx_v_bar_count);
          __Pyx_GIVEREF(__pyx_v_bar_count);
          PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_6, __pyx_v_bar_count);
          __Pyx_INCREF(__pyx_v_frequency);
          __Pyx_GIVEREF(__pyx_v_frequency);
          PyTuple_SET_ITEM(__pyx_t_11, 3+__pyx_t_6, __pyx_v_frequency);
          __Pyx_INCREF(__pyx_9genexpr10__pyx_v_field);
          __Pyx_GIVEREF(__pyx_9genexpr10__pyx_v_field);
          PyTuple_SET_ITEM(__pyx_t_11, 4+__pyx_t_6, __pyx_9genexpr10__pyx_v_field);
          __Pyx_INCREF(__pyx_v_self->data_frequency);
          __Pyx_GIVEREF(__pyx_v_self->data_frequency);
          PyTuple_SET_ITEM(__pyx_t_11, 5+__pyx_t_6, __pyx_v_self->data_frequency);
          __pyx_t_7 = 0;
          __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 642, __pyx_L9_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        }
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+648:                                                            ).loc[:, asset_list]
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_loc); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 648, __pyx_L9_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 648, __pyx_L9_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_INCREF(__pyx_slice__7);
        __Pyx_GIVEREF(__pyx_slice__7);
        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_slice__7);
        __Pyx_INCREF(__pyx_v_asset_list);
        __Pyx_GIVEREF(__pyx_v_asset_list);
        PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_asset_list);
        __pyx_t_11 = __Pyx_PyObject_GetItem(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 648, __pyx_L9_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        if (unlikely(PyDict_SetItem(__pyx_t_8, (PyObject*)__pyx_9genexpr10__pyx_v_field, (PyObject*)__pyx_t_11))) __PYX_ERR(0, 642, __pyx_L9_error)
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+649:                 for field in fields
      if (likely(PyList_CheckExact(__pyx_v_fields)) || PyTuple_CheckExact(__pyx_v_fields)) {
        __pyx_t_3 = __pyx_v_fields; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
        __pyx_t_10 = NULL;
      } else {
        __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_fields); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 649, __pyx_L9_error)
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 649, __pyx_L9_error)
      }
      for (;;) {
        if (likely(!__pyx_t_10)) {
          if (likely(PyList_CheckExact(__pyx_t_3))) {
            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_2); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 649, __pyx_L9_error)
            #else
            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 649, __pyx_L9_error)
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          } else {
            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_2); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 649, __pyx_L9_error)
            #else
            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 649, __pyx_L9_error)
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          }
        } else {
          __pyx_t_2 = __pyx_t_10(__pyx_t_3);
          if (unlikely(!__pyx_t_2)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else __PYX_ERR(0, 649, __pyx_L9_error)
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_2);
        }
        __Pyx_XDECREF_SET(__pyx_9genexpr10__pyx_v_field, __pyx_t_2);
        __pyx_t_2 = 0;
/* … */
      }
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_9genexpr10__pyx_v_field); __pyx_9genexpr10__pyx_v_field = 0;
      goto __pyx_L12_exit_scope;
      __pyx_L9_error:;
      __Pyx_XDECREF(__pyx_9genexpr10__pyx_v_field); __pyx_9genexpr10__pyx_v_field = 0;
      goto __pyx_L1_error;
      __pyx_L12_exit_scope:;
    } /* exit inner scope */
    __pyx_v_df_dict = ((PyObject*)__pyx_t_8);
    __pyx_t_8 = 0;
 650:             }
 651: 
+652:             if self._adjust_minutes:
    __pyx_t_1 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_self->_adjust_minutes)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 652, __pyx_L1_error)
    if (__pyx_t_1) {
/* … */
    }
+653:                 adjs = {
      { /* enter inner scope */
        __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 653, __pyx_L16_error)
        __Pyx_GOTREF(__pyx_t_8);
+654:                     field: self.data_portal.get_adjustments(
          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_adjustments); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 654, __pyx_L16_error)
          __Pyx_GOTREF(__pyx_t_2);
 655:                         assets,
 656:                         field,
+657:                         self._get_current_minute(),
          __pyx_t_4 = ((struct __pyx_vtabstruct_7zipline_9_protocol_BarData *)__pyx_v_self->__pyx_vtab)->_get_current_minute(__pyx_v_self); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 657, __pyx_L16_error)
          __Pyx_GOTREF(__pyx_t_4);
+658:                         self.simulation_dt_func()
          __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
          __pyx_t_5 = __pyx_v_self->simulation_dt_func; __pyx_t_12 = NULL;
          if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) {
            __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_5);
            if (likely(__pyx_t_12)) {
              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
              __Pyx_INCREF(__pyx_t_12);
              __Pyx_INCREF(function);
              __Pyx_DECREF_SET(__pyx_t_5, function);
            }
          }
          __pyx_t_7 = (__pyx_t_12) ? __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_12) : __Pyx_PyObject_CallNoArg(__pyx_t_5);
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L16_error)
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __pyx_t_5 = NULL;
          __pyx_t_6 = 0;
          if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
            __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
            if (likely(__pyx_t_5)) {
              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
              __Pyx_INCREF(__pyx_t_5);
              __Pyx_INCREF(function);
              __Pyx_DECREF_SET(__pyx_t_2, function);
              __pyx_t_6 = 1;
            }
          }
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_2)) {
            PyObject *__pyx_temp[5] = {__pyx_t_5, __pyx_v_assets, __pyx_9genexpr11__pyx_v_field, __pyx_t_4, __pyx_t_7};
            __pyx_t_11 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 654, __pyx_L16_error)
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_GOTREF(__pyx_t_11);
            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
            PyObject *__pyx_temp[5] = {__pyx_t_5, __pyx_v_assets, __pyx_9genexpr11__pyx_v_field, __pyx_t_4, __pyx_t_7};
            __pyx_t_11 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 654, __pyx_L16_error)
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_GOTREF(__pyx_t_11);
            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          } else
          #endif
          {
            __pyx_t_12 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 654, __pyx_L16_error)
            __Pyx_GOTREF(__pyx_t_12);
            if (__pyx_t_5) {
              __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_5); __pyx_t_5 = NULL;
            }
            __Pyx_INCREF(__pyx_v_assets);
            __Pyx_GIVEREF(__pyx_v_assets);
            PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_6, __pyx_v_assets);
            __Pyx_INCREF(__pyx_9genexpr11__pyx_v_field);
            __Pyx_GIVEREF(__pyx_9genexpr11__pyx_v_field);
            PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_6, __pyx_9genexpr11__pyx_v_field);
            __Pyx_GIVEREF(__pyx_t_4);
            PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_6, __pyx_t_4);
            __Pyx_GIVEREF(__pyx_t_7);
            PyTuple_SET_ITEM(__pyx_t_12, 3+__pyx_t_6, __pyx_t_7);
            __pyx_t_4 = 0;
            __pyx_t_7 = 0;
            __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 654, __pyx_L16_error)
            __Pyx_GOTREF(__pyx_t_11);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          }
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+659:                     )[0] for field in fields
        if (likely(PyList_CheckExact(__pyx_v_fields)) || PyTuple_CheckExact(__pyx_v_fields)) {
          __pyx_t_3 = __pyx_v_fields; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
          __pyx_t_10 = NULL;
        } else {
          __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_fields); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 659, __pyx_L16_error)
          __Pyx_GOTREF(__pyx_t_3);
          __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 659, __pyx_L16_error)
        }
        for (;;) {
          if (likely(!__pyx_t_10)) {
            if (likely(PyList_CheckExact(__pyx_t_3))) {
              if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_11); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 659, __pyx_L16_error)
              #else
              __pyx_t_11 = PySequence_ITEM(__pyx_t_3, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 659, __pyx_L16_error)
              __Pyx_GOTREF(__pyx_t_11);
              #endif
            } else {
              if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_11); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 659, __pyx_L16_error)
              #else
              __pyx_t_11 = PySequence_ITEM(__pyx_t_3, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 659, __pyx_L16_error)
              __Pyx_GOTREF(__pyx_t_11);
              #endif
            }
          } else {
            __pyx_t_11 = __pyx_t_10(__pyx_t_3);
            if (unlikely(!__pyx_t_11)) {
              PyObject* exc_type = PyErr_Occurred();
              if (exc_type) {
                if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
                else __PYX_ERR(0, 659, __pyx_L16_error)
              }
              break;
            }
            __Pyx_GOTREF(__pyx_t_11);
          }
          __Pyx_XDECREF_SET(__pyx_9genexpr11__pyx_v_field, __pyx_t_11);
          __pyx_t_11 = 0;
/* … */
          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_11, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 659, __pyx_L16_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (unlikely(PyDict_SetItem(__pyx_t_8, (PyObject*)__pyx_9genexpr11__pyx_v_field, (PyObject*)__pyx_t_2))) __PYX_ERR(0, 654, __pyx_L16_error)
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        }
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_XDECREF(__pyx_9genexpr11__pyx_v_field); __pyx_9genexpr11__pyx_v_field = 0;
        goto __pyx_L19_exit_scope;
        __pyx_L16_error:;
        __Pyx_XDECREF(__pyx_9genexpr11__pyx_v_field); __pyx_9genexpr11__pyx_v_field = 0;
        goto __pyx_L1_error;
        __pyx_L19_exit_scope:;
      } /* exit inner scope */
      __pyx_v_adjs = __pyx_t_8;
      __pyx_t_8 = 0;
 660:                 }
 661: 
+662:                 df_dict = {field: df * adjs[field]
      { /* enter inner scope */
        __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 662, __pyx_L22_error)
        __Pyx_GOTREF(__pyx_t_8);
/* … */
          __pyx_t_11 = __Pyx_PyObject_GetItem(__pyx_v_adjs, __pyx_9genexpr12__pyx_v_field); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 662, __pyx_L22_error)
          __Pyx_GOTREF(__pyx_t_11);
          __pyx_t_2 = PyNumber_Multiply(__pyx_9genexpr12__pyx_v_df, __pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 662, __pyx_L22_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (unlikely(PyDict_SetItem(__pyx_t_8, (PyObject*)__pyx_9genexpr12__pyx_v_field, (PyObject*)__pyx_t_2))) __PYX_ERR(0, 662, __pyx_L22_error)
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        }
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_XDECREF(__pyx_9genexpr12__pyx_v_df); __pyx_9genexpr12__pyx_v_df = 0;
        __Pyx_XDECREF(__pyx_9genexpr12__pyx_v_field); __pyx_9genexpr12__pyx_v_field = 0;
        goto __pyx_L25_exit_scope;
        __pyx_L22_error:;
        __Pyx_XDECREF(__pyx_9genexpr12__pyx_v_df); __pyx_9genexpr12__pyx_v_df = 0;
        __Pyx_XDECREF(__pyx_9genexpr12__pyx_v_field); __pyx_9genexpr12__pyx_v_field = 0;
        goto __pyx_L1_error;
        __pyx_L25_exit_scope:;
      } /* exit inner scope */
      __Pyx_DECREF_SET(__pyx_v_df_dict, ((PyObject*)__pyx_t_8));
      __pyx_t_8 = 0;
+663:                            for field, df in df_dict.items()}
        __pyx_t_9 = 0;
        __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_df_dict, 1, __pyx_n_s_items, (&__pyx_t_13), (&__pyx_t_6)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 663, __pyx_L22_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_XDECREF(__pyx_t_3);
        __pyx_t_3 = __pyx_t_2;
        __pyx_t_2 = 0;
        while (1) {
          __pyx_t_14 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_13, &__pyx_t_9, &__pyx_t_2, &__pyx_t_11, NULL, __pyx_t_6);
          if (unlikely(__pyx_t_14 == 0)) break;
          if (unlikely(__pyx_t_14 == -1)) __PYX_ERR(0, 663, __pyx_L22_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_XDECREF_SET(__pyx_9genexpr12__pyx_v_field, __pyx_t_2);
          __pyx_t_2 = 0;
          __Pyx_XDECREF_SET(__pyx_9genexpr12__pyx_v_df, __pyx_t_11);
          __pyx_t_11 = 0;
 664: 
+665:             dt_label = 'date' if frequency == '1d' else 'date_time'
    __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_frequency, __pyx_kp_u_1d, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 665, __pyx_L1_error)
    if (__pyx_t_1) {
      __Pyx_INCREF(__pyx_n_u_date);
      __pyx_t_8 = __pyx_n_u_date;
    } else {
      __Pyx_INCREF(__pyx_n_u_date_time);
      __pyx_t_8 = __pyx_n_u_date_time;
    }
    __pyx_v_dt_label = ((PyObject*)__pyx_t_8);
    __pyx_t_8 = 0;
+666:             df = (pd.concat(df_dict,
    __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_pd); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 666, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_concat); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 666, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 666, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_v_df_dict);
    __Pyx_GIVEREF(__pyx_v_df_dict);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_df_dict);
/* … */
    __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_8, __pyx_t_2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 666, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+667:                             keys=df_dict.keys(),
    __pyx_t_2 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 667, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_11 = __Pyx_PyDict_Keys(__pyx_v_df_dict); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 667, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_keys, __pyx_t_11) < 0) __PYX_ERR(0, 667, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+668:                             names=['fields', dt_label])
    __pyx_t_11 = PyList_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 668, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_INCREF(__pyx_n_u_fields);
    __Pyx_GIVEREF(__pyx_n_u_fields);
    PyList_SET_ITEM(__pyx_t_11, 0, __pyx_n_u_fields);
    __Pyx_INCREF(__pyx_v_dt_label);
    __Pyx_GIVEREF(__pyx_v_dt_label);
    PyList_SET_ITEM(__pyx_t_11, 1, __pyx_v_dt_label);
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_names, __pyx_t_11) < 0) __PYX_ERR(0, 667, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+669:                   .stack(dropna=False)  # ensure we return all fields/assets/dates despite missing values
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_stack); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 669, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_11 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 669, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (PyDict_SetItem(__pyx_t_11, __pyx_n_s_dropna, Py_False) < 0) __PYX_ERR(0, 669, __pyx_L1_error)
    __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 669, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+670:                   .unstack(level='fields'))
    __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_unstack); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 670, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 670, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_level, __pyx_n_u_fields) < 0) __PYX_ERR(0, 670, __pyx_L1_error)
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_empty_tuple, __pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 670, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_v_df = __pyx_t_2;
    __pyx_t_2 = 0;
+671:             df.index.set_names([dt_label, 'asset'])
    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_df, __pyx_n_s_index); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 671, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_set_names); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 671, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 671, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_v_dt_label);
    __Pyx_GIVEREF(__pyx_v_dt_label);
    PyList_SET_ITEM(__pyx_t_8, 0, __pyx_v_dt_label);
    __Pyx_INCREF(__pyx_n_u_asset);
    __Pyx_GIVEREF(__pyx_n_u_asset);
    PyList_SET_ITEM(__pyx_t_8, 1, __pyx_n_u_asset);
    __pyx_t_3 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_11, function);
      }
    }
    __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_3, __pyx_t_8) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_8);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 671, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+672:             return df.sort_index()
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_df, __pyx_n_s_sort_index); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 672, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_8 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_11);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_11, function);
      }
    }
    __pyx_t_2 = (__pyx_t_8) ? __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_8) : __Pyx_PyObject_CallNoArg(__pyx_t_11);
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 672, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
  }
 673: 
 674:     property current_dt:
+675:         def __get__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_10current_dt_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_10current_dt_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_10current_dt___get__(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_10current_dt___get__(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_TraceCall("__get__", __pyx_f[0], 675, 0, __PYX_ERR(0, 675, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("zipline._protocol.BarData.current_dt.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+676:             return self.simulation_dt_func()
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_2 = __pyx_v_self->simulation_dt_func; __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 676, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 677: 
 678:     @property
+679:     def fetcher_assets(self):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_14fetcher_assets_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_14fetcher_assets_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_14fetcher_assets___get__(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_14fetcher_assets___get__(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_TraceCall("__get__", __pyx_f[0], 679, 0, __PYX_ERR(0, 679, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("zipline._protocol.BarData.fetcher_assets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+680:         return self.data_portal.get_fetcher_assets(self.simulation_dt_func())
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->data_portal, __pyx_n_s_get_fetcher_assets); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_4 = __pyx_v_self->simulation_dt_func; __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5) : __Pyx_PyObject_CallNoArg(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 681: 
 682:     property _handle_non_market_minutes:
+683:         def __set__(self, val):
/* Python wrapper */
static int __pyx_pw_7zipline_9_protocol_7BarData_26_handle_non_market_minutes_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
static int __pyx_pw_7zipline_9_protocol_7BarData_26_handle_non_market_minutes_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_26_handle_non_market_minutes___set__(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self), ((PyObject *)__pyx_v_val));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7zipline_9_protocol_7BarData_26_handle_non_market_minutes___set__(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self, PyObject *__pyx_v_val) {
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_TraceCall("__set__", __pyx_f[0], 683, 0, __PYX_ERR(0, 683, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("zipline._protocol.BarData._handle_non_market_minutes.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+684:             self._adjust_minutes = val
  if (!(likely(((__pyx_v_val) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_val, __pyx_ptype_7cpython_4bool_bool))))) __PYX_ERR(0, 684, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_val;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_adjust_minutes);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->_adjust_minutes));
  __pyx_v_self->_adjust_minutes = ((PyBoolObject *)__pyx_t_1);
  __pyx_t_1 = 0;
 685: 
 686:     property current_session:
+687:         def __get__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_15current_session_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_15current_session_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_15current_session___get__(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_15current_session___get__(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_TraceCall("__get__", __pyx_f[0], 687, 0, __PYX_ERR(0, 687, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("zipline._protocol.BarData.current_session.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+688:             return self._trading_calendar.minute_to_session_label(
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_trading_calendar, __pyx_n_s_minute_to_session_label); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
/* … */
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
/* … */
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
+689:                 self.simulation_dt_func(),
  __Pyx_INCREF(__pyx_v_self->simulation_dt_func);
  __pyx_t_3 = __pyx_v_self->simulation_dt_func; __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+690:                 direction="next"
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_direction, __pyx_n_u_next) < 0) __PYX_ERR(0, 690, __pyx_L1_error)
 691:             )
 692: 
 693:     property current_session_minutes:
+694:         def __get__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_23current_session_minutes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_7BarData_23current_session_minutes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_7BarData_23current_session_minutes___get__(((struct __pyx_obj_7zipline_9_protocol_BarData *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_7BarData_23current_session_minutes___get__(struct __pyx_obj_7zipline_9_protocol_BarData *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_TraceCall("__get__", __pyx_f[0], 694, 0, __PYX_ERR(0, 694, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("zipline._protocol.BarData.current_session_minutes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+695:             return self._trading_calendar.minutes_for_session(
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_trading_calendar, __pyx_n_s_minutes_for_session); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
+696:                 self.current_session
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_current_session); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 697:             )
 698: 
 699: cdef class InnerPosition:
 700:     """The real values of a position.
 701: 
 702:     This exists to be owned by both a
 703:     :class:`zipline.finance.position.Position` and a
 704:     :class:`zipline.protocol.Position` at the same time without a cycle.
 705:     """
+706:     def __init__(self,
/* Python wrapper */
static int __pyx_pw_7zipline_9_protocol_13InnerPosition_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7zipline_9_protocol_13InnerPosition_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_asset = 0;
  PyObject *__pyx_v_amount = 0;
  PyObject *__pyx_v_cost_basis = 0;
  PyObject *__pyx_v_last_sale_price = 0;
  PyObject *__pyx_v_last_sale_date = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_asset,&__pyx_n_s_amount,&__pyx_n_s_cost_basis,&__pyx_n_s_last_sale_price,&__pyx_n_s_last_sale_date,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[1] = ((PyObject *)__pyx_int_0);
    values[2] = ((PyObject *)__pyx_float_0_0);
    values[3] = ((PyObject *)__pyx_float_0_0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7zipline_9_protocol_13InnerPosition___init__(struct __pyx_obj_7zipline_9_protocol_InnerPosition *__pyx_v_self, PyObject *__pyx_v_asset, PyObject *__pyx_v_amount, PyObject *__pyx_v_cost_basis, PyObject *__pyx_v_last_sale_price, PyObject *__pyx_v_last_sale_date) {
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
  __Pyx_TraceCall("__init__", __pyx_f[0], 706, 0, __PYX_ERR(0, 706, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("zipline._protocol.InnerPosition.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 707:                  asset,
 708:                  amount=0,
 709:                  cost_basis=0.0,
 710:                  last_sale_price=0.0,
+711:                  last_sale_date=None):
    values[4] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_asset)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_amount);
          if (value) { values[1] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cost_basis);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_last_sale_price);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_last_sale_date);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 706, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_asset = values[0];
    __pyx_v_amount = values[1];
    __pyx_v_cost_basis = values[2];
    __pyx_v_last_sale_price = values[3];
    __pyx_v_last_sale_date = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 706, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("zipline._protocol.InnerPosition.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7zipline_9_protocol_13InnerPosition___init__(((struct __pyx_obj_7zipline_9_protocol_InnerPosition *)__pyx_v_self), __pyx_v_asset, __pyx_v_amount, __pyx_v_cost_basis, __pyx_v_last_sale_price, __pyx_v_last_sale_date);
+712:         self.asset = asset
  if (!(likely(((__pyx_v_asset) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_asset, __pyx_ptype_7zipline_6assets_7_assets_Asset))))) __PYX_ERR(0, 712, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_asset;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->asset);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->asset));
  __pyx_v_self->asset = ((struct __pyx_obj_7zipline_6assets_7_assets_Asset *)__pyx_t_1);
  __pyx_t_1 = 0;
+713:         self.amount = amount
  __pyx_t_2 = __Pyx_PyInt_As_npy_int64(__pyx_v_amount); if (unlikely((__pyx_t_2 == ((npy_int64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 713, __pyx_L1_error)
  __pyx_v_self->amount = __pyx_t_2;
+714:         self.cost_basis = cost_basis  # per share
  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_v_cost_basis); if (unlikely((__pyx_t_3 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 714, __pyx_L1_error)
  __pyx_v_self->cost_basis = __pyx_t_3;
+715:         self.last_sale_price = last_sale_price
  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_v_last_sale_price); if (unlikely((__pyx_t_3 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 715, __pyx_L1_error)
  __pyx_v_self->last_sale_price = __pyx_t_3;
+716:         self.last_sale_date = last_sale_date
  __Pyx_INCREF(__pyx_v_last_sale_date);
  __Pyx_GIVEREF(__pyx_v_last_sale_date);
  __Pyx_GOTREF(__pyx_v_self->last_sale_date);
  __Pyx_DECREF(__pyx_v_self->last_sale_date);
  __pyx_v_self->last_sale_date = __pyx_v_last_sale_date;
 717: 
+718:     def __repr__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7zipline_9_protocol_13InnerPosition_3__repr__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7zipline_9_protocol_13InnerPosition_3__repr__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7zipline_9_protocol_13InnerPosition_2__repr__(((struct __pyx_obj_7zipline_9_protocol_InnerPosition *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7zipline_9_protocol_13InnerPosition_2__repr__(struct __pyx_obj_7zipline_9_protocol_InnerPosition *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__repr__", 0);
  __Pyx_TraceCall("__repr__", __pyx_f[0], 718, 0, __PYX_ERR(0, 718, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("zipline._protocol.InnerPosition.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+719:         return (
  __Pyx_XDECREF(__pyx_r);
+720:                 '%s(asset=%r, amount=%r, cost_basis=%r,'
  __pyx_t_1 = PyTuple_New(12); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_3 = 127;
/* … */
  __pyx_t_4 = __Pyx_PyUnicode_Join(__pyx_t_1, 12, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 721:                 ' last_sale_price=%r, last_sale_date=%r)' % (
+722:                     type(self).__name__,
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))), __pyx_n_s_name); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 722, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Unicode(__pyx_t_4), __pyx_empty_unicode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 722, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_5) > __pyx_t_3) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_5) : __pyx_t_3;
  __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
  __pyx_t_5 = 0;
  __Pyx_INCREF(__pyx_kp_u_asset_2);
  __pyx_t_2 += 7;
  __Pyx_GIVEREF(__pyx_kp_u_asset_2);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_kp_u_asset_2);
+723:                     self.asset,
  __pyx_t_5 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Repr(((PyObject *)__pyx_v_self->asset)), __pyx_empty_unicode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_5) > __pyx_t_3) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_5) : __pyx_t_3;
  __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_5);
  __pyx_t_5 = 0;
  __Pyx_INCREF(__pyx_kp_u_amount_2);
  __pyx_t_2 += 9;
  __Pyx_GIVEREF(__pyx_kp_u_amount_2);
  PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_kp_u_amount_2);
+724:                     self.amount,
  __pyx_t_5 = __Pyx_PyInt_From_npy_int64(__pyx_v_self->amount); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Repr(__pyx_t_5), __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_3 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_4) > __pyx_t_3) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_4) : __pyx_t_3;
  __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_4);
  __pyx_t_4 = 0;
  __Pyx_INCREF(__pyx_kp_u_cost_basis_2);
  __pyx_t_2 += 13;
  __Pyx_GIVEREF(__pyx_kp_u_cost_basis_2);
  PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_kp_u_cost_basis_2);
+725:                     self.cost_basis,
  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_self->cost_basis); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Repr(__pyx_t_4), __pyx_empty_unicode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_5) > __pyx_t_3) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_5) : __pyx_t_3;
  __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_t_5);
  __pyx_t_5 = 0;
  __Pyx_INCREF(__pyx_kp_u_last_sale_price_2);
  __pyx_t_2 += 18;
  __Pyx_GIVEREF(__pyx_kp_u_last_sale_price_2);
  PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_kp_u_last_sale_price_2);
+726:                     self.last_sale_price,
  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_self->last_sale_price); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 726, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Repr(__pyx_t_5), __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 726, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_3 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_4) > __pyx_t_3) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_4) : __pyx_t_3;
  __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_t_4);
  __pyx_t_4 = 0;
  __Pyx_INCREF(__pyx_kp_u_last_sale_date_2);
  __pyx_t_2 += 17;
  __Pyx_GIVEREF(__pyx_kp_u_last_sale_date_2);
  PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_kp_u_last_sale_date_2);
+727:                     self.last_sale_date,
  __pyx_t_4 = __Pyx_PyObject_FormatSimpleAndDecref(PyObject_Repr(__pyx_v_self->last_sale_date), __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 727, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_4) > __pyx_t_3) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_4) : __pyx_t_3;
  __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 10, __pyx_t_4);
  __pyx_t_4 = 0;
  __Pyx_INCREF(__pyx_kp_u__8);
  __pyx_t_2 += 1;
  __Pyx_GIVEREF(__pyx_kp_u__8);
  PyTuple_SET_ITEM(__pyx_t_1, 11, __pyx_kp_u__8);
 728:                 )
 729:         )