def testQuoteConstruction(self): s = Symbol.get("TEST") conflator = PriceConflator("TEST", MarketDataPeriod.MIN_5, self.callback) start_time = datetime.datetime(2015, 7, 7, 14, 10, 0) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 9.0, 9.2) # 14:11:00 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 8.7, 8.9) # 14:12:00 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 11.0, 11.2) # 14:13:00 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 10.5, 10.7) # 14:14:00 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 9.0, 9.2) # 14:15:00 conflator.add_tick(tick) self.assertEqual(1, len(self.callbackQuote)) quote = self.callbackQuote[0] self.assertEqual(9.1, quote.open) self.assertEqual(11.1, quote.high) self.assertEqual(8.8, quote.low) self.assertEqual(10.6, quote.close)
def testTakeProfitMarketOrder(self): symbol = Symbol.get('TEST') symbol.lot_size = 1 start_time = datetime.datetime(2015, 7, 7, 12) # symbol = algo.analysis_symbols()[0] ticks = [] ticks.append(Tick(start_time.timestamp(), 10.0, 10.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 11.0, 11.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 13.0, 13.1)) dataProvider = SimulatedDataProvider(symbol, ticks) order_manager = Broker(dataProvider) order_manager.subscribeSymbol(symbol) order = Order(symbol, 1, Entry(Entry.Type.MARKET), Direction.LONG, take_profit=2) order_creator = OrderCreator(order_manager, symbol, order) order_manager.addPriceObserver(order_creator.handle_data) order_manager.addPositionObserver(lambda position, state: self.setPosition(position)) order_manager.start() self.assertEqual(0, len(order_manager.orders)) self.assertEqual(0, len(order_manager.positions)) self.assertEqual(State.FILLED, order.status) self.assertIsNotNone(self.position) self.assertEqual(Position.PositionStatus.TAKE_PROFIT, self.position.status) self.assertEqual(12.1, self.position.exit_price) self.assertAlmostEquals(2.0, self.position.points_delta())
def testAlgoExpiredOrder(self): symbol = Symbol.get('TEST') start_time = datetime.datetime(2015, 7, 7, 12) order = Order(symbol, 1, Entry(Entry.Type.STOP_ENTRY, 12.5), Direction.LONG, expire_time=datetime.timedelta(seconds=90), entry_time=start_time) # symbol = algo.analysis_symbols()[0] ticks = [] ticks.append(Tick(start_time.timestamp(), 10.0, 10.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 11.0, 11.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 12.0, 12.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 12.3, 12.4)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 12.8, 12.9)) dataProvider = SimulatedDataProvider(symbol, ticks) order_manager = Broker(dataProvider) order_manager.subscribeSymbol(symbol) order_creator = OrderCreator(order_manager, symbol, order) order_manager.addPriceObserver(order_creator.handle_data) order_manager.start() self.assertEqual(0, len(order_manager.orders)) self.assertEqual(0, len(order_manager.positions)) self.assertEqual(State.EXPIRED, order.status)
def testAlgoStopEntryOrder(self): symbol = Symbol.get('TEST') start_time = datetime.datetime(2015, 7, 7, 12) # symbol = algo.analysis_symbols()[0] ticks = [] ticks.append(Tick(start_time.timestamp(), 10.0, 10.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 11.0, 11.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 12.0, 12.1)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 12.3, 12.4)) start_time = start_time + MarketDataPeriod.MIN_1 ticks.append(Tick(start_time.timestamp(), 12.8, 12.9)) dataProvider = SimulatedDataProvider(symbol, ticks) order_manager = Broker(dataProvider) order_manager.subscribeSymbol(symbol) order = Order(symbol, 1, Entry(Entry.Type.STOP_ENTRY, 11.3), Direction.LONG) order_creator = OrderCreator(order_manager, symbol, order) order_manager.addPriceObserver(order_creator.handle_data) order_manager.start() self.assertEqual(0, len(order_manager.orders)) self.assertEqual(1, len(order_manager.positions)) self.assertEqual(State.FILLED, order.status) position = order_manager.positions[0] self.assertEqual(Position.PositionStatus.OPEN, position.status) self.assertEqual(12.1, position.entry_price)
def testQuoteConstructionOnInterval(self): s = Symbol.get("TEST") conflator = PriceConflator("TEST", MarketDataPeriod.MIN_5, self.callback) start_time = datetime.datetime(2015, 7, 7, 14, 0, 0) tick = Tick(start_time.timestamp(), 9.0, 9.2) conflator.add_tick(tick) tick = Tick((start_time + datetime.timedelta(seconds=60)).timestamp(), 9.0, 9.2) conflator.add_tick(tick) tick = Tick((start_time + datetime.timedelta(seconds=120)).timestamp(), 8.7, 8.9) conflator.add_tick(tick) tick = Tick((start_time + datetime.timedelta(seconds=180)).timestamp(), 11.0, 11.2) conflator.add_tick(tick) tick = Tick((start_time + datetime.timedelta(seconds=240)).timestamp(), 10.5, 10.7) conflator.add_tick(tick) tick = Tick((start_time + datetime.timedelta(seconds=300)).timestamp(), 9.0, 9.2) conflator.add_tick(tick) tick = Tick((start_time + datetime.timedelta(seconds=360)).timestamp(), 9.0, 9.2) conflator.add_tick(tick) self.assertEqual(1, len(self.callbackQuote)) quote = self.callbackQuote[0] self.assertEqual(5, quote.ticks) self.assertEqual(9.1, quote.open) self.assertEqual(11.1, quote.high) self.assertEqual(8.8, quote.low) self.assertEqual(10.6, quote.close)
def run(self): database = {'user': '******', 'database': 'blackbox', 'host': "192.168.0.8"} Symbol.set_info_provider(MySQLSymbolProvider(database)) provider = MySQLProvider(database, Symbol.get('EURUSD:CUR'), MarketDataPeriod.HOUR_1) self.file_handle = open(r"market_data_d1.pkl", "wb") provider.startPublishing(lambda symbol, quote: self.add_quote(quote)) self.file_handle.close()
def analysis_symbols(self): """ This is a list of symbols which are used in this algorithm. :return: Array of Symbols used in this algorithm """ return [ (Symbol.get('EURUSD:CUR'), MarketDataPeriod.MIN_5, self.evaluate_quote_update), ]
def __init__(self, symbol, outfile, input_files): self.pending = [] self.totalTicks = 0 self.outfile = open(outfile, 'w+') for filename in input_files: logging.info("Processing '%s'" % (filename,)) data = CSVProvider(Symbol.get(symbol), filename) data.start_publishing(self.tick_handler) self.outfile.close()
def testShortLoss(self): s1 = Symbol.get("TEST") s1.lot_size = 10000 # LONG order = Order(s1, 1, Entry(Entry.Type.MARKET), Direction.SHORT) tick = Tick(datetime.utcnow(), 1.12239, 1.12245) # spread of 0.6 position = Position(order, tick) tick = Tick(datetime.utcnow(), 1.12259, 1.12265) position.close(tick) self.assertAlmostEquals(-2, position.points_delta())
def run(self): database = { 'user': '******', 'database': 'blackbox', 'host': "192.168.0.8" } Symbol.set_info_provider(MySQLSymbolProvider(database)) provider = MySQLProvider(database, Symbol.get('EURUSD:CUR'), MarketDataPeriod.HOUR_1) self.file_handle = open(r"market_data_d1.pkl", "wb") provider.startPublishing(lambda symbol, quote: self.add_quote(quote)) self.file_handle.close()
def testModifiedStopLoss(self): s1 = Symbol.get("TEST") s1.lot_size = 10000 # LONG order = Order(s1, 1, Entry(Entry.Type.MARKET), Direction.SHORT) tick = Tick(datetime.utcnow(), 1.12239, 1.12245) # spread of 0.6 position = Position(order, tick) self.assertIsNone(position.stop_price) position.update(stop_loss=StopLoss(StopLoss.Type.FIXED, 2)) self.assertIsNotNone(position.stop_price) self.assertEqual(1.12265, position.stop_price)
def __init__(self, symbol, user, database, host, input_files): self.pending = [] self.totalTicks = 0 self._db_connection = connector.connect(user=user, database=database, host=host) self.cursor = self._db_connection.cursor(buffered=True) self.cursor.execute("SET unique_checks=0;") self.cursor.execute("SET autocommit=0;") for filename in input_files: logging.info("Processing '%s'" % (filename,)) data = CSVProvider(Symbol.get(symbol), filename) data.start_publishing(self.tick_handler) self._db_connection.commit() self.cursor.execute("SET unique_checks=1;") self.cursor.close() self._db_connection.close()
def __init__(self, symbol, user, database, host, input_files): self.pending = [] self.totalTicks = 0 self._db_connection = connector.connect(user=user, database=database, host=host) self.cursor = self._db_connection.cursor(buffered=True) self.cursor.execute("SET unique_checks=0;") self.cursor.execute("SET autocommit=0;") for filename in input_files: logging.info("Processing '%s'" % (filename, )) data = CSVProvider(Symbol.get(symbol), filename) data.start_publishing(self.tick_handler) self._db_connection.commit() self.cursor.execute("SET unique_checks=1;") self.cursor.close() self._db_connection.close()
def testQuoteGap(self): s = Symbol.get("TEST") conflator = PriceConflator("TEST", MarketDataPeriod.MIN_5, self.callback) start_time = datetime.datetime(2015, 7, 7, 14, 10, 0) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 9.0, 9.2) # 14:11 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 8.7, 8.9) # 14:12 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 11.0, 11.2) # 14:13 conflator.add_tick(tick) start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 10.5, 10.7) # 14:14 conflator.add_tick(tick) self.assertEqual(0, len(self.callbackQuote)) # (All in 14:10:00) start_time = start_time + MarketDataPeriod.MIN_15 tick = Tick(start_time.timestamp(), 9.0, 9.2) # 14:29 conflator.add_tick(tick) self.assertEqual(3, len(self.callbackQuote)) # 14:15:00, 14:20:00, 14:25:00 start_time = start_time + MarketDataPeriod.MIN_1 tick = Tick(start_time.timestamp(), 10.5, 10.7) # 14:30 conflator.add_tick(tick) self.assertEqual(4, len(self.callbackQuote)) quote = self.callbackQuote[0] self.assertEqual(9.1, quote.open) self.assertEqual(11.1, quote.high) self.assertEqual(8.8, quote.low) self.assertEqual(10.6, quote.close) quote = self.callbackQuote[1] self.assertEqual(10.6, quote.open) self.assertEqual(10.6, quote.high) self.assertEqual(10.6, quote.low) self.assertEqual(10.6, quote.close)
def __init__(self, symbol, out_file, input_files): self.pending = [] self.totalTicks = 0 self.conn = sqlite3.connect(out_file) self.cursor = self.conn.cursor() self.cursor.execute("PRAGMA synchronous = OFF") self.cursor.execute("PRAGMA journal_mode = OFF") self.cursor.execute("CREATE TABLE IF NOT EXISTS tick_data(" "symbol varchar(64) NOT NULL," "timestamp timestamp NOT NULL," "bid NUMBER NOT NULL," "offer NUMBER NOT NULL)") self.cursor.execute("CREATE INDEX tick_data_timestamp_idx ON tick_data(timestamp)") for filename in input_files: logging.info("Processing '%s'" % (filename,)) data = CSVProvider(Symbol.get(symbol), filename) data.start_publishing(self.tickHandler)
def testSymbol(self): s1 = Symbol.get("TEST") s2 = Symbol.get("TEST") self.assertEqual(s1, s2) self.assertEqual(id(s1.__dict__), id(s2.__dict__))
def analysis_symbols(self): return [Symbol.get('EURUSD:CUR'), ]
def analysis_symbols(self): """ This is a list of symbols which are used in this algorithm. :return: Array of Symbols used in this algorithm """ return [(Symbol.get("EURUSD:CUR"), MarketDataPeriod.MIN_5, self.evaluate_quote_update)]
def analysis_symbols(self): return [ (Symbol.get('EURUSD:CUR'), self.time_period, self.evaluate_quote_update), (Symbol.get('EURUSD:CUR'), MarketDataPeriod.MIN_5, self.evaluate_risk) ]
def analysis_symbols(self): return [ Symbol.get('EURUSD:CUR'), ]