Время открытия позиции - довольно скользкое понятие. Это время первого ENTRY_IN или ENTRY_INOUT. Можно закрывать частично позицию (или доливать), а время ее открытия не будет меняться. Хотя логично, что после частичного закрытия это уже другая позиция. Поэтому возвращать сортировку по времени вовсе не требуется. Сортировка же истории есть.
Скорее всего, сортировка позиций идет по времени их последних изменений - времени соответствующих сделок в истории. В этом есть логика.
//| Select a position on the index |
//+------------------------------------------------------------------+
bool CPositionInfo::SelectByIndex(const int index)
{
ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
ulong ticket=PositionGetTicket(index);
if(ticket==0)
return(false);
}
else
{
string name=PositionGetSymbol(index);
if(name=="")
return(false);
}
//---
return(true);
}
Время открытия позиции - довольно скользкое понятие. Это время первого ENTRY_IN или ENTRY_INOUT. Можно закрывать частично позицию (или доливать), а время ее открытия не будет меняться. Хотя логично, что после частичного закрытия это уже другая позиция. Поэтому возвращать сортировку по времени вовсе не требуется. Сортировка же истории есть.
Скорее всего, сортировка позиций идет по времени их последних изменений - времени соответствующих сделок в истории. В этом есть логика.
Про время открытия (журнал):
2016.11.30 17:30:02.653 Trades '180653': market buy 0.01 AUDUSD sl: 0.73355 tp: 0.74455
*
2016.11.30 17:30:02.674 Trades '180653': accepted market sell 0.01 EURUSD sl: 1.06632 tp: 1.05422
2016.11.30 17:30:02.686 Trades '180653': accepted market buy 0.01 AUDUSD sl: 0.73355 tp: 0.74455
*
2016.11.30 17:30:02.748 Trades '180653': deal #30906140 sell 0.01 EURUSD at 1.05704 done (based on order #41087566)
2016.11.30 17:30:02.749 Trades '180653': order #41087566 sell 0.01 / 0.01 EURUSD at 1.05704 done in 97.684 ms
2016.11.30 17:30:02.752 Trades '180653': deal #30906141 buy 0.01 AUDUSD at 0.73812 done (based on order #41087567)
2016.11.30 17:30:02.753 Trades '180653': order #41087567 buy 0.01 / 0.01 AUDUSD at 0.73812 done in 101.827 ms
*
*
*
история (сделки)
После HistorySelectByPosition какое значение возвращает HistoryDealsTotal?
И опять же, нет логики в сортировке позиций по времени открытия. Она прослеживается только для сделок и ордеров.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
На неттинге, метод CPositionInfo::SelectByIndex() должен возвращать позиции в порядке сортировки по времени (msc) открытия позиции?
Или это изначально неправильное построение списка позиций методом PositionsTotal()?
Имеется три позиции, вот такой код:
//| Is sorting according to m_position.Ticket.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"
#include <Trade\PositionInfo.mqh>
CPositionInfo m_position; // trade position object
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
Print("Select By Index:");
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
if(m_position.SelectByIndex(i))
Print("position ticket ",m_position.Ticket(),", position opening in (msc)",m_position.TimeMsc());
}
//+------------------------------------------------------------------+
выдаёт:
2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5) position ticket 41106934, position opening in (msc)1480550551775
2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5) position ticket 41087567, position opening in (msc)1480530602752
2016.12.01 09:02:01.060 Is sorting according to m_position.Ticket (GBPUSD,M5) position ticket 41087566, position opening in (msc)1480530602746
Обратите внимание, позиция с тикетом 41087566 имеет время 1480530602746, но оказалась в списке после позиции с тикетом 41087567 и временем открытия 1480530602752.
Итак вопрос: изначально неверное составление списка методом PositionsTotal() или метод CPositionInfo::SelectByIndex():
//| Select a position on the index |
//+------------------------------------------------------------------+
bool CPositionInfo::SelectByIndex(const int index)
{
ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
ulong ticket=PositionGetTicket(index);
if(ticket==0)
return(false);
}
else
{
string name=PositionGetSymbol(index);
if(name=="")
return(false);
}
//---
return(true);
}
перекручивает список?
2016.12.01 08:05:55.336 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M @ 2.50GHz, RAM: 4926 / 8077 Mb, HDD: 385991 / 476372 Mb, GMT+02:00
2016.12.01 08:05:55.336 Terminal C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075