Ну, так вроде ж в истории-то позиции еще нет...
В истории она появится после закрытия.
Есть у меня скрипт, который лазит по истории ...
Добавлено: 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()...
А теперь запуск скрипта 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() работает.
Итог: неттинг, переворот позиции - 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().
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
не могу посмотреть историю ордеров и сделок перевернутой позиции
MT5 netting
открываем например BUY 0.01
затем делаем SELL 0.05
позиция переворачивается с итоговым объемом 0.04
итог