Событие закрытия позиции по тейку - страница 2

 

В MT5 позиция может закрываться частично по TP/SL.

Например, позиция на 10 лотов закрывается так:

  1. 1 лот по TP.
  2. 2 лота по SL.
  3. 3 лота руками.
  4. 4 лота CloseBy.
 
fxsaber #:

В MT5 позиция может закрываться частично по TP/SL.

Например, позиция на 10 лотов закрывается так:

  1. 1 лот по TP.
  2. 2 лота по SL.
  3. 3 лота руками.
  4. 4 лота CloseBy.
Остальное - по стопаут :) 
 
Artyom Trishkin #:
Остальное - по стопаут :) 

Точно! Забыл.

 
Alexey Viktorov #:

Ренат, это самый плохой вариант. Если в mql4 есть только ордер и его тикет по которому в истории можно найти всё что надо, то в mql5 есть ордер открывающий позицию, сделка открывающая позицию, сама позиция, ордер закрывающий и сделка закрывающая. Позиции в истории нет. Ни тикета её нет, ни цены, ни времени. И что даст изменение количества открытых позиций? Только головную боль и гемор…

хотя не, вот чуток листинга с моего некогда боевого эксперта, писанного на MQL-5 :

         ArrayResize(Buys,0);

         ArrayResize(Sells,0);

         idxBuy=-1;

         idxSell=-1;

         for(i=OR-1; i>=0; i--)

         {

            tktOr=(int)PositionGetTicket(i);

            if(PositionGetString(POSITION_SYMBOL)==_Symbol)

            {

               profitOr=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_COMMISSION)+PositionGetDouble(POSITION_SWAP);

               lotOr=NormalizeDouble(PositionGetDouble(POSITION_VOLUME),LS);

               priceOr=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),DGT);

               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)

               {

                  idxSell=idxSell+1;

                  ArrayResize(Sells,idxSell+1);

                  Sells[idxSell,0]=lotOr;

                  Sells[idxSell,1]=priceOr;

                  Sells[idxSell,2]=tktOr;

                  Sells[idxSell,3]=profitOr;

               }

               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)

               {

                  idxBuy=idxBuy+1;

                  ArrayResize(Buys,idxBuy+1);

                  Buys[idxBuy,0]=lotOr;

                  Buys[idxBuy,1]=priceOr;

                  Buys[idxBuy,2]=tktOr;

                  Buys[idxBuy,3]=profitOr;

               }

            }

         }

         lenBuys=ArraySize(Buys)/4;

         if(lenBuys>0)ArraySort(Buys);

         lenSells=ArraySize(Sells)/4;

         if(lenSells>0)ArraySort(Sells);

         for (iSell=0; iSell<=lenSells-1; iSell++)

         {

            for(iBuy=0; iBuy<=lenBuys-1; iBuy++)

            {


Вот и сравнивай то что было и то что есть

История не нужна

;)

 
Renat Akhtyamov #:

хотя не, вот чуток листинга с моего некогда боевого эксперта, писанного на MQL-5 :

И в какой строке определяется что позиция закрылась по ТР?

 
Alexey Viktorov #:

И в какой строке определяется что позиция закрылась по ТР?

здесь просто принцип - как знать что было до того, и как запинать в массив все необходимые данные

надеюсь остальное дописать не составит труда

 
Renat Akhtyamov #:

здесь просто принцип - как знать что было до того, и как запинать в массив все необходимые данные

надеюсь остальное дописать не составит труда

Вот именно в этом и есть трудность.

Когда позиция закрылась, её в истории нет, есть только ордера и сделки. Для того чтобы определить. что позиция закрылась по тейку, надо выбрать все сделки относящиеся к этой позиции, определить, что именно эта сделка является закрывающей и только потом определить как она закрыта. Вот и весь гемор. А в функции OnTradeTransaction() сделка уже вот она… Только проверить и определить.

 
Alexey Viktorov #:

Вот именно в этом и есть трудность.

Когда позиция закрылась, её в истории нет, есть только ордера и сделки. Для того чтобы определить. что позиция закрылась по тейку, надо выбрать все сделки относящиеся к этой позиции, определить, что именно эта сделка является закрывающей и только потом определить как она закрыта. Вот и весь гемор. А в функции OnTradeTransaction() сделка уже вот она… Только проверить и определить.

я ведь сказал уже выше

история не нужна, мы ее для себя сделали самостоятельно и как нам надо

и привел пример - как это сделать

не стало позиции с тейк-профитом таким то в массиве по отношению к открытым, вот и все

в чем трудность то?, не понимаю

 
Renat Akhtyamov #:

я ведь сказал уже выше

история не нужна, мы ее для себя сделали самостоятельно и как нам надо

и привел пример - как это сделать

не стало позиции с тейк-профитом таким то в массиве по отношению к открытым, вот и все

в чем трудность то?, не понимаю

Позиция закрылась по стопу «не стало позиции с тейк-профитом таким то в массиве» И что? А надо определить, что позиция закрылась именно по тейку… И никак иначе, не советником или скриптом закрыта, не  руками не по стоп-ауту, а именно по тейку.

 
Alexey Viktorov #:

Позиция закрылась по стопу «не стало позиции с тейк-профитом таким то в массиве» И что? А надо определить, что позиция закрылась именно по тейку… И никак иначе, не советником или скриптом закрыта, не  руками не по стоп-ауту, а именно по тейку.

да вроде нет :-)  (я сам давно еще на это внимание обратил) он сам выборку делает через

DEAL_REASON_TР

, что по ТР закрылась...

"Добрый вечер. Как отследить событие закрытия рыночной позиции по тейку? Только не просто сработка тейка, а уточнение какой тип позиции закрылся (покупка или продажа).

Я пользуюсь своими классами для написания кода. В общем, прилагаю метод из своего класса, чтобы пояснить что у меня написано:

//=======================================================================================================================================================================================================
// Возвращает true, если позиция согласно данных в реализованной сделке закрылась по Take-Profit, иначе false. ==========================================================================================
   bool Event :: isPositionAcquireTP(const MqlTradeTransaction& transaction,    // Транзакция
                                     const SymbolInstance *ptrSymbol,           // Указатель на класс свойств торгового инструмента
                                     const ulong magic) {                       // Magic number позиции
//---
  if (transaction.type == TRADE_TRANSACTION_DEAL_ADD) {
    if (!historyDeals.choiceDealPrimary(ptrSymbol.getName(), magic, transaction.deal))
      return false;
    if (historyDeals.selectedHistoryDealEntry(transaction.deal) == DEAL_ENTRY_OUT) {
      if (historyDeals.selectedHistoryDealReason(transaction.deal) == DEAL_REASON_TP)