Библиотеки: Report - страница 16

 
fxsaber #:

Это легко делается, но только зачем?

В конце Report.mqh есть такая запись.

static const string REPORT::Shablon = FIELD(N) + FIELD(Ticket) + FIELD(OpenTime) + FIELD(Type) + FIELD(Lots) + FIELD(Symbol) +
                                      FIELD(OpenPrice) + FIELD(StopLoss) + FIELD(TakeProfit) + FIELD(CloseTime) + FIELD(ClosePrice) +
                                      FIELD(Commission) + FIELD(Swap) + FIELD(Profit) + FIELD(Comment) + FIELD(Pips) +
#ifdef REPORT_SLIPPAGE
      //                                FIELD(OpenPriceRequest) + FIELD(ClosePriceRequest) +
                                      FIELD(Slippage) +
#endif // REPORT_SLIPPAGE
                                      FIELD(MagicNumber) + FIELD(LengthTime) + FIELD(Balance);

Чтобы переместить/удалить колонку нужно соответствующим образом изменить только эту последовательность в исходнике.

 

У вас в отчете есть расчет TurnOver.

Пытаюсь сделать такой же, но без MT4Ordes.

Как пример нашел ваш пост https://www.mql5.com/ru/forum/98421/page2#comment_2908365
Один из результатов: -149,96. Знак - можно убрать fabs()
А для того же расчета через Report: 13 839 230.40

И в этом примере расчет только для одного символа CalcHistorySlip( const string Symb)  Ну это можно решить вызывая функцию для каждого символа.

Может у вас есть эквивалент для МТ5 совпадающий с MT4Orders? Если нет, то оставлю как есть или вообще не буду включать в большой отчет. Т.к. неясно, чем это может помочь. Сейчас вывожу сумму объемов. Для односимвольных советников результат сортировки по сумме объемов и TurnOver из MT4Ordes одинаков. Т.е. есть замена для TurnOver . Но для мультисимвольных будет отличаться. Т.к. сумма лотов разных символов не эквивалентны в денежном выражении. TurnOver был бы лучше.

А сравнение сортировки по объемам с вариантом для МТ5 (код по ссылке выше) совсем не совпадает. 

Попробуйте взвешивать по объему количество пунктов каждой сделки.
Попробуйте взвешивать по объему количество пунктов каждой сделки.
  • 2016.10.20
  • www.mql5.com
мистер o O очень хорошо знает что такое DEAL Потому что Ку. Количество пунктов - средневзвешенное по объему количество пунктов каждой из сделок. может о О вполне и подойдет предложенный Вами вариант
 
Aleksei Kuznetsov #:

Может у вас есть эквивалент для МТ5 совпадающий с MT4Orders?

Вы про это?

OrderLots() * TickValue * (OrderOpenPrice() + OrderClosePrice())

Если нет, то оставлю как есть или вообще не буду включать в большой отчет. Т.к. неясно, чем это может помочь.

Торговый оборот - сколько денег перемалываете. С него и комиссия считается у нормальных брокеров.

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

 
fxsaber #:

Вы про это?

Торговый оборот - сколько денег перемалываете. С него и комиссия считается у нормальных брокеров.

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

Кажись, должно быть так:

OrderLots() * TickValue * fabs(OrderOpenPrice() - OrderClosePrice())

Плюс к чему нужно проверять тип символа, т.к. для нефорексных нужно пресчитывать стоимость тика из базовой валюты в валюту эккаунта (для форекса - стоимость тика сразу в валюте эккаунта сообщается).

 
Stanislav Korotky #:

Кажись, должно быть так:

Плюс к чему нужно проверять тип символа, т.к. для нефорексных нужно пресчитывать стоимость тика из базовой валюты в валюту эккаунта (для форекса - стоимость тика сразу в валюте эккаунта сообщается).

Это я скопипастил из Report.mqh. Там еще так.

  // Не учитывается разные значения для прибыльной и убыточной сделок
  static double GetTickValue()
  {
    static double TickValue[];

    const int Pos = REPORT::GetSymbolPos(OrderSymbol());
    const int Size = ::ArraySize(TickValue);

    if (Pos >= Size)
      TickValue[::ArrayResize(TickValue, Pos + 1) - 1] = 0; // https://www.mql5.com/ru/forum/170952/page142#comment_13691776

//    const double TmpPips = NormalizeDouble(OrderClosePrice() - OrderOpenPrice(), 8); // https://www.mql5.com/ru/forum/170952/page128#comment_10696343
    const double TmpPips = OrderClosePrice() - OrderOpenPrice();
    const double Lots = OrderLots();

    if (TmpPips && Lots/* && OrderProfit()*/) // Профит может быть нулевой - OrderType() > OP_SELL
      TickValue[Pos] = ::MathAbs(OrderProfit() / (TmpPips * Lots));

    return(TickValue[Pos]);
  }
    const double TickValue = (OrderType() <= OP_SELL) ? REPORT::GetTickValue() : 0;

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


ЗЫ Из исходников следует, что если цены открытия и закрытия не совпадают, то расчет идет по такой формуле.

(OrderOpenPrice() + OrderClosePrice()) * MathAbs(OrderProfit() / ((OrderClosePrice() - OrderOpenPrice()))
 
fxsaber #:

Вы про это?

Торговый оборот - сколько денег перемалываете. С него и комиссия считается у нормальных брокеров.

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

То что в Report сделано я воспроизвел и написал об этом в первом сообщении. Сортировки по ним совпадают с сортировкой по просто объемам.
Проблема с вариантом расчета без Mt4Orders.
Функция https://www.mql5.com/ru/forum/98421/page2#comment_2908365 дает совсем другие результаты

Один из результатов этой функции: -149,96. Знак - можно убрать fabs()
А для того же расчета через Report: 13 839 230.40

Может у вас есть эквивалент для МТ5 совпадающий с MT4Orders?

Если нет, то самое простое решение -  можно ли торговлю сделанную через MT5 функции потом посмотреть в истории через MT4Orders. Чтобы использовать вот это

OrderLots() * TickValue * (OrderOpenPrice() + OrderClosePrice())
Попробуйте взвешивать по объему количество пунктов каждой сделки.
Попробуйте взвешивать по объему количество пунктов каждой сделки.
  • 2016.10.20
  • www.mql5.com
мистер o O очень хорошо знает что такое DEAL Потому что Ку. Количество пунктов - средневзвешенное по объему количество пунктов каждой из сделок. может о О вполне и подойдет предложенный Вами вариант
 
Aleksei Kuznetsov #:

Если нет, то самое простое решение -  можно ли торговлю сделанную через MT5 функции потом посмотреть в истории через MT4Orders.

Так именно так и работает Report.mqh! Или я совсем не понимаю вопросы сегодня.
 
fxsaber #:
Так именно так и работает Report.mqh! Или я совсем не понимаю вопросы сегодня.
Попробую...
 
fxsaber #:
Turn_Over += (OrderOpenPrice() + OrderClosePrice()) * MathAbs(OrderProfit() / ((OrderClosePrice() - OrderOpenPrice()));

Можно упростить подставив:

OrderProfit()=(OrderClosePrice()-OrderOpenPrice()) * OrderLots() * lotSize

Подставим

Turn_Over += (OrderOpenPrice() + OrderClosePrice()) * MathAbs((OrderClosePrice()-OrderOpenPrice()) * OrderLots() * lotSize / ((OrderClosePrice() - OrderOpenPrice()));

Удалим (OrderClosePrice()-OrderOpenPrice())

Turn_Over += (OrderOpenPrice() + OrderClosePrice()) * OrderLots() * lotSize;

Найдем размер 1 лота/контракта:

lotSize = (int)SymbolInfoDouble(OrderSymbol(),SYMBOL_TRADE_CONTRACT_SIZE); //не доступен в мат режиме, но есть в МТ5

Получим lotSize для Virtual в мат. режиме из OrderProfit()=(OrderClosePrice()-OrderOpenPrice()) * OrderLots() * lotSize

if(OrderProfit()!=0){lotSize=OrderProfit()/((OrderClosePrice()-OrderOpenPrice())*OrderLots());}
else{lotSize=lotSize;}//по этому же символу найти или пренебречь редким случаем

Итого для Virtual

double CalcMt4TurnOver(){
   double lotSize=100000, Turn_Over=0;
   for (int i = 0; i < OrdersHistoryTotal(); i++){
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) ){
        if(OrderType()<2){
        if(OrderProfit()!=0){lotSize=OrderProfit()/((OrderClosePrice()-OrderOpenPrice())*OrderLots());}//
        //else{lotSize=lotSize;}//по этому же символу найти или пренебречь редким случаем
        
        //lotSize=_TickValue/_TickSize;// - альтернатива - нужно достать из Virtual
        Turn_Over += (OrderOpenPrice() + OrderClosePrice())*OrderLots()*lotSize;
   }}}
   return Turn_Over;
}

Для МТ5: (именно это я хотел получить изначально и оказалось намного проще, чем в том примере)

double CalcMt5TurnOver(){
  double lotSize, Turn_Over=0;
  for (int i = 0; i < ::HistoryDealsTotal(); i++){
    const ulong ticket = ::HistoryDealGetTicket(i);
    if (((HistoryDealGetInteger(ticket,DEAL_TYPE) < 2))){
      lotSize = (int)SymbolInfoDouble(HistoryDealGetString(ticket,DEAL_SYMBOL),SYMBOL_TRADE_CONTRACT_SIZE);
      Turn_Over += HistoryDealGetDouble(ticket,DEAL_PRICE) * HistoryDealGetDouble(ticket,DEAL_VOLUME) * lotSize;
    }
  }
  return Turn_Over;
}

Результаты точно совпадают.

Но не уверен, что надо использовать SYMBOL_TRADE_CONTRACT_SIZE, а не lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;
Или результат по теории одинаков? На практике с простым примером с одним символом - да.

 
Aleksei Kuznetsov #:

Итого для Virtual

Т.е. получили то, что изначально написал.

не уверен, что надо использовать SYMBOL_TRADE_CONTRACT_SIZE, а не lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;

Или результат по теории одинаков? На практике с простым примером с одним символом - да.

Символа может не быть в Обзоре рынка.