Exemplo n.º 1
0
    def price_alert(self, event):
        symbol = get_mt4_symbol(event.instrument)
        for resistance_level in self.resistance_suffix:
            key = '%s_%s' % (symbol, resistance_level)
            resistance = self.prices.get(key)
            if not resistance:
                continue

            price = Decimal(str(resistance))
            if event.bid > price:
                msg = '%s up corss %s = %s' % (symbol, resistance_level, price)
                logger.info('[PRICE_ALERT] %s' % msg)
                send_to_admin(msg)
                tg.send_me(msg)
                self.remove(key)

        for support_level in self.support_suffix:
            key = '%s_%s' % (symbol, support_level)
            support = self.prices.get(key)
            if not support:
                continue

            price = Decimal(str(support))
            if event.ask < price:
                msg = '%s down corss %s = %s' % (symbol, support_level, price)
                logger.info('[PRICE_ALERT] %s' % msg)
                send_to_admin(msg)
                tg.send_me(msg)
                self.remove(key)
Exemplo n.º 2
0
    def trade_closed(self, data):
        # fixme should not be here
        if 'tradeId' in data and data['tradeId'] != '':
            trade_id = int(data['tradeId'])
            if 'action' in data and data['action'] == 'I':
                closed_trade = fxcmpy_closed_position(self, data)

                event = TradeCloseEvent(
                    broker=self.broker,
                    account_id=self.fxcm.default_account,
                    trade_id=trade_id,
                    instrument=closed_trade.get_currency(),
                    side=OrderSide.BUY if closed_trade.get_isBuy() else OrderSide.SELL,
                    lots=closed_trade.get_amount(),
                    profit=closed_trade.get_grossPL(),
                    close_time=closed_trade.get_close_time(),
                    close_price=closed_trade.get_close(),
                    open_time=closed_trade.get_open_time(),
                    pips=closed_trade.get_visiblePL(),
                )
                self.put(event)
                tg.send_me('[FOREX_TRADE_CLOSE]\n%s#%s#%s %s->%s, pips=%s, lots=%s, profit=%s' % (
                    event.trade_id, event.instrument, event.side,
                    closed_trade.get_open(),
                    closed_trade.get_close(),
                    closed_trade.get_visiblePL(),
                    closed_trade.get_amount(),
                    closed_trade.get_grossPL()))
Exemplo n.º 3
0
 def process(self, event):
     if event.type == DebugEvent.type and self.account:
         if event.action.lower() == 'account':
             self.account.log_account()
         elif event.action.lower() == 'trade':
             self.account.log_trade()
         elif event.action.lower() == 'order':
             self.account.log_order()
         elif event.action.lower() == 'test_message':
             tg.send_me('Test message')
     else:
         print('[%s] %s' % (event.type, event.__dict__))
Exemplo n.º 4
0
 def check_market_status(self):
     current_status = is_market_open()
     if self.is_market_open != current_status:
         if current_status and self.market_open():
             self.is_market_open = current_status
             event = MarketEvent(MarketAction.OPEN)
             self.put(event)
             logger.info('[MarketEvent] Market opened.')
             tg.send_me('[MarketEvent] Forex market opened.')
         elif current_status is False:
             event = MarketEvent(MarketAction.CLOSE)
             self.handle_event(event)
             self.market_close()
             logger.info('[MarketEvent] Market closed.')
             tg.send_me('[MarketEvent] Forex market closed.')
             self.is_market_open = current_status
Exemplo n.º 5
0
    def trade_close(self, event):
        trade = self.get_trade(event.trade_id)
        if not trade:
            logger.error(
                '[TRADE_MANAGER] Trade closed with no data in trade manager.')
            return
        # entry accuracy= 1 - min / (max-min)
        # exit accuracy= 1 - profit missed / (max-min)
        # risk:reward= 1: max/-min or 1:max

        if trade['last_profitable_start']:
            self.update_profitable_seconds(trade)

        close_time = event.close_time
        close_price = event.close_price
        max = trade.get('max', 0)
        min = trade.get('min', 0)
        profit_pips = event.pips or profit_pip(
            trade.get('instrument'), trade.get('open_price'), close_price,
            trade.get('side'))
        profit_missed = max - profit_pips
        trade['profit_missed'] = profit_missed
        trade['entry_accuracy'] = round(1 - (abs(min) / (max - min)), 3)
        trade['exit_accuracy'] = round(1 - (profit_missed / (max - min)), 3)
        trade['risk'] = round(max / abs(min), 3) if min else max
        trade['close_price'] = close_price
        trade['close_time'] = close_time
        trade['profit_pips'] = profit_pips
        # trade['drawdown'] =

        trade['profitable_time'] = round(
            trade['profitable_seconds'] /
            (close_time - trade['open_time']).seconds, 3)
        logger.info('[TRADE_MANAGER] trade closed=%s' % trade)

        self.close_trade_to_db(event, trade)
        pop_trade = self.pop_trade(event.trade_id)
        if not pop_trade:
            logger.error(
                f'[TRADE_MANAGER] Managed trade missed before trade actual closed, trade_id={event.trade_id}'
            )

        self.saved_to_redis()
        tg.send_me(
            '[FOREX_TRADE_CLOSE_ANALYSIS]\n%s, profit_missed=%s, entry_accuracy=%s, exit_accuracy=%s, risk=%s'
            % (event.trade_id, trade['profit_missed'], trade['entry_accuracy'],
               trade['exit_accuracy'], trade['risk']))
Exemplo n.º 6
0
 def process(self, event):
     tg.send_me(event.to_text())
Exemplo n.º 7
0
    def open(self, event):
        if not self.validate_event(event):
            return

        # check order exist
        if self.check_trade_exist(event.instrument, event.side):
            logger.info('[ORDER_OPEN_SKIP] %s' % event.__dict__)
            return

        spread_pips = self.get_spread(event.instrument)
        if not spread_pips:
            logger.info('[ORDER_OPEN] cant get spread for %s' %
                        event.instrument)
            return
        if spread_pips > 3:
            logger.warning('[ORDER_OPEN] spread of %s is too large = %s' %
                           (event.instrument, spread_pips))
            return True  # push back into queue

            # check spread
        lots = self.account.get_lots(event.instrument)

        if not lots:
            logger.warning(
                '[TRADE_SKIP] reach max trades or not enough margin.')
            return

        if event.percent:
            lots = lots * event.percent

        try:
            trade = None
            if event.order_type == OrderType.MARKET:
                trade = self.account.market_order(
                    event.instrument,
                    event.side,
                    lots,
                    take_profit=event.take_profit,
                    stop_loss=event.stop_loss,
                    trailing_pip=event.trailing_stop)
            elif event.order_type == OrderType.LIMIT:
                trade = self.account.limit_order(
                    event.instrument,
                    event.side,
                    event.price,
                    lots,
                    take_profit=event.take_profit,
                    stop_loss=event.stop_loss,
                    trailing_pip=event.trailing_stop)
            elif event.order_type == OrderType.STOP:
                trade = self.account.stop_order(
                    event.instrument,
                    event.side,
                    event.price,
                    lots,
                    take_profit=event.take_profit,
                    stop_loss=event.stop_loss,
                    trailing_pip=event.trailing_stop)
        except Exception as ex:
            logger.error('[TRADE_OPEN_FAILED] %s, event=%s' % (ex, event))
            return

        event_dict = event.__dict__.copy()
        event_dict.pop('time')
        logger.info('[TRADE_OPEN] event = %s' % event_dict)

        open_time = trade.get_time()
        open_price = trade.get_buy() if trade.get_isBuy() else trade.get_sell()

        e = TradeOpenEvent(broker=self.account.broker,
                           account_id=self.account.account_id,
                           trade_id=int(trade.get_tradeId()),
                           lots=lots,
                           instrument=event.instrument,
                           side=event.side,
                           open_time=open_time,
                           open_price=open_price,
                           stop_loss=trade.get_stopRate(),
                           take_profit=trade.get_limitRate(),
                           magic_number=event.magic_number)
        self.put(e)
        tg.send_me('[FOREX_TRADE_OPEN]\n%s@%s#%s %s@%s lots=%s' %
                   (event.strategy, event.instrument, event.trade_id,
                    event.side, open_price, lots))