Как профит то достать

 

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.




 

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.


void OnTradeTransaction(const MqlTradeTransaction & trans, const MqlTradeRequest & request, const MqlTradeResult & result) {

   ENUM_TRADE_TRANSACTION_TYPE  trans_type = trans.type;
   ENUM_DEAL_TYPE  deal_type = trans.deal_type;
   ENUM_ORDER_TYPE order_type = trans.order_type;
   ENUM_ORDER_STATE order_state = trans.order_state;

   MqlTradeTransaction trans_copy = trans;

// Открытие сделки
   if( trans.price != 0 && ( deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL ) && ( order_type == ORDER_TYPE_BUY || order_type == ORDER_TYPE_SELL )) {
      pender_order_add(trans_copy);
   }


// Закрытие сделки
   if(trans_type == TRADE_TRANSACTION_ORDER_DELETE  && ( order_type == ORDER_TYPE_BUY || order_type == ORDER_TYPE_SELL  ) ) {
      pender_order_del(trans_copy);
   }
}



Внутри  pender_order_del обработка закрытия сделки.

Там пытаюсь достать через HistoryDealGetDouble. Но возвращаются одни нули. Запара с тем какой Тикет для Deal . Я пробовал вручную ставить. Число 3 в истории видно, что сделка закрылась и там указан профит. Скриншот - https://i.imgur.com/3siOeZK.png

 
   long order = trans.order;
   long pos = trans.position; 
   double profit = HistoryDealGetDouble(order , DEAL_PROFIT);     // Тут я пробовал и position и вручную добавлять ( 2 и 3 и 4 )


Как достать тикет ? И как достать профит ? Комиссии и свопы уже подсчитаны в профите или надо их все складывать ?




Как достать тикет ? И как достать профит ?

 

А нашел. надо оказывается сначала сделать -    HistorySelectByPosition( position );  


Про комиссии и свопы всё равно не понятно, они включены в профит или нет. В History они отдельно показываются.


И как вы ловите Начало и Конец сделки ? 

 
Вы берете тикет ордера. А у ордера (Buy Stop, BuyLimit, Sell Stop, Sell Limit, Buy Stop Limit, Sell Stop Limit) по определению не может быть профита. Профит есть у позиции или сделки. В данном случае нужно брать тикет сделки (deal).
 
andreysneg #:

А нашел. надо оказывается сначала сделать -    HistorySelectByPosition( position );  


Про комиссии и свопы всё равно не понятно, они включены в профит или нет. В History они отдельно показываются.


И как вы ловите Начало и Конец сделки ? 

В хистори это в истории там есть и лосс и профит с учетом комиссий свопов...

Есть ф--ии стандартные - см. Ордер селект в цикле выбираете позицию - можно по тикету среди рыночных.
Если через позиции - там надо суммировать своп и комиссии.

 
andreysneg:

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.

Как достать тикет ? И как достать профит ?

Внимательно почитайте документацию по OnTradeTransaction() в частности по типам транзакций. Отловите тип транзакции TRADE_TRANSACTION_DEAL_ADD, затем отловите закрытие позиции DEAL_ENTRY_OUT и по тикету этой сделки получите профит, своп и комиссию. Но не забывайте, что комиссия берётся не только при закрытии позиции, но и при открытии…

 

DEAL_ENTRY_OUT  в onTradeTransaction не появляется никак.

В истории в списке Deal есть Type IN и OUT. . https://i.imgur.com/6jsBCO0.png

Вот как тут их достать . В переменых  trans, request, result  оно не появляется.  А так это хорошие ориентиры для входа и выхода. 

void OnTradeTransaction(const MqlTradeTransaction & trans, const MqlTradeRequest & request, const MqlTradeResult & result) 

 
andreysneg:

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.




 



Как достать тикет ? И как достать профит ?

Alexey Viktorov #:

Внимательно почитайте документацию по OnTradeTransaction() в частности по типам транзакций. Отловите тип транзакции TRADE_TRANSACTION_DEAL_ADD, затем отловите закрытие позиции DEAL_ENTRY_OUT и по тикету этой сделки получите профит, своп и комиссию. Но не забывайте, что комиссия берётся не только при закрытии позиции, но и при открытии…

Здесь для вас все есть - см. также CTrade().

2 Alexey Viktorov #: ему другое надо:  Как достать тикет ? И как достать профит ?

https://www.mql5.com/ru/articles/138

Как использовать торговые классы Стандартной библиотеки при написании советника
Как использовать торговые классы Стандартной библиотеки при написании советника
  • www.mql5.com
В статье рассказывается о том, как использовать основной функционал торговых классов Стандартной библиотеки при написании советников, в которых применяется открытие, закрытие и модификация позиции, проверка свободной маржи перед размещением торговых ордеров, размещение и удаление отложенных ордеров. Показано, как использовать торговые классы для получения свойств ордеров и сделок.
 
andreysneg:

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.




 



Как достать тикет ? И как достать профит ?

вот свежак читаете и достаете через перебор  в цикле по позициям..... 

https://www.mql5.com/ru/articles/13229

Выставление ордеров в MQL5
Выставление ордеров в MQL5
  • www.mql5.com
При создании любой торговой системы есть задача, которую необходимо эффективно решить. Эта задача заключается в выставлении ордеров либо в их автоматической обработке торговой системой. В статье рассмотрено создание торговой системы с точки зрения эффективного выставления ордеров.
 
andreysneg:

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.




 



Как достать тикет ? И как достать профит ?

вот в примере есть

в примере - аналогично и тикет и профит и комиссию и своп ловите...

ниже там на страничке смотрите


/+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- запрашиваем историю сделок и ордеров
   if(!HistorySelect(0, TimeCurrent()))
     {
      Print("HistorySelect() failed. Error ", GetLastError());
      return;
     }
 
//--- в цикле по списку сделок в истории счёта
   int total=HistoryDealsTotal();
   for(int i=0; i<total; i++)
     {
      //--- получаем тикет очередной сделки (сделка автоматически выбирается для получения её свойств)
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket==0)
         continue;
      
      //--- получаем тип и направление сделки и выводим заголовок для списка вещественных свойств выбранной сделки
      string type=DealTypeDescription((ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE));
      string entry=DealEntryDescription((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket, DEAL_ENTRY));
      PrintFormat("Double properties of an deal %s entry %s #%I64u:", type, entry, ticket);
      
      //--- распечатываем под заголовком все вещественные свойства выбранной сделки
      HistoryDealPropertiesDoublePrint(ticket, 12);
     }


https://www.mql5.com/ru/docs/trading/historydealgetdouble

Документация по MQL5: Торговые функции / HistoryDealGetDouble
Документация по MQL5: Торговые функции / HistoryDealGetDouble
  • www.mql5.com
Возвращает запрошенное свойство сделки. Свойство сделки должно быть типа double. Существует 2 варианта функции. 1. Непосредственно возвращает...
 
andreysneg:

Не могу достать профит и время закрытия сделки.  Вот так я ловлю открытие и закрытие сделки.




 



Как достать тикет ? И как достать профит ?

https://www.mql5.com/ru/docs/trading/historyselect

ловля профита: 

void OnStart()
  {
   color BuyColor =clrBlue;
   color SellColor=clrRed;
//--- request trade history
   HistorySelect(0,TimeCurrent());
//--- create objects
   string   name;
   uint     total=HistoryDealsTotal();
   ulong    ticket=0;
   double   price;
   double   profit;
   datetime time;
   string   symbol;
   long     type;
   long     entry;
//--- for all deals
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         //--- get deals properties
         price =HistoryDealGetDouble(ticket,DEAL_PRICE);
         time  =(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
         symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
         type  =HistoryDealGetInteger(ticket,DEAL_TYPE);
         entry =HistoryDealGetInteger(ticket,DEAL_ENTRY);
         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         //--- only for current symbol
         if(price && time && symbol==Symbol())
           {
            //--- create price object
            name="TradeHistory_Deal_"+string(ticket);
            if(entry) ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0);
            else      ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0);
            //--- set object properties
            ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0);
            ObjectSetInteger(0,name,OBJPROP_BACK,0);
            ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor);
            if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit));
           }
        }
     }
//--- apply on chart
   ChartRedraw();
  }


и два 

тикет как ловить

https://www.mql5.com/ru/docs/trading/historydealgetticket

Документация по MQL5: Торговые функции / HistorySelect
Документация по MQL5: Торговые функции / HistorySelect
  • www.mql5.com
Запрашивает историю сделок и ордеров за указанный период серверного времени. Параметры from_date [in]  Начальная дата запроса. to_date [in]...
 

Как вы любите усложнять себе жизнь. Вот это из моего советника. Всё лишнее удалено…

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    HistoryDealSelect(trans.deal);
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)
     {
// Что-то делаем тут, если позиция открылась…
     }
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)
     {
// Что-то делаем тут, если позиция закрылась…
     }
   }
 }/******************************************************************/
Профит может быть только в сделке DEAL_ENTRY_OUT…