Пример #1
0
    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()
            })
Пример #2
0
 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
Пример #3
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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
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)