Интеграция MetaTrader 5 с Python для начинающих - страница 2

 
Mikhail Dovbakh:
Не

Запуск из MetaEditor'a

У Вас:

Python "C:\Program Files\Python37\python.exe" -u "C:\Users\Alex\AppData\Roaming\MetaQuotes\Terminal\BD115B570DAF19795DD0BA0C4463675D\MQL5\Scripts\Python\py\testPathBug.py" ETHRUB 15
Python Start path os,getcwd(): C:\Program Files\Swissquote Bank MT5 Client Terminal
Python ['C:', 'Program Files', 'Swissquote Bank MT5 Client Terminal']
Python end

у меня

Python  "C:\Users\barab\AppData\Local\Programs\Python\Python38\python.exe" -u "C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Scripts\Python\MyScr\os_getcwd.py" AUDUSD 30
Python  Start path os,getcwd(): C:\Windows\system32
Python  ['C:', 'Windows', 'system32']
Python  end


Разница в пути установки Python - Program Files против AppData. Пока только это вижу.

 
Vladimir Karputov:

Запуск из MetaEditor'a

У Вас:

у меня


Разница в пути установки Python - Program Files против AppData. Пока только это вижу.

  В любом случае это не ожидаемый результат. Голый Пайтон и коде правильно отвечают, про юпитер думаю тоже- он этот модуль к себе забрал.
А терминал отправляет в закрытые для записи директории. Это не правильно, наверное..
Мне этот путь нужен был для создания файлов и выгрузки результатов. А так плодить входные параметры придется.
 
MS VСоde на самом деле самое то, как редактор для меня. Подсветка и расшифровка функций. Многое другое.)
Метаэдитору ещё далеко -да и он под mql заточен.
Попробуйте).
Я его при поиске расбаланса скобок и сравнения двух файлов с кодом тоже часто использую...
 
Mikhail Dovbakh:
  В любом случае это не ожидаемый результат. Голый Пайтон и коде правильно отвечают, про юпитер думаю тоже- он этот модуль к себе забрал.
А терминал отправляет в закрытые для записи директории. Это не правильно, наверное..
Мне этот путь нужен был для создания файлов и выгрузки результатов. А так плодить входные параметры придется.

terminal_info модуля MetaTrader5 выдаёт такую информацию:

TerminalInfo(community_account=True, community_connection=True, connected=True, dlls_allowed=False, trade_allowed=False, tradeapi_disabled=False, 
email_enabled=False, ftp_enabled=False, notifications_enabled=True, mqid=True, build=3001, maxbars=100000, codepage=0, ping_last=58757, 
community_balance=160.28808, retransmission=0.0, company='MetaQuotes Software Corp.', name='MetaTrader 5', language='English', 
path='C:\\Program Files\\MetaTrader 5', 
data_path='C:\\Users\\barab\\AppData\\Roaming\\MetaQuotes\\Terminal\\D0E8209F77C8CF37AD8BF550E51FF075', 
commondata_path='C:\\Users\\barab\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common'
)".

Как видите здесь есть path, data_path и commondata_path


Скрипт python:

# Copyright © 2021, Vladimir Karputov
import MetaTrader5 as mt5

mt5.initialize()

# запросим статус и параметры подключения 
print(mt5.terminal_info())

mt5.shutdown()
Файлы:
 
Vladimir Karputov:

terminal_info модуля MetaTrader5 выдаёт такую информацию:

Как видите здесь есть path, data_path и commondata_path

Да, но где и на каком уровне вложенности сам модуль понять нельзя.. Плюс стандартное поведение - это как в примере запуска батника с голым пайтоном.
 
Mikhail Dovbakh:
Да, но где и на каком уровне вложенности сам модуль понять нельзя.. Плюс стандартное поведение - это как в примере запуска батника с голым пайтоном.

Стабильная версия Python 3.9.6 последняя. Сейчас старую удалю и поставлю 3,9,6.

 
Vladimir Karputov:

Стабильная версия Python 3.9.6 последняя. Сейчас старую удалю и поставлю 3,9,6.

Ага ... вызов из редактора:

2021.07.22 21:14:16.951 Python  "C:\Users\barab\AppData\Local\Programs\Python\Python39\python.exe" -u "C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Scripts\Python\MyScr\os_getcwd.py" AUDUSD 30
2021.07.22 21:14:17.025 Python  Start path os,getcwd(): C:\Program Files\MetaTrader 5
2021.07.22 21:14:17.025 Python  ['C:', 'Program Files', 'MetaTrader 5']
2021.07.22 21:14:17.025 Python  end

думаю нужно читать справку по 

getcwd

...

 
Vladimir Karputov:

Ага ... вызов из редактора:

думаю нужно читать справку по 

...

pathdir=os.path.dirname(__file__)

решает проблему.

 
Mikhail Dovbakh:
pathdir=os.path.dirname(__file__)

решает проблему.

Спасибо. Вызов из редактора:

2021.07.25 15:30:13.039 Python  C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Scripts\Python\MyScr

а это уже можно разобрать по кусочкам.

 

Какая дата передаётся из модуля Pyton в терминал?

Пример:

import MetaTrader5 as mt5 
from datetime import datetime, timedelta
import pandas as pd 
pd.set_option('display.max_columns', 500) # number of columns to be displayed 
pd.set_option('display.width', 1500)      # max table width to display 
# display data on the MetaTrader 5 package 
print("MetaTrader5 package author: ",mt5.__author__) 
print("MetaTrader5 package version: ",mt5.__version__) 
print() 
# establish connection to the MetaTrader 5 terminal 
if not mt5.initialize(): 
    print("initialize() failed, error code =",mt5.last_error()) 
    quit() 
  
# get the number of deals in history 
from_date=datetime.now()-timedelta(minutes=300)
to_date=datetime.now()+timedelta(minutes=1)
print("from date ",from_date," to date ",to_date)

# get deals for symbols whose names contain "GBP" within a specified interval 
deals=mt5.history_deals_get(from_date, to_date) 
if deals==None: 
    print("No deals, error code={}".format(mt5.last_error())) 
elif len(deals)> 0: 
      print("history_deals_get ",len(deals))
      # display all obtained deals 'as is' 
      for deal in deals: 
         print("  ",deal) 
      print() 
      # display these deals as a table using pandas.DataFrame 
      df=pd.DataFrame(list(deals),columns=deals[0]._asdict().keys()) 
      df['time'] = pd.to_datetime(df['time'], unit='s') 
      print(df) 
print("") 
  
# shut down connection to the MetaTrader 5 terminal 
mt5.shutdown() 

запрос истории от ... до ... . Распечатка полученных дат

2021.07.26 16:37:12.308 Python  MetaTrader5 package author:  MetaQuotes Software Corp.
2021.07.26 16:37:12.308 Python  MetaTrader5 package version:  5.0.34
2021.07.26 16:37:12.308 Python  
2021.07.26 16:37:12.323 Python  from date  2021-07-26 11:37:12.317743  to date  2021-07-26 16:38:12.317743
2021.07.26 16:37:12.323 Python  history_deals_get  1
2021.07.26 16:37:12.323 Python     TradeDeal(ticket=1035134037, order=1052486446, time=1627299010, time_msc=1627299010403, type=0, entry=0, magic=0, position_id=1052486446, reason=0, volume=0.01, price=110.205, commission=0.0, swap=0.0, profit=0.0, fee=0.0, symbol='USDJPY', comment='', external_id='')
2021.07.26 16:37:12.323 Python  
2021.07.26 16:37:12.338 Python         ticket       order                time       time_msc  type  entry  magic  position_id  reason  volume    price  commission  swap  profit  fee  symbol comment external_id
2021.07.26 16:37:12.338 Python  0  1035134037  1052486446 2021-07-26 11:30:10  1627299010403     0      0      0   1052486446       0    0.01  110.205         0.0   0.0     0.0  0.0  USDJPY                    
2021.07.26 16:37:12.338 Python  

При этом дата последней операции - 16:35:26, сделка 1035566306

В итоге: 

запрос от '2021-07-26 11:37:12.317743' сделка прошла в '2021-07-26 16:35:26' запрос до '2021-07-26 16:38:12.317743'

то есть сделка попадает между двумя датами.


Вопрос: почему, если сделка попадает в этот интервал, она не видна через Python?

Проверка истории при помощи MQL5:

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong deal_ticket;            // deal ticket
   ulong order_ticket;           // ticket of the order the deal was executed on
   datetime transaction_time;    // time of a deal execution
   long deal_type ;              // type of a trade operation
   long position_ID;             // position ID
   string deal_description;      // operation description
   double volume;                // operation volume
   string symbol;                // symbol of the deal
//--- set the start and end date to request the history of deals
   datetime from_date=D'2021.07.26 11:37:12';         // from the very beginning
   datetime to_date=D'2021.07.26 16:38:12';// till the current moment
//--- request the history of deals in the specified period
   HistorySelect(from_date,to_date);
//--- total number in the list of deals
   int deals=HistoryDealsTotal();
//--- now process each trade
   for(int i=0; i<deals; i++)
     {
      deal_ticket=               HistoryDealGetTicket(i);
      volume=                    HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
      transaction_time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
      order_ticket=              HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
      deal_type=                 HistoryDealGetInteger(deal_ticket,DEAL_TYPE);
      symbol=                    HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
      position_ID=               HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
      deal_description=          GetDealDescription(deal_type,volume,symbol,order_ticket,position_ID);
      //--- perform fine formatting for the deal number
      string print_index=StringFormat("% 3d",i);
      //--- show information on the deal
      Print(print_index+": deal #",deal_ticket," at ",transaction_time,deal_description);
     }
  }
//+------------------------------------------------------------------+
//| Returns the string description of the operation                  |
//+------------------------------------------------------------------+
string GetDealDescription(long deal_type,double volume,string symbol,long ticket,long pos_ID)
  {
   string descr;
//---
   switch(deal_type)
     {
      case DEAL_TYPE_BALANCE:
         return ("balance");
      case DEAL_TYPE_CREDIT:
         return ("credit");
      case DEAL_TYPE_CHARGE:
         return ("charge");
      case DEAL_TYPE_CORRECTION:
         return ("correction");
      case DEAL_TYPE_BUY:
         descr="buy";
         break;
      case DEAL_TYPE_SELL:
         descr="sell";
         break;
      case DEAL_TYPE_BONUS:
         return ("bonus");
      case DEAL_TYPE_COMMISSION:
         return ("additional commission");
      case DEAL_TYPE_COMMISSION_DAILY:
         return ("daily commission");
      case DEAL_TYPE_COMMISSION_MONTHLY:
         return ("monthly commission");
      case DEAL_TYPE_COMMISSION_AGENT_DAILY:
         return ("daily agent commission");
      case DEAL_TYPE_COMMISSION_AGENT_MONTHLY:
         return ("monthly agent commission");
      case DEAL_TYPE_INTEREST:
         return ("interest rate");
      case DEAL_TYPE_BUY_CANCELED:
         descr="cancelled buy deal";
         break;
      case DEAL_TYPE_SELL_CANCELED:
         descr="cancelled sell deal";
         break;
     }
   descr=StringFormat("%s %G %s (order #%d, position ID %d)",
                      descr,  // current description
                      volume, // deal volume
                      symbol, // deal symbol
                      ticket, // ticket of the order that caused the deal
                      pos_ID  // ID of a position, in which the deal is included
                     );
   return(descr);
//---
  }
//+------------------------------------------------------------------+

результат:

2021.07.26 16:47:17.582 Script 1 (USDJPY,M15)     0: deal #1035566306 at 2021.07.26 16:35:26sell 0.01 USDJPY (order #1052975546, position ID 1052486446)
Причина обращения: