def get_order_history(date_from, date_to): res = mt5.history_deals_get(date_from, date_to) if res is not None and res != (): df = pd.DataFrame(list(res), columns=res[0]._asdict().keys()) df['time'] = pd.to_datetime(df['time'], unit='s') return df return pd.DataFrame()
def update_mt5_deal_details(self, strategy_id): position_ids = self.position_ids[strategy_id] for position_id in position_ids.values(): deals = mt5.history_deals_get(position=position_id) for deal in deals: self.mt5_deal_details[strategy_id][ 'commission'] += deal.commission self.mt5_deal_details[strategy_id]['swap'] += deal.swap self.mt5_deal_details[strategy_id]['fee'] += deal.fee self.mt5_deal_details[strategy_id]['earning'] += deal.profit self.mt5_deal_details[strategy_id][ 'balanced'] += deal.commission + deal.swap + deal.fee + deal.profit
def stop_and_gain(self, comment=''): if len(Mt5.positions_get()) == 1: points = (Mt5.positions_get()[0].profit * Mt5.symbol_info(self.symbol).trade_tick_size / Mt5.symbol_info(self.symbol).trade_tick_value) / \ Mt5.positions_get()[0].volume if points / Mt5.symbol_info(self.symbol).point >= self.take_profit: self.profit_deals += 1 self.close_position(comment) print( f'Take profit reached. (' f'{int(Mt5.history_deals_get((datetime.today() - timedelta(days=1)), datetime.now())[-1].profit)}' f')\n') if Mt5.history_deals_get((datetime.today() - timedelta(days=1)), datetime.now())[-1].symbol == \ self.symbol: self.balance += int( Mt5.history_deals_get( (datetime.today() - timedelta(days=1)), datetime.now())[-1].profit) self.statistics() elif ((points / Mt5.symbol_info(self.symbol).point) * -1) >= self.stop_loss: self.loss_deals += 1 self.close_position(comment) print( f'Stop loss reached. (' f'{int(Mt5.history_deals_get((datetime.today() - timedelta(days=1)), datetime.now())[-1].profit)}' f')\n') if Mt5.history_deals_get((datetime.today() - timedelta(days=1)), datetime.now())[-1].symbol == \ self.symbol: self.balance += int( Mt5.history_deals_get( (datetime.today() - timedelta(days=1)), datetime.now())[-1].profit) self.statistics()
def OnLot(): l = Lot from_date = datetime.datetime(2020, 1, 1) to_date = datetime.datetime.today() + relativedelta(days=+1) pos = None pos = mt5.history_deals_get(from_date, to_date) if pos != None: p = len(pos) while (p > 0): p = p - 1 ps = pos[p].type print(pos[p]) if ps == 0 or ps == 1: if pos[p].profit < 0.0: l = pos[p].volume * 2 break return l
pd.set_option('display.max_columns', 500) # number of columns to be displayed pd.set_option('display.width', 1500) # max table width to display # 显示有关MetaTrader 5程序包的数据 print("MetaTrader5 package author: ", mt5.__author__) print("MetaTrader5 package version: ", mt5.__version__) print() # 建立与MetaTrader 5程序端的连接 if not mt5.initialize(): print("initialize() failed, error code =", mt5.last_error()) quit() # 获取历史中的交易数量 from_date = datetime(2020, 1, 1) to_date = datetime.now() # 获取指定时间间隔内且名称包含"GBP"的交易品种的交易 deals = mt5.history_deals_get(from_date, to_date, group="*GBP*") if deals == None: print("No deals with group=\"*USD*\", error code={}".format( mt5.last_error())) elif len(deals) > 0: print("history_deals_get({}, {}, group=\"*GBP*\")={}".format( from_date, to_date, len(deals))) # 获取名称中既不包含"EUR"也不包含"GBP"的交易品种的交易 deals = mt5.history_deals_get(from_date, to_date, group="*,!*EUR*,!*GBP*") if deals == None: print("No deals, error code={}".format(mt5.last_error())) elif len(deals) > 0: print("history_deals_get(from_date, to_date, group=\"*,!*EUR*,!*GBP*\") =", len(deals)) # display all obtained deals 'as is'
def job(): # 更新市场信息 for symbol_name in symbols: symbol_info_tick = mt5.symbol_info(symbol_name) market = {} print("symbol_info_tick ",symbol_info_tick); market["time"] = symbol_info_tick.time market["bid"] = symbol_info_tick.bid market["ask"] = symbol_info_tick.ask market["last"] = symbol_info_tick.last market["volume"] = symbol_info_tick.volume market["volume_real"] = symbol_info_tick.volume_real market["custome"] = symbol_info_tick.volume_real market["chart_mode"] = symbol_info_tick.chart_mode market["select"] = symbol_info_tick.select market["visible"] = symbol_info_tick.visible market["session_deals"] = symbol_info_tick.session_deals market["session_sell_orders"] = symbol_info_tick.session_sell_orders market["volumehigh"] = symbol_info_tick.volumehigh market["volumelow"] = symbol_info_tick.volumelow market["digits"] = symbol_info_tick.digits market["spread"] = symbol_info_tick.spread market["spread_float"] = symbol_info_tick.spread_float market["ticks_bookdepth"] = symbol_info_tick.ticks_bookdepth market["trade_calc_mode"] = symbol_info_tick.trade_calc_mode market["trade_mode"] = symbol_info_tick.trade_mode market["start_time"] = symbol_info_tick.start_time market["expiration_time"] = symbol_info_tick.expiration_time market["trade_stops_level"] = symbol_info_tick.trade_stops_level market["trade_freeze_level"] = symbol_info_tick.trade_freeze_level market["trade_exemode"] = symbol_info_tick.trade_exemode market["swap_mode"] = symbol_info_tick.swap_mode market["swap_rollover3days"] = symbol_info_tick.swap_rollover3days market["margin_hedged_use_leg"] = symbol_info_tick.margin_hedged_use_leg market["expiration_mode"] = symbol_info_tick.expiration_mode market["filling_mode"] = symbol_info_tick.filling_mode market["order_mode"] = symbol_info_tick.order_mode market["order_gtc_mode"] = symbol_info_tick.order_gtc_mode market["option_mode"] = symbol_info_tick.option_mode market["option_right"] = symbol_info_tick.option_right market["bid"] = symbol_info_tick.bid market["bidhigh"] = symbol_info_tick.bidhigh market["bidlow"] = symbol_info_tick.bidlow market["ask"] = symbol_info_tick.ask market["askhigh"] = symbol_info_tick.askhigh market["asklow"] = symbol_info_tick.asklow market["last"] = symbol_info_tick.last market["lasthigh"] = symbol_info_tick.lasthigh market["lastlow"] = symbol_info_tick.lastlow market["volume_real"] = symbol_info_tick.volume_real market["volumehigh_real"] = symbol_info_tick.volumehigh_real market["option_strike"] = symbol_info_tick.option_strike market["point"] = symbol_info_tick.point market["trade_tick_value"] = symbol_info_tick.trade_tick_value market["trade_tick_value_profit"] = symbol_info_tick.trade_tick_value_profit market["trade_tick_value_loss"] = symbol_info_tick.trade_tick_value_loss market["trade_tick_size"] = symbol_info_tick.trade_tick_size market["trade_contract_size"] = symbol_info_tick.trade_contract_size market["trade_accrued_interest"] = symbol_info_tick.trade_accrued_interest market["trade_face_value"] = symbol_info_tick.trade_face_value market["trade_liquidity_rate"] = symbol_info_tick.trade_liquidity_rate market["volume_min"] = symbol_info_tick.volume_min market["volume_max"] = symbol_info_tick.volume_max market["volume_step"] = symbol_info_tick.volume_step market["volume_limit"] = symbol_info_tick.volume_limit market["swap_long"] = symbol_info_tick.swap_long market["swap_short"] = symbol_info_tick.swap_short market["margin_initial"] = symbol_info_tick.margin_initial market["margin_maintenance"] = symbol_info_tick.margin_maintenance market["session_volume"] = symbol_info_tick.session_volume market["session_turnover"] = symbol_info_tick.session_turnover market["session_interest"] = symbol_info_tick.session_interest market["session_buy_orders_volume"] = symbol_info_tick.session_buy_orders_volume market["session_sell_orders_volume"] = symbol_info_tick.session_sell_orders_volume market["session_open"] = symbol_info_tick.session_open market["session_close"] = symbol_info_tick.session_close market["session_aw"] = symbol_info_tick.session_aw market["session_price_settlement"] = symbol_info_tick.session_price_settlement market["session_price_limit_min"] = symbol_info_tick.session_price_limit_min market["session_price_limit_max"] = symbol_info_tick.session_price_limit_max market["margin_hedged"] = symbol_info_tick.margin_hedged market["price_change"] = symbol_info_tick.price_change market["price_volatility"] = symbol_info_tick.price_volatility market["price_theoretical"] = symbol_info_tick.price_theoretical market["price_greeks_delta"] = symbol_info_tick.price_greeks_delta market["price_greeks_theta"] = symbol_info_tick.price_greeks_theta market["price_greeks_gamma"] = symbol_info_tick.price_greeks_gamma market["price_greeks_vega"] = symbol_info_tick.price_greeks_vega market["price_greeks_rho"] = symbol_info_tick.price_greeks_rho market["price_greeks_omega"] = symbol_info_tick.price_greeks_omega market["price_sensitivity"] = symbol_info_tick.price_sensitivity market["basis"] = symbol_info_tick.basis market["category"] = symbol_info_tick.category market["currency_base"] = symbol_info_tick.currency_base market["currency_profit"] = symbol_info_tick.currency_profit market["currency_margin"] = symbol_info_tick.currency_margin market["bank"] = symbol_info_tick.bank market["description"] = symbol_info_tick.description market["exchange"] = symbol_info_tick.exchange market["formula"] = symbol_info_tick.formula market["isin"] = symbol_info_tick.isin market["name"] = symbol_info_tick.name market["page"] = symbol_info_tick.page market["path"] = symbol_info_tick.path response = requests.post(server_url + "update_market/",json=market) json_response = response.json() print("json_response ",json_response ) position_get_no_param = mt5.positions_get() # 更新position order for trade_position in position_get_no_param: position = {} position["ticket"] = trade_position.ticket position["time"] = trade_position.time position["time_msc"] = trade_position.time_msc position["time_update"] = trade_position.time_update position["time_update_msc"] = trade_position.time_update_msc position["type"] = trade_position.type position["magic"] = trade_position.magic position["identifier"] = trade_position.identifier position["reason"] = trade_position.reason position["volume"] = trade_position.volume position["price_open"] = trade_position.price_open position["sl"] = trade_position.sl position["tp"] = trade_position.tp position["price_current"] = trade_position.price_current position["swap"] = trade_position.swap position["profit"] = trade_position.profit position["symbol"] = trade_position.symbol position["comment"] = trade_position.comment position["external_id"] = trade_position.external_id response = requests.post(server_url + "update_position_order/",json=position) json_response = response.json() print("position_response ",json_response ) # 更新 pending order pending_orders = mt5.orders_get() for pending_order in pending_orders: pending = {} pending["ticket"] = pending_order.ticket pending["time_setup"] = pending_order.time_setup pending["type"] = pending_order.type pending["state"] = pending_order.state pending["time_expiration"] = pending_order.time_expiration pending["time_done"] = pending_order.time_done pending["time_setup_msc"] = pending_order.time_setup_msc pending["time_done_msc"] = pending_order.time_done_msc pending["type_filling"] = pending_order.type_filling pending["type_time"] = pending_order.type_time pending["magic"] = pending_order.magic pending["reason"] = pending_order.reason pending["position_id"] = pending_order.position_id pending["position_by_id"] = pending_order.position_by_id pending["volume_initial"] = pending_order.volume_initial pending["volume_current"] = pending_order.volume_current pending["price_open"] = pending_order.price_open pending["sl"] = pending_order.sl pending["tp"] = pending_order.tp pending["price_current"] = pending_order.price_current pending["price_stoplimit"] = pending_order.price_stoplimit pending["symbol"] = pending_order.symbol pending["comment"] = pending_order.comment pending["external_id"] = pending_order.external_id response = requests.post(server_url + "update_pending_order/",json=pending) json_response = response.json() # 更新 deal order from_date = datetime(2020,11,30) deal_orders = mt5.history_deals_get(from_date, datetime.now()) for deal in deal_orders: deal_data = {} deal_data["ticket"] = deal.ticket deal_data["order"] = deal.order deal_data["time"] = deal.time deal_data["time_msc"] = deal.time_msc deal_data["type"] = deal.type deal_data["entry"] = deal.entry deal_data["magic"] = deal.magic deal_data["reason"] = deal.reason deal_data["position_id"] = deal.position_id deal_data["volume"] = deal.volume deal_data["price"] = deal.price deal_data["commission"] = deal.commission deal_data["swap"] = deal.swap deal_data["profit"] = deal.profit deal_data["fee"] = deal.fee deal_data["symbol"] = deal.symbol deal_data["comment"] = deal.comment deal_data["external_id"] = deal.external_id response = requests.post(server_url + "update_deal_order/",json=deal_data) json_response = response.json()
#____________retriving no of historical trades___________# fromDate = dt.datetime(2019, 8, 1) toDate = dt.datetime.now() historyOrder = mt5.history_orders_total( fromDate, toDate) #retrives number of trades in time range print("Total history orders:", historyOrder) #_________retriving historical order information__________# orerData = mt5.history_orders_get(fromDate, toDate) #by date range for i in orerData: print(i) orderData2 = mt5.history_orders_get(ticket=38110138) #by tickets for data in orderData2: print('\n', data) #______total no of historical deals(executed orders)_______# deals = mt5.history_deals_total(fromDate, toDate) print("\nTotal deals:", deals) #__________get information of historical deals___________# deals = mt5.history_deals_get(fromDate, toDate) #by date range for i in deals: print(i) deal = mt5.history_deals_get(ticket=17371248) #by tickets print(deal[0], '\n') for i in deal[0]: print(i) mt5.shutdown()
def f_leer_archivo(): Accounts = pd.read_excel('files/Accounts.xlsx') Names = list(Accounts['Name']) print('Los nombres son:', Names) Name = input('Ingrese nombre del integrante a analizar: ') if Name in Names: user = Accounts[Accounts['Name'] == Name] try: userid = int(user['Account_ID'].values[0]) userpass = str(user['Password'].values[0]) a = mt5.initialize(login=userid, server='MetaQuotes-Demo', password=userpass) except: try: userid = int(input('Ingrese su usuario en mt5: ')) userpass = str(getpass('Ingrese su contraseña: ')) a = mt5.initialize(login=userid, server='MetaQuotes-Demo', password=userpass) except: return print('La acción no fue válida, verifique sus datos') #Initialize MT5 if a: print('Se inició con éxito la cuenta') pos = mt5.history_deals_get(datetime(2020, 1, 1), datetime.now()) key = pos[0]._asdict().keys() orders = pd.DataFrame(list(pos), columns=key) Dates = pd.DataFrame({'Position': orders['position_id'].unique()}) opentime = [] closetime = [] price_o = [] price_c = [] for i in orders['position_id'].unique(): dates = np.array(orders['time'][orders['position_id'] == i]) prices = np.array(orders['price'][orders['position_id'] == i]) if len(dates) == 2: opentime.append(dates[0]) closetime.append(dates[1]) price_o.append(prices[0]) price_c.append(prices[1]) else: opentime.append(dates[0]) closetime.append(0) price_o.append(prices[0]) price_c.append(prices[-1]) Dates['Time'] = opentime Dates['Symbol'] = [ np.array(orders['symbol'][orders['position_id'] == i])[0] for i in orders['position_id'].unique() ] type_op = [ np.array(orders['type'][orders['position_id'] == i])[0] for i in orders['position_id'].unique() ] Dates['Type'] = ['buy' if i == 0 else 'sell' for i in type_op] Dates['Volume'] = [ np.array(orders['volume'][orders['position_id'] == i])[0] for i in orders['position_id'].unique() ] Dates['Price'] = price_o Dates['Time.1'] = closetime Dates['Price.1'] = price_c Dates['Commission'] = [ np.array(orders['commission'][orders['position_id'] == i])[-1] for i in orders['position_id'].unique() ] Dates['Swap'] = [ np.array(orders['swap'][orders['position_id'] == i])[-1] for i in orders['position_id'].unique() ] Dates['Profit'] = [ np.array(orders['profit'][orders['position_id'] == i])[-1] for i in orders['position_id'].unique() ] Dates = Dates[Dates['Time.1'] != 0] return Dates.sort_values(by='Time.1', ascending=True).reset_index(drop=True) else: print('No se pudo acceder a la cuenta') else: print('El nombre no fue válido, intente de nuevo')