Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.
А вот после ее закрытия ???
Пока она открыта можно определить ее Position_ID=PositionGetInteger(POSITION_IDENTIFIER);
После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...
что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?
Или можно использовать функции для обычной позиции?
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Times New Roman'}Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.
А вот после ее закрытия ???
Пока она открыта можно определить ее Position_ID=PositionGetInteger(POSITION_IDENTIFIER);
После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...
что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?
Или можно использовать функции для обычной позиции?
для дальнейшего обращения к элементам списка посредством соответствующих функций.
Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal().
Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(),
для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().
После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...
что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?
Тип закрытой позиции - противоположный тип последней сделки из полученной истории.
Время закрытия - время этой же сделки из полученной истории.
Общая комиссия - сумма комиссий всех сделок из полученной истории.
Профит - общий профит всех сделок из полученной истории.
Только Вы легко поймете, что нужность этих данных сомнительна, запустив такой советник
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2017.01.28 18:00
input int Amount = 5; // Количество OrderSend
input int Interval = 3; // Через сколько тиков делать очередной OrderSend
bool MyOrderSend( double Lots )
{
MqlTick Tick;
SymbolInfoTick(_Symbol, Tick);
MqlTradeRequest Request = {0};
Request.action = TRADE_ACTION_DEAL;
Request.symbol = _Symbol;
if (Lots > 0)
{
Request.volume = Lots;
Request.price = Tick.ask;
Request.type = ORDER_TYPE_BUY;
}
else
{
Request.volume = -Lots;
Request.price = Tick.bid;
Request.type = ORDER_TYPE_SELL;
}
MqlTradeResult Result;
return(OrderSend(Request, Result));
}
void OnInit()
{
MyOrderSend(1); // Открываем начальную BUY-позицию
}
void OnTick()
{
static int i = 1;
static int Count = 0;
if ((Count < Amount) && (i % Interval == 0))
if (MyOrderSend((Count %2 == 0) ? -0.99 : 0.99)) // попеременно уменьшаем и увеличиваем BUY-позу на 0.99 лота
Count++;
i++;
}
Отчет
Ордера | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Время открытия | Ордер | Символ | Тип | Объем | Цена | S / L | T / P | Время | Состояние | Комментарий | ||
2017.01.27 00:00:00 | 2 | EURUSD | buy | 1.00 / 1.00 | 1.06817 | 2017.01.27 00:00:00 | filled | |||||
2017.01.27 02:01:21 | 3 | EURUSD | sell | 0.99 / 0.99 | 1.06815 | 2017.01.27 02:01:21 | filled | |||||
2017.01.27 03:14:27 | 4 | EURUSD | buy | 0.99 / 0.99 | 1.06811 | 2017.01.27 03:14:27 | filled | |||||
2017.01.27 04:05:50 | 5 | EURUSD | sell | 0.99 / 0.99 | 1.06851 | 2017.01.27 04:05:50 | filled | |||||
2017.01.27 05:18:01 | 6 | EURUSD | buy | 0.99 / 0.99 | 1.06803 | 2017.01.27 05:18:01 | filled | |||||
2017.01.27 06:42:47 | 7 | EURUSD | sell | 0.99 / 0.99 | 1.06749 | 2017.01.27 06:42:47 | filled | |||||
2017.01.27 23:59:59 | 8 | EURUSD | sell | 0.01 / 0.01 | 1.06968 | 2017.01.27 23:59:59 | filled | end of test | ||||
Сделки | ||||||||||||
Время | Сделка | Символ | Тип | Направление | Объем | Цена | Ордер | Комиссия | Своп | Прибыль | Баланс | Комментарий |
2017.01.27 00:00:00 | 1 | balance | 0.00 | 0.00 | 10 000 000.00 | 10 000 000.00 | ||||||
2017.01.27 00:00:00 | 2 | EURUSD | buy | in | 1.00 | 1.06817 | 2 | 0.00 | 0.00 | 0.00 | 10 000 000.00 | |
2017.01.27 02:01:21 | 3 | EURUSD | sell | out | 0.99 | 1.06815 | 3 | 0.00 | 0.00 | -1.85 | 9 999 998.15 | |
2017.01.27 03:14:27 | 4 | EURUSD | buy | in | 0.99 | 1.06811 | 4 | 0.00 | 0.00 | 0.00 | 9 999 998.15 | |
2017.01.27 04:05:50 | 5 | EURUSD | sell | out | 0.99 | 1.06851 | 5 | 0.00 | 0.00 | 37.00 | 10 000 035.15 | |
2017.01.27 05:18:01 | 6 | EURUSD | buy | in | 0.99 | 1.06803 | 6 | 0.00 | 0.00 | 0.00 | 10 000 035.15 | |
2017.01.27 06:42:47 | 7 | EURUSD | sell | out | 0.99 | 1.06749 | 7 | 0.00 | 0.00 | -50.16 | 9 999 984.99 | |
2017.01.27 23:59:59 | 8 | EURUSD | sell | out | 0.01 | 1.06968 | 8 | 0.00 | 0.00 | 1.54 | 9 999 986.53 | end of test |
0.00 | 0.00 | -13.47 | 9 999 986.53 |
В тестере, к сожалению, новое представление не реализовано, но по отчету не сложно понять, что это будет в виде "одной строчки". Какую инфу и удобство несет эта одна строчка в данной ситуации - понять не могу. Можно месяцами очень активно торговать в режиме only BUY, при этом вместо полного закрытия позиции, оставлять мин. лот (0.01), который никакого риска не несет (копейки). И в итоге будет ОДНА строчка! Вместо того, чтобы показать, что здесь было куплено на 0.99, а здесь эти 0.99 были закрыты.
Одна строчка - одна позиция за месяцы активной торговли. Т.е. для неттинга инфа по позициям - почти ни о чем.
Для хеджа все гораздо проще с позициями и инфа легко приобретает нужный вид.
Попробуйте смотреть историю сделок. По ним можно определить и профит и ID позиции, в которую они входили и тип позиции.
Хорошо, значит после выбора позиции на истории мне надо определить количество сделок в этой позиции с помощью int HistoryDealsTotal();
а далее я смогу так определить например профит позиции?
{
double profit=0;
if(HistorySelectByPosition(id))
{
int deals=HistoryDealsTotal();
for(int i=0;i<deals;i++)
{
deal_ticket=HistoryDealGetTicket(i);
if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
{
profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
}
}
}
}
Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.
А вот после ее закрытия ???
Пока она открыта можно определить ее Position_ID=PositionGetInteger(POSITION_IDENTIFIER);
После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...
что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?
Или можно использовать функции для обычной позиции?
Вот скрипт, который смотрит историю и выводи такую информацию - тип операции, тип сделки, объём, символ, POSITION_ID:
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1) 5: deal #35911335 at 2017.02.03 08:33:39Выход из рынка, buy 0.01 EURUSD.m (order #46823937, position ID 46771241)
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1) 6: deal #35911336 at 2017.02.03 08:33:39Выход из рынка, sell 0.01 EURUSD.m (order #46823938, position ID 46751794)
если немного переделать, то будет выводить информацию только по нужному POSITION_ID
Вот скрипт, который смотрит историю и выводи такую информацию - тип операции, тип сделки, объём, символ, POSITION_ID:
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1) 5: deal #35911335 at 2017.02.03 08:33:39Выход из рынка, buy 0.01 EURUSD.m (order #46823937, position ID 46771241)
2017.02.06 20:31:58.196 HistoryDealGetTicket (NZDUSD.m,H1) 6: deal #35911336 at 2017.02.03 08:33:39Выход из рынка, sell 0.01 EURUSD.m (order #46823938, position ID 46751794)
если немного переделать, то будет выводить информацию только по нужному POSITION_ID
До этого у меня просто не было необходимости обращаться к истории сделок, а тут стратегия требует небольшой анализ истории, вот и возник вопрос.
Хорошо, значит после выбора позиции на истории мне надо определить количество сделок в этой позиции с помощью int HistoryDealsTotal();
а далее я смогу так определить например профит позиции?
{
double profit=0;
if(HistorySelectByPosition(id))
{
int deals=HistoryDealsTotal();
for(int i=0;i<deals;i++)
{
deal_ticket=HistoryDealGetTicket(i);
if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
{
profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
}
}
}
}
Нет, т.к. Вы смотрите все сделки на "выход". При переносе через день/клиринг (ФОРТС) будет некорректный результат. И только последнюю сделку Вы тоже не можете смотреть, т.к. позиция не всегда закрывается одной сделкой.
Это пример получения профита по закрытой позиции, получу я его так по всей позиции от ее начала до полного закрытия?
Вообще то, я тут смотрю только сделки на выход, которые принадлежат конкретной позиции...Работа только внутри дня, переносов нет...
Это пример получения профита по закрытой позиции, получу я его так по всей позиции от ее начала до полного закрытия?
Вы на ФОРТС собираетесь этот код использовать? Если да, то читайте внимательнее, что я написал. Если Ваша конкретная позиция существует на момент клиринга, то Вы зачтете клиринговую (-ые) сделки OUT.
Приведенным Вами кодом Вы часто будете получать некорректные значения.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Столкнулся с необходимостью определения данных по закрытой позиции для дальнейшего анализа.
Пока позиция набирается и открыта ее параметры определяются легко, есть ряд функций PositionGet...(), которые позволяют это сделать.
А вот после ее закрытия ???
Пока она открыта можно определить ее Position_ID=PositionGetInteger(POSITION_IDENTIFIER);
После этого на истории выбрать эту позицию if(HistorySelectByPosition(Position_ID)) и если она выбрана...
что потом? В буке ничего не нашел, только работа с ордерами. Как посмотреть например тип этой позиции, время закрытия, общую комиссию или ее профит?
Или можно использовать функции для обычной позиции?