НЕ РАБОТАЕТ HistorySelectByPosition()

Pavel Kolchin  

не могу посмотреть историю ордеров и сделок перевернутой позиции

MT5 netting

открываем например BUY 0.01

затем делаем SELL 0.05

позиция переворачивается с итоговым объемом 0.04

      Print("PositionsTotal = "+PositionsTotal());
      Print("PositionGetTicket = "+PositionGetTicket(0));
      Print("PositionSelectByTicket = "+PositionSelectByTicket(PositionGetTicket(0)));
      Print("HistorySelectByPosition = "+HistorySelectByPosition(PositionGetTicket(0)));
      Print("error = "+GetLastError());

итог

PositionsTotal = 1
PositionGetTicket = 11331410
PositionSelectByTicket = true
HistorySelectByPosition = false
error = 4753
Georgiy Merts  

Ну, так вроде ж в истории-то позиции еще нет...

В истории она появится после закрытия.

Pavel Kolchin  
George Merts:
запрашивает историю ордеров и сделок относящиеся к этой позиции
Vladimir Karputov  

Есть у меня скрипт, который лазит по истории ...


Добавлено: HistorySelect.mql5.

//+------------------------------------------------------------------+
//|                                               HistorySelect.mq5  |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "Исследование \"DEAL_POSITION_ID\" истории сделок"
#property script_show_inputs
//---
input datetime start=D'2016.08.05 09:00:00';
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
//  {
//   Print("This script cannot be run on a hedge; Этот скрипт нельзя запускать на хедж");
//   return;
//  }
   Print_IDs();
  }
//+------------------------------------------------------------------+
//| List all positions and deals                                     |
//+------------------------------------------------------------------+
void Print_IDs(void)
  {
//--- запрашиваем историю сделок и ордеров за указанный период серверного времени
   HistorySelect(start,TimeCurrent()+86400);
   uint     total    =HistoryDealsTotal();   // количество сделок в истории
   ulong    ticket   =0;                     // тикет сделки в истории
   long     type     =0;                     // тип сделки
   long     deal_id=0;   // идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка
   double   volume   =0.0;                   // объём сделки
   double   profit   =0.0;                   // финансовый результат сделки
   double   price    =0.0;                   // цена сделки
   string   symbol   =NULL;                  // имя символа, по которому произведена сделка
   long     entry    =0;                     // направление сделки – вход в рынок, выход из рынка или разворот
//--- for all deals 
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket 
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         //--- get deals properties 
         type     =HistoryDealGetInteger(ticket,DEAL_TYPE);
         deal_id  =HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
         volume   =HistoryDealGetDouble(ticket,DEAL_VOLUME);
         profit   =HistoryDealGetDouble(ticket,DEAL_PROFIT);
         price    =HistoryDealGetDouble(ticket,DEAL_PRICE);
         symbol   =HistoryDealGetString(ticket,DEAL_SYMBOL);
         entry    =HistoryDealGetInteger(ticket,DEAL_ENTRY);
         Print(EnumToString((ENUM_DEAL_ENTRY)entry),
               ", type ",EnumToString((ENUM_DEAL_TYPE)type),
               ", price ",DoubleToString(price,Digits()),
               ", Deal ",symbol," volume ",DoubleToString(volume,2),
               ", DEAL_POSITION_ID #",deal_id,
               ", profit ",DoubleToString(profit,2));
        }
     }
   Print("");
  }
//+------------------------------------------------------------------+

Я смоделировал Ваши условия:

MT5 netting

открываем BUY 0.01

затем делаем SELL 0.05

позиция переворачивается с итоговым объемом 0.04


Результат работы скрипта:

2017.06.13 03:54:18.082 DEAL_ENTRY_IN, type DEAL_TYPE_BUY, price 1.11977, Deal EURUSD volume 0.01, DEAL_POSITION_ID #153213021, profit 0.00
2017.06.13 03:54:18.083 
2017.06.13 03:54:48.775 DEAL_ENTRY_IN, type DEAL_TYPE_BUY, price 1.11977, Deal EURUSD volume 0.01, DEAL_POSITION_ID #153213021, profit 0.00
2017.06.13 03:54:48.775 DEAL_ENTRY_INOUT, type DEAL_TYPE_SELL, price 1.11967, Deal EURUSD volume 0.05, DEAL_POSITION_ID #153213021, profit -0.10
2017.06.13 03:54:48.775 

Обратите внимание: ID позиции не меняется.


То есть сама истории корректна. Сейчас посмотрю, что не так с HistorySelectByPosition()...

Файлы:
Vladimir Karputov  

А теперь запуск скрипта HistorySelectByPosition, во входных параметрах "153213021"...

Результат:

2017.06.13 04:05:49.666 position ID 153213021: 
2017.06.13 04:05:49.666   0: deal #136503882 at 2017.06.13 03:54:06 Вход в рынок, buy 0.01 EURUSD (order #153213021, position ID 153213021)
2017.06.13 04:05:49.666   1: deal #136503930 at 2017.06.13 03:54:37 Разворот, sell 0.05 EURUSD (order #153213069, position ID 153213021)
2017.06.13 04:05:49.666 Первая проверка не пройдена. IN=1, OUT=0

Как видите, HistorySelectByPosition() работает.

Vladimir Karputov  

Итог: неттинг, переворот позиции - PositionID остаётся неизменным, тогда как тикет позиции меняется. Соответственно, если использовать код

   Print("PositionsTotal = "+PositionsTotal());
   Print("PositionGetTicket = "+PositionGetTicket(0));
   Print("PositionSelectByTicket = "+PositionSelectByTicket(PositionGetTicket(0)));
   Print("HistorySelectByPosition = "+HistorySelectByPosition(PositionGetTicket(0)));
   Print("error = "+GetLastError());

после первого шага (открытие BUY 0.01), то всё отработает в true, а вот если запустить этот код после второго шага, то код отработает в false, так как у позиции будет уже другой тикет, хотя сохранится PositionID().

Причина обращения: