Почему не правильно определяется профитность позиции? - страница 2

 
fxsaber:
Сомневаюсь. Маловероятно, но, возможно, это сможет помочь с историей

плюс проверил бы корректность работы HistorySelect. В тестере она, например, не работает, как надо.


Функция PositionGetDouble(POSITION_PROFIT)

показывает не правильно, потому что отсчёт идёт от последнего клиринга.

 
bool OrderProfit()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))
        {
         Print("Orders not found");
        }
      if(OrderType()==OP_BUY||OrderType()==OP_SELL)
      {
         if(OrderMagicNumber()==Magic)
        {
            if(OrderProfit()>0)
            return(true);
        }
      }
     }
   return (false);
  }
А так не пробовали?
 
Maksim Neimerik:
А так не пробовали?
Тогда уж так
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

void OnStart()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      OrderPrint();
}
 
Maksim Neimerik:
А так не пробовали?


И, здесь, никто пробовать не будет.

Это ФОРТС + МТ5

Добавлено

Кроме fxsaber :)

 
prostotrader:


И, здесь, никто пробовать не будет.

Это ФОРТС + МТ5

А, ну извините, не вкурсе)))
 
Maksim Neimerik:
А так не пробовали?

К сожалению....вопрос по мт5
 
prostotrader:


Функция PositionGetDouble(POSITION_PROFIT)

показывает не правильно, потому что отсчёт идёт от последнего клиринга.


ну я это понял, а как же тогда вычислить этот профит?
неужели не остается ничего, кроме как только фиксировать или смотреть цену открытия позиции и сравнивать ее с текущей ценой?

Для простого определения прибыльности конечно этого достаточно, но
а если необходимо определить профит или убыток в деньгах
и закрыть позицию по достижению определенного % от депозита?
в этом случае придется рассчитывать цену пункта для данного объема и умножать на их количество...
Неужели нет более простого способа выяснить профит позиции в деньгах?

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Gennady Mazur:


ну я это понял, а как же тогда вычислить этот профит?
неужели не остается ничего, кроме как только фиксировать или смотреть цену открытия позиции и сравнивать ее с текущей ценой?

Для простого определения прибыльности конечно этого достаточно, но
а если необходимо определить профит или убыток в деньгах
и закрыть позицию по достижению определенного % от депозита?
в этом случае придется рассчитывать цену пункта для данного объема и умножать на их количество...
Неужели нет более простого способа выяснить профит позиции в деньгах?


Ну, еслм Вам лень вставить в свой код готовую функцию и сделать пару простых мат. операций, то

попробуйте обратится к разработчикам, что бы они сделали "простую" функцию.

Добавлено

Попробуйте, может где-то ошибся (не проверял)

//+------------------------------------------------------------------+
//| Expert Get Profit function                                       |
//+------------------------------------------------------------------+
double GetProfit(const string a_symbol)
  {
   if(PositionSelect(a_symbol))
     {
      double price_in=0;
      double volume_in = 0;
      double price_out = 0;
      double volume_out= 0;
      double price=0;
      double volume=0;
      double price_last=SymbolInfoDouble(a_symbol,SYMBOL_LAST);
      ENUM_POSITION_TYPE pos_type=ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
      ulong pos_id=ulong(PositionGetInteger(POSITION_IDENTIFIER));

      if(pos_id>0)
        {
         if(HistorySelectByPosition(pos_id))
           {
            int deals=HistoryDealsTotal();

            for(int i=0; i<deals; i++)
              {
               ulong deal_ticket=HistoryDealGetTicket(i);
               ulong order_ticket=ulong(HistoryDealGetInteger(deal_ticket,DEAL_ORDER));

               if(order_ticket>0)
                 {
                  ENUM_DEAL_ENTRY deal_entry=ENUM_DEAL_ENTRY(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY));

                  if(deal_entry==DEAL_ENTRY_IN)
                    {
                     price=HistoryDealGetDouble(deal_ticket,DEAL_PRICE);
                     volume=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);

                     price_in+=price*volume;
                     volume_in+=volume;
                    }
                  else
                  if(deal_entry==DEAL_ENTRY_OUT)
                    {
                     price=HistoryDealGetDouble(deal_ticket,DEAL_PRICE);
                     volume=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);

                     price_out+=price*volume;
                     volume_out+=volume;
                    }
                 }
              }
            //---  
            price=price_in-price_out;
            volume=volume_in-volume_out;
            //---
            if(volume>0)
              {
               int symb_digits=int(SymbolInfoInteger(a_symbol,SYMBOL_DIGITS));
               if(pos_type==POSITION_TYPE_BUY)
                 {
                  return(NormalizeDouble( price_last - price/volume, symb_digits) );
                 }
               else
               if(pos_type==POSITION_TYPE_SELL)
                 {
                  return(NormalizeDouble( price/volume - price_last, symb_digits) );
                 }
              }
           }
         else
           {
            Print("GetProfit: Невозможно получить историю позиции по символу ",a_symbol);
           }
        }
      else
        {
         Print("GetGetProfit: Невозможно определить идентификатор позиции по символу ",a_symbol);
        }
     }
   return(0);
  }
 
prostotrader:


Ну, еслм Вам лень вставить в свой код готовую функцию и сделать пару простых мат. операций, то

попробуйте обратится к разработчикам, что бы они сделали "простую" функцию.

Добавлено

Попробуйте, может где-то ошибся (не проверял)


Спасибо... Да похоже ни как по другому...