def execute(self, args): if not args: Terminal.inst().action("Missing parameters", view='status') return False # ie: ":chart altbtc BTCUSDT" appliance = None market_id = None # optionnal timeframe (could depend of the strategy) timeframe = None if len(args) < 2: Terminal.inst().action("Missing parameters", view='status') return False try: appliance, market_id = args[0], args[1] if len(args) == 3: timeframe = timeframe_from_str(args[2]) except Exception: Terminal.inst().action("Invalid parameters", view='status') return False self._strategy_service.command( Strategy.COMMAND_TRADER_CHART, { 'appliance': appliance, 'market-id': market_id, 'timeframe': timeframe, 'monitor-url': self._monitor_service.url() })
def timeframe_from_param(self, param): if isinstance(param, str): return timeframe_from_str(param) elif isinstance(param, float): return param elif isinstance(param, int): return float(param) else: return 0.0
def execute(self, args): if not args: Terminal.inst().action("Missing parameters", view='status') return False appliance = None market_id = None timeframe = -1 action = "add-region" reg = "range" stage = 0 direction = 0 expiry = 0.0 created = self._strategy_service.timestamp low = 0.0 high = 0.0 cancelation = 0.0 # ie ":RR _ EURUSD 1.12 1.15" if len(args) < 4: Terminal.inst().action("Missing parameters", view='status') return False try: appliance, market_id = args[0], args[1] low = float(args[2]) high = float(args[3]) for value in args[4:]: if value.startswith("'"): timeframe = timeframe_from_str(value[1:]) elif value.startswith('C@'): cancelation = float(value[2:]) elif value.startswith('@'): # expiry if 'T' in value: # as local datetime expiry = datetime.strptime( value[1:], '%Y-%m-%dT%H:%M:%S').timestamp( ) # .replace(tzinfo=UTC()) else: # relative to now duration = timeframe_from_str(value[1:]) expiry = created + duration elif value in ("l", "L", "long", "LONG"): direction = 1 elif value in ("s", "S", "short", "SHORT"): direction = -1 elif value in ("e", "E", "entry", "ENTRY"): stage = 1 elif value in ("x", "X", "exit", "EXIT"): stage = -1 except Exception: Terminal.inst().action("Invalid parameters", view='status') return False self._strategy_service.command( Strategy.COMMAND_TRADER_MODIFY, { 'appliance': appliance, 'market-id': market_id, 'action': action, 'region': reg, 'created': created, 'stage': stage, 'direction': direction, 'timeframe': timeframe, 'expiry': expiry, 'low': low, 'high': high, 'cancelation': cancelation }) return True
def execute(self, args): if not args: Terminal.inst().action("Missing parameters", view='status') return False # ie: ":assign altbtc BTCUSDT EP@8500 SL@8300 TP@9600 0.521" appliance = None market_id = None # direction base on command name direction = 1 entry_price = None stop_loss = 0.0 take_profit = 0.0 quantity = 0.0 timeframe = Instrument.TF_4HOUR if len(args) < 4: Terminal.inst().action("Missing parameters", view='status') return False try: appliance, market_id = args[0], args[1] for value in args[2:]: if not value: continue if value.startswith("EP@"): entry_price = float(value[3:]) elif value.startswith("SL@"): stop_loss = float(value[3:]) elif value.startswith("TP@"): take_profit = float(value[3:]) elif value.startswith("'"): timeframe = timeframe_from_str(value[1:]) else: quantity = float(value) except Exception: Terminal.inst().action("Invalid parameters", view='status') return False if entry_price <= 0.0: Terminal.inst().action("Entry price must be specified", view='status') return False if stop_loss and stop_loss > entry_price: Terminal.inst().action("Stop-loss must be lesser than entry price", view='status') return False if take_profit and take_profit < entry_price: Terminal.inst().action( "Take-profit must be greater than entry price", view='status') return False if quantity <= 0.0: Terminal.inst().action("Quantity must be specified", view='status') return False self._strategy_service.command( Strategy.COMMAND_TRADE_ASSIGN, { 'appliance': appliance, 'market-id': market_id, 'direction': direction, 'entry-price': entry_price, 'quantity': quantity, 'stop-loss': stop_loss, 'take-profit': take_profit, 'timeframe': timeframe }) return True
def execute(self, args): if not args: Terminal.inst().action("Missing parameters", view='status') return False # ie: ":long altbtc BTCUSDT L@8500 SL@8300 TP@9600 1.0" appliance = None market_id = None # direction base on command name direction = -1 method = 'market' limit_price = None trigger_price = None stop_loss = 0.0 take_profit = 0.0 quantity_rate = 1.0 timeframe = Instrument.TF_4HOUR entry_timeout = None leverage = None if len(args) < 2: Terminal.inst().action("Missing parameters", view='status') return False try: appliance, market_id = args[0], args[1] for value in args[2:]: if not value: continue if value.startswith("L@"): method = 'limit' limit_price = float(value[2:]) elif value.startswith("T@"): method = 'trigger' trigger_price = float(value[2:]) elif value.startswith("SL@"): stop_loss = float(value[3:]) elif value.startswith("TP@"): take_profit = float(value[3:]) elif value.startswith("'"): timeframe = timeframe_from_str(value[1:]) elif value.startswith("*"): quantity_rate = float(value[1:]) elif value.endswith("%"): quantity_rate = float(value[:-1]) * 0.01 elif value.startswith("/"): entry_timeout = timeframe_from_str(value[1:]) elif value.startswith("x"): leverage = float(value[1:]) except Exception: Terminal.inst().action("Invalid parameters", view='status') return False if limit_price and stop_loss and stop_loss < limit_price: Terminal.inst().action( "Stop-loss must be greater than limit price", view='status') return False if limit_price and take_profit and take_profit > limit_price: Terminal.inst().action( "Take-profit must be lesser than limit price", view='status') return False if quantity_rate <= 0.0: Terminal.inst().action("Quantity must be non empty", view='status') return False self._strategy_service.command( Strategy.COMMAND_TRADE_ENTRY, { 'appliance': appliance, 'market-id': market_id, 'direction': direction, 'limit-price': limit_price, 'trigger-price': trigger_price, 'method': method, 'quantity-rate': quantity_rate, 'stop-loss': stop_loss, 'take-profit': take_profit, 'timeframe': timeframe, 'entry-timeout': entry_timeout, 'leverage': leverage }) return True
def do_importer(options): tool = Importer() Terminal.inst().info("Starting SIIS importer...") Terminal.inst().flush() # database manager Database.create(options) Database.inst().setup(options) # want speedup the database inserts Database.inst().enable_fetch_mode() filename = options.get('filename') detected_format = FORMAT_UNDEFINED detected_timeframe = None is_mtx_tick = False pathname = pathlib.Path(filename) if not pathname.exists(): error_exit(None, "File %s does not exists" % pathname.name) timeframe = None if not options.get('timeframe'): timeframe = None else: if options['timeframe'] in TIMEFRAME_FROM_STR_MAP: timeframe = TIMEFRAME_FROM_STR_MAP[options['timeframe']] else: try: timeframe = int(options['timeframe']) except: pass src = open(filename, "rt") if filename.endswith(".siis"): detected_format = FORMAT_SIIS elif filename.endswith(".csv"): # detect the format from the first row row = src.readline().rstrip('\n') if row.count('\t') > 0: if row.count( '\t' ) == 5 and row == "<DATE>\t<TIME>\t<BID>\t<ASK>\t<LAST>\t<VOLUME>": detected_format = FORMAT_MT5 detected_timeframe = Instrument.TF_TICK is_mtx_tick = True elif row.count( '\t' ) == 8 and row == "<DATE>\t<TIME>\t<OPEN>\t<HIGH>\t<LOW>\t<CLOSE>\t<TICKVOL>\t<VOL>\t<SPREAD>": detected_format = FORMAT_MT5 is_mtx_tick = False # from filename try to detect the timeframe parts = pathname.name.split('_') if len(parts) >= 2: detected_timeframe = MT5_TIMEFRAMES.get(parts[1]) # ignore the header line elif row.count(',') > 0: if row.count(',') == 4: detected_format = FORMAT_MT4 detected_timeframe = Instrument.TF_TICK is_mtx_tick = True elif row.count(',') == 6: detected_format = FORMAT_MT4 is_mtx_tick = False # from filename try to detect the timeframe parts = pathname.name.split('.') if len(parts) > 0: for mt_tf, tf in MT4_TIMEFRAMES.items(): if parts[0].endswith(mt_tf): detected_timeframe = tf break # reset because first row is data src.seek(0, 0) if detected_format == FORMAT_UNDEFINED: error_exit(src, "Unknown file format") if detected_format in (FORMAT_MT4, FORMAT_MT5): if detected_timeframe is not None and timeframe is None: Terminal.inst().message("Auto-detected timeframe %s" % timeframe_to_str(detected_timeframe)) if detected_timeframe and timeframe and detected_timeframe != timeframe: error_exit( src, "Auto-detected timeframe %s is different of specified timeframe %s" % (timeframe_to_str(detected_timeframe), timeframe_to_str(timeframe))) market_id = "" broker_id = "" # UTC option dates from_date = options.get('from') to_date = options.get('to') if detected_format == FORMAT_SIIS: # first row gives format details header = src.readline() if not header.startswith("format=SIIS\t"): error_exit(src, "Unsupported file format") info = header.split('\t') for nfo in info: k, v = nfo.split('=') if k == "version": if v != "1.0.0": error_exit(src, "Unsupported format version") elif k == "created": pass # informational only elif k == "broker": broker_id = v elif k == "market": market_id = v elif k == "from": pass # informational only elif k == "to": pass # informational only elif k == "timeframe": if v != "any": timeframe = timeframe_from_str(v) else: timeframe = None else: # need broker, market and timeframe broker_id = options.get('broker') market_id = options.get('market') if not broker_id: error_exit(src, "Missing target broker identifier") if not market_id or ',' in market_id: error_exit(src, "Missing or invalid target market identifier") if timeframe is None: if is_mtx_tick: timeframe = Instrument.TF_TICK elif detected_timeframe: timeframe = detected_timeframe else: error_exit(src, "Missing target timeframe") # limited sub-range from_date_str = from_date.strftime( "%Y-%m-%dT%H:%M:%SZ") if from_date else None to_date_str = to_date.strftime("%Y-%m-%dT%H:%M:%SZ") if to_date else None total_count = 0 try: if detected_format == FORMAT_SIIS: cur_timeframe = None cur_from_date = from_date cur_to_date = to_date while 1: row = src.readline() if not row: break row = row.rstrip("\n") if row.startswith("timeframe="): # specify the timeframe of the next rows k, v = row.split('=') cur_timeframe = timeframe_from_str(v) continue if cur_timeframe is None: # need a specified timeframe continue if cur_timeframe == Instrument.TF_TICK: total_count += import_tick_siis_1_0_0( broker_id, market_id, cur_from_date, cur_to_date, row) elif cur_timeframe > 0: total_count += import_ohlc_siis_1_0_0( broker_id, market_id, cur_timeframe, cur_from_date, cur_to_date, row) elif detected_format == FORMAT_MT4: cur_timeframe = timeframe if not is_mtx_tick else Instrument.TF_TICK cur_from_date = from_date cur_to_date = to_date if cur_timeframe == Instrument.TF_TICK: while 1: row = src.readline() if not row: break row = row.rstrip("\n") total_count += import_tick_mt4(tool, broker_id, market_id, cur_from_date, cur_to_date, row) elif cur_timeframe > 0: while 1: row = src.readline() if not row: break row = row.rstrip("\n") total_count += import_ohlc_mt4(broker_id, market_id, cur_timeframe, cur_from_date, cur_to_date, row) elif detected_format == FORMAT_MT5: cur_timeframe = timeframe if not is_mtx_tick else Instrument.TF_TICK cur_from_date = from_date cur_to_date = to_date if cur_timeframe == Instrument.TF_TICK: while 1: row = src.readline() if not row: break row = row.rstrip("\n") total_count += import_tick_mt5(tool, broker_id, market_id, cur_from_date, cur_to_date, row) elif cur_timeframe > 0: while 1: row = src.readline() if not row: break row = row.rstrip("\n") total_count += import_ohlc_mt5(broker_id, market_id, cur_timeframe, cur_from_date, cur_to_date, row) except Exception as e: error_logger.error(str(e)) finally: src.close() src = None Terminal.inst().info("Imported %s samples" % (total_count)) Terminal.inst().info("Flushing database...") Terminal.inst().flush() Database.terminate() Terminal.inst().info("Importation done!") Terminal.inst().flush() Terminal.terminate() sys.exit(0)