Разделение открытых позиций на группы - страница 12

 
Sergey Voytsekhovsky:
Кажется получилось, на каждый ТэйкПрофит есть принт с минусами и на каждый вход в рынок - принт с плюсами. Извините за колхозный слэнг, но я абсолютный самоучка, общаться на эту тему нескем, словей не знаю.


Да и я самоучка. В общем это я сокращал, сокращал код и досокращался... Если-бы не диалог с вами, то обнаружил-бы эти проблемы чуть позже...

Надо добавить в код выбор сделки перед чтением свойств.

    HistoryDealSelect(trans.deal);

или с проверкой успешности выбора.

    if(!HistoryDealSelect(trans.deal))
      Print(GetLastError());
 
Alexey Viktorov:

Да и я самоучка. В общем это я сокращал, сокращал код и досокращался... Если-бы не диалог с вами, то обнаружил-бы эти проблемы чуть позже...

Хоть в чем-то пригодился, всегда полезно поговорить, причем о том полезен будет разговор или нет, узнаешь позже. Таким образом максимально говорливые люди увеличивают минПользу путем усреднения, но уменьшают МаксПользу. Эк я загнул.

Надо добавить в код выбор сделки перед чтением свойств.

или с проверкой успешности выбора.

Это Ваши мысли вслух или так сделать рекомендуете мне ???

 

С функцией

bool  HistoryDealSelect( 
   ulong  ticket     // тикет сделки 
   );

нужно быть осторожнее, я там вычитал одну особенность, пока не знаю как ее использовать 

Функция HistoryDealSelect() очищает в mql5-программе список сделок, доступных для обращений, и копирует в него одну единственную сделку, если выполнение HistoryDealSelect() завершилось успешно.
 

Следующая задача - приглашаю осведомленных к обсуждению.

Как имея тикет сделки (закрыла позицию по ТР) вернуть тикет позиции, которая была закрыта этой сделкой?

2020.04.12 18:15:09.620 Core 1  2018.06.19 04:52:40   take profit triggered #6571 buy 0.01 EURUSD 1.16343 tp: 1.16389 [#6572 sell 0.01 EURUSD at 1.16389]
2020.04.12 18:15:09.620 Core 1  2018.06.19 04:52:40   deal #6572 sell 0.01 EURUSD at 1.16389 done (based on order #6572)
2020.04.12 18:15:09.620 Core 1  2018.06.19 04:52:40   deal performed [#6572 sell 0.01 EURUSD at 1.16389]
2020.04.12 18:15:09.620 Core 1  2018.06.19 04:52:40   order performed sell 0.01 at 1.16389 [#6572 sell 0.01 EURUSD at 1.16389]
2020.04.12 18:15:09.620 Core 1  2018.06.19 04:52:40   Закрыта позиция ---Тикет сделки--- 6572 ---Позицию в структуре ArrayDealOut пометить на удаление ------------

Дело в том, что у меня есть структура, в которой должны храниться актуальные позиции. По мере их выхода из игры, их нужно подчищать.

???

 
Sergey Voytsekhovsky:

Хоть в чем-то пригодился, всегда полезно поговорить, причем о том полезен будет разговор или нет, узнаешь позже. Таким образом максимально говорливые люди увеличивают минПользу путем усреднения, но уменьшают МаксПользу. Эк я загнул.

Это Ваши мысли вслух или так сделать рекомендуете мне ???

Не просто рекомендую, а вернул недавно удалённую строку в своём коде.

 
Sergey Voytsekhovsky:

С функцией

нужно быть осторожнее, я там вычитал одну особенность, пока не знаю как ее использовать 

Это смотря где делать выбор. В OnTradeTransaction это ничем не грозит. Да и вообще надо взять за привычку перед обращением к свойствам ордера, сделки или позиции выбирать его\её.

И не сто́ит забывать, что если после выбора выполнение переходит в какую-то функцию и в ней делается другой выбор, то по возвращении в списке будет то, что было выбрано последним.

 
Sergey Voytsekhovsky:

Следующая задача - приглашаю осведомленных к обсуждению.

Как имея тикет сделки (закрыла позицию по ТР) вернуть тикет позиции, которая была закрыта этой сделкой?

Дело в том, что у меня есть структура, в которой должны храниться актуальные позиции. По мере их выхода из игры, их нужно подчищать.

???

Ну это-же совсем просто...

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
   {
    if(!HistoryDealSelect(trans.deal))
      Print(GetLastError());
    /******************** Если открылась позиция********************/
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)
      Print("********** открытие сделка ", trans.deal, " позиция ", trans.position);
    /******************** Если закрылась позиция********************/
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
       {
        Print("********** закрытие по тейку сделка ", trans.deal, " позиция ", trans.position);
       }
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
       {
        Print("********** закрытие по стопу сделка ", trans.deal, " позиция ", trans.position);
       }
     }
   }
 }/*******************************************************************/
CN      0       19:20:27.920    !00 (GBPUSD.m,H1)       2020.02.03 12:01:20   ********** закрытие по стопу сделка 27 позиция 26
CG      0       19:20:27.920    !00 (GBPUSD.m,H1)       2020.02.03 12:01:20   ********** открытие сделка 28 позиция 28
HJ      0       19:20:28.023    Trade   2020.02.03 12:01:40   stop loss triggered #28 buy 0.1 GBPUSD.m 1.30698 sl: 1.30598 tp: 1.30798 [#29 sell 0.1 GBPUSD.m at 1.30598]
GE      0       19:20:28.023    Trades  2020.02.03 12:01:40   deal #29 sell 0.1 GBPUSD.m at 1.30598 done (based on order #29)
JF      0       19:20:28.023    Trade   2020.02.03 12:01:40   deal performed [#29 sell 0.1 GBPUSD.m at 1.30598]
CD      0       19:20:28.023    Trade   2020.02.03 12:01:40   order performed sell 0.1 at 1.30598 [#29 sell 0.1 GBPUSD.m at 1.30598]
GI      0       19:20:28.023    Trade   2020.02.03 12:01:40   market buy 0.1 GBPUSD.m sl: 1.30512 tp: 1.30712 (1.30598 / 1.30612 / 1.30598)
FQ      0       19:20:28.023    Trades  2020.02.03 12:01:40   deal #30 buy 0.1 GBPUSD.m at 1.30612 done (based on order #30)
QQ      0       19:20:28.023    Trade   2020.02.03 12:01:40   deal performed [#30 buy 0.1 GBPUSD.m at 1.30612]
ON      0       19:20:28.023    Trade   2020.02.03 12:01:40   order performed buy 0.1 at 1.30612 [#30 buy 0.1 GBPUSD.m at 1.30612]
KR      0       19:20:28.025    !00 (GBPUSD.m,H1)       2020.02.03 12:01:40   CTrade::OrderSend: market buy 0.10 GBPUSD.m sl: 1.30512 tp: 1.30712 [done at 1.30612]
RM      0       19:20:28.025    !00 (GBPUSD.m,H1)       2020.02.03 12:01:40   ********** закрытие по стопу сделка 29 позиция 28
FP      0       19:20:28.025    !00 (GBPUSD.m,H1)       2020.02.03 12:01:40   ********** открытие сделка 30 позиция 30
NK      0       19:20:28.295    Trade   2020.02.03 12:02:39   take profit triggered #30 buy 0.1 GBPUSD.m 1.30612 sl: 1.30512 tp: 1.30712 [#31 sell 0.1 GBPUSD.m at 1.30712]
IS      0       19:20:28.295    Trades  2020.02.03 12:02:39   deal #31 sell 0.1 GBPUSD.m at 1.30712 done (based on order #31)
NE      0       19:20:28.295    Trade   2020.02.03 12:02:39   deal performed [#31 sell 0.1 GBPUSD.m at 1.30712]
KI      0       19:20:28.295    Trade   2020.02.03 12:02:39   order performed sell 0.1 at 1.30712 [#31 sell 0.1 GBPUSD.m at 1.30712]
IH      0       19:20:28.295    Trade   2020.02.03 12:02:39   market buy 0.1 GBPUSD.m sl: 1.30626 tp: 1.30826 (1.30712 / 1.30726 / 1.30712)
EI      0       19:20:28.295    Trades  2020.02.03 12:02:39   deal #32 buy 0.1 GBPUSD.m at 1.30726 done (based on order #32)
LR      0       19:20:28.295    Trade   2020.02.03 12:02:39   deal performed [#32 buy 0.1 GBPUSD.m at 1.30726]
RL      0       19:20:28.295    Trade   2020.02.03 12:02:39   order performed buy 0.1 at 1.30726 [#32 buy 0.1 GBPUSD.m at 1.30726]
HR      0       19:20:28.297    !00 (GBPUSD.m,H1)       2020.02.03 12:02:39   CTrade::OrderSend: market buy 0.10 GBPUSD.m sl: 1.30626 tp: 1.30826 [done at 1.30726]
HS      0       19:20:32.663    !00 (GBPUSD.m,H1)       2020.02.03 12:02:39   ********** закрытие по тейку сделка 31 позиция 30
KP      0       19:20:32.663    !00 (GBPUSD.m,H1)       2020.02.03 12:02:39   ********** открытие сделка 32 позиция 32
 
Alexey Viktorov:

Это смотря где делать выбор. В OnTradeTransaction это ничем не грозит. Да и вообще надо взять за привычку перед обращением к свойствам ордера, сделки или позиции выбирать его\её.

И не сто́ит забывать, что если после выбора выполнение переходит в какую-то функцию и в ней делается другой выбор, то по возвращении в списке будет то, что было выбрано последним.

Блин, как же это все осознать, запредельная абстракция для меня.

Я вот только-что для решения вышеизложенного вопроса с поиском тикета позиции, закрытой известной сделкой - так сразу ее и запросил, из принта, так сразу вернулся к тому, с чего начал - в принт попадают далеко не все ТэйкПрофиты.

 
Alexey Viktorov:

Ну это-же совсем просто...

Ё-моё, у вас всё это время была "моя прелесть" и вы так скромно молчали???

Великое Вам мерси. 

Зато много нового узнал, а так просто перепостил бы и все - ни уму, ни сердцу.

 
Sergey Voytsekhovsky:

Ё-моё, у вас всё это время была "моя прелесть" и вы так скромно молчали???

Великое Вам мерси. 

Зато много нового узнал, а так просто перепостил бы и все - ни уму, ни сердцу.

Да ничего не было. Это я только-что написал для проверки и прогнал в дебагере на исторических данных. Научитесь пользоваться отладчиком. Это очень полезное умение.

Я начал программирование на васике в Excell так называемый VBA (визуальный васик для приложений) Там и познакомился с отладкой. Как-же мне после этого было сложно привыкнуть к принтам для контроля полученных значений... А когда ввели отладку в mql5 я радовался как ребёнок, что мои мучения закончены.