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)
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()))
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__))
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
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']))
def process(self, event): tg.send_me(event.to_text())
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))