mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-29 11:18:20 +08:00
Attempt to fix protocol assertion error.
This commit is contained in:
+40
-23
@@ -5,23 +5,28 @@ import datetime
|
|||||||
import random
|
import random
|
||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import zipline.util as qutil
|
|
||||||
import zipline.messaging as zm
|
import zipline.messaging as zm
|
||||||
import zipline.protocol as zp
|
import zipline.protocol as zp
|
||||||
|
|
||||||
|
|
||||||
class TradeDataSource(zm.DataSource):
|
class TradeDataSource(zm.DataSource):
|
||||||
|
|
||||||
def send(self, event):
|
def send(self, event):
|
||||||
""" :param dict event: is a trade event with data as per :py:func: `zipline.protocol.TRADE_FRAME`
|
"""
|
||||||
:rtype: None
|
:param dict event: is a trade event with data as per
|
||||||
|
:py:func: `zipline.protocol.TRADE_FRAME`
|
||||||
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
event.source_id = self.get_id
|
event.source_id = self.get_id
|
||||||
message = zp.DATASOURCE_FRAME(event)
|
message = zp.DATASOURCE_FRAME(event)
|
||||||
self.data_socket.send(message)
|
self.data_socket.send(message)
|
||||||
|
|
||||||
|
|
||||||
class RandomEquityTrades(TradeDataSource):
|
class RandomEquityTrades(TradeDataSource):
|
||||||
"""Generates a random stream of trades for testing."""
|
"""
|
||||||
|
Generates a random stream of trades for testing.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, sid, source_id, count):
|
def __init__(self, sid, source_id, count):
|
||||||
zm.DataSource.__init__(self, source_id)
|
zm.DataSource.__init__(self, source_id)
|
||||||
self.count = count
|
self.count = count
|
||||||
@@ -30,32 +35,44 @@ class RandomEquityTrades(TradeDataSource):
|
|||||||
self.trade_start = datetime.datetime.now().replace(tzinfo=pytz.utc)
|
self.trade_start = datetime.datetime.now().replace(tzinfo=pytz.utc)
|
||||||
self.minute = datetime.timedelta(minutes=1)
|
self.minute = datetime.timedelta(minutes=1)
|
||||||
self.price = random.uniform(5.0, 50.0)
|
self.price = random.uniform(5.0, 50.0)
|
||||||
|
|
||||||
|
|
||||||
def get_type(self):
|
def get_type(self):
|
||||||
return 'EQUITY_TRADE'
|
zp.COMPONENT_TYPE.SOURCE
|
||||||
|
|
||||||
|
|
||||||
def do_work(self):
|
def do_work(self):
|
||||||
if(self.incr == self.count):
|
if(self.incr == self.count):
|
||||||
self.signal_done()
|
self.signal_done()
|
||||||
return
|
return
|
||||||
|
|
||||||
self.price = self.price + random.uniform(-0.05, 0.05)
|
|
||||||
self._send(self.sid, self.price, random.randrange(100,10000,100), self.trade_start + (self.minute * self.incr))
|
|
||||||
self.incr += 1
|
|
||||||
|
|
||||||
def _send(self, sid, price, volume, dt):
|
self.price = self.price + random.uniform(-0.05, 0.05)
|
||||||
event = zp.namedict({'source_id': self.get_id, "type" : "TRADE", "sid":sid, "price":price, "volume":volume, "dt":dt})
|
volume = random.randrange(100,10000,100)
|
||||||
self.send(event)
|
|
||||||
|
event = zp.namedict({
|
||||||
|
'source_id' : self.get_id,
|
||||||
|
"type" : zp.DATASOURCE_TYPE.ORDER,
|
||||||
|
"sid" : self.sid,
|
||||||
|
"price" : self.price,
|
||||||
|
"volume" : volume,
|
||||||
|
"dt" : self.trade_start + (self.minute * self.incr),
|
||||||
|
})
|
||||||
|
|
||||||
|
message = zp.DATASOURCE_FRAME(event)
|
||||||
|
self.send(message)
|
||||||
|
|
||||||
|
self.incr += 1
|
||||||
|
|
||||||
|
|
||||||
class SpecificEquityTrades(TradeDataSource):
|
class SpecificEquityTrades(TradeDataSource):
|
||||||
"""Generates a random stream of trades for testing."""
|
"""
|
||||||
|
Generates a random stream of trades for testing.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, source_id, event_list):
|
def __init__(self, source_id, event_list):
|
||||||
"""
|
"""
|
||||||
:event_list: should be a chronologically ordered list of dictionaries in the following form:
|
:event_list: should be a chronologically ordered list of dictionaries
|
||||||
|
in the following form:
|
||||||
|
|
||||||
event = {
|
event = {
|
||||||
'sid' : an integer for security id,
|
'sid' : an integer for security id,
|
||||||
'dt' : datetime object,
|
'dt' : datetime object,
|
||||||
@@ -67,14 +84,14 @@ class SpecificEquityTrades(TradeDataSource):
|
|||||||
self.event_list = event_list
|
self.event_list = event_list
|
||||||
|
|
||||||
def get_type(self):
|
def get_type(self):
|
||||||
return 'EQUITY_TRADE'
|
zp.COMPONENT_TYPE.SOURCE
|
||||||
|
|
||||||
def do_work(self):
|
def do_work(self):
|
||||||
if(len(self.event_list) == 0):
|
if(len(self.event_list) == 0):
|
||||||
self.signal_done()
|
self.signal_done()
|
||||||
return
|
return
|
||||||
|
|
||||||
event = self.event_list.pop(0)
|
event = self.event_list.pop(0)
|
||||||
self.send(zp.namedict(event))
|
self.send(zp.namedict(event))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from zipline.sources import RandomEquityTrades
|
|||||||
from zipline.test.client import TestClient
|
from zipline.test.client import TestClient
|
||||||
from zipline.test.transform import DivideByZeroTransform
|
from zipline.test.transform import DivideByZeroTransform
|
||||||
|
|
||||||
|
from nose.tools import timed
|
||||||
|
|
||||||
# Should not inherit form TestCase since test runners will pick
|
# Should not inherit form TestCase since test runners will pick
|
||||||
# it up as a test. Its a Mixin of sorts at this point.
|
# it up as a test. Its a Mixin of sorts at this point.
|
||||||
@@ -73,6 +74,7 @@ class SimulatorTestCase(object):
|
|||||||
# Cases
|
# Cases
|
||||||
# -------
|
# -------
|
||||||
|
|
||||||
|
@timed(2)
|
||||||
def test_simple(self):
|
def test_simple(self):
|
||||||
|
|
||||||
# Simple test just to make sure that the archiecture is
|
# Simple test just to make sure that the archiecture is
|
||||||
@@ -100,7 +102,7 @@ class SimulatorTestCase(object):
|
|||||||
|
|
||||||
ret1 = RandomEquityTrades(133, "ret1", 1)
|
ret1 = RandomEquityTrades(133, "ret1", 1)
|
||||||
ret2 = RandomEquityTrades(134, "ret2", 1)
|
ret2 = RandomEquityTrades(134, "ret2", 1)
|
||||||
client = TestClient(expected_msg_count=(ret1.count + ret2.count))
|
client = TestClient()
|
||||||
|
|
||||||
sim.register_controller( con )
|
sim.register_controller( con )
|
||||||
sim.register_components([ret1, ret2, client])
|
sim.register_components([ret1, ret2, client])
|
||||||
@@ -149,7 +151,7 @@ class SimulatorTestCase(object):
|
|||||||
ret1 = RandomEquityTrades(133, "ret1", 1)
|
ret1 = RandomEquityTrades(133, "ret1", 1)
|
||||||
ret2 = RandomEquityTrades(134, "ret2", 1)
|
ret2 = RandomEquityTrades(134, "ret2", 1)
|
||||||
fail_transform = DivideByZeroTransform("fail")
|
fail_transform = DivideByZeroTransform("fail")
|
||||||
client = TestClient(self, expected_msg_count=ret1.count + ret2.count)
|
client = TestClient()
|
||||||
|
|
||||||
sim.register_controller( con )
|
sim.register_controller( con )
|
||||||
sim.register_components([ret1, ret2, fail_transform, client])
|
sim.register_components([ret1, ret2, fail_transform, client])
|
||||||
@@ -194,7 +196,7 @@ class SimulatorTestCase(object):
|
|||||||
|
|
||||||
ret1 = RandomEquityTrades(133, "ret1", 400)
|
ret1 = RandomEquityTrades(133, "ret1", 400)
|
||||||
ret2 = RandomEquityTrades(134, "ret2", 400)
|
ret2 = RandomEquityTrades(134, "ret2", 400)
|
||||||
client = TestClient(expected_msg_count=ret1.count + ret2.count)
|
client = TestClient()
|
||||||
|
|
||||||
sim.register_controller( con )
|
sim.register_controller( con )
|
||||||
sim.register_components([ret1, ret2, client])
|
sim.register_components([ret1, ret2, client])
|
||||||
@@ -240,7 +242,7 @@ class SimulatorTestCase(object):
|
|||||||
ret2 = RandomEquityTrades(134, "ret2", 5000)
|
ret2 = RandomEquityTrades(134, "ret2", 5000)
|
||||||
mavg1 = MovingAverage("mavg1", 30)
|
mavg1 = MovingAverage("mavg1", 30)
|
||||||
mavg2 = MovingAverage("mavg2", 60)
|
mavg2 = MovingAverage("mavg2", 60)
|
||||||
client = TestClient(expected_msg_count=10000)
|
client = TestClient()
|
||||||
|
|
||||||
sim.register_components([ret1, ret2, mavg1, mavg2, client])
|
sim.register_components([ret1, ret2, mavg1, mavg2, client])
|
||||||
sim.register_controller( con )
|
sim.register_controller( con )
|
||||||
|
|||||||
Reference in New Issue
Block a user