Librerías: Report - página 16

 
fxsaber #:

Es fácil, pero ¿por qué?

Al final de Report.mqh hay una entrada de este tipo.

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(PeticiónPrecioAbierto) + FIELD(PeticiónPrecioCerrado) +
                                      FIELD(Slippage) +
#endif // REPORT_SLIPPAGE
                                      FIELD(MagicNumber) + FIELD(LengthTime) + FIELD(Balance);

Para mover/eliminar una columna sólo tiene que cambiar esta secuencia en la fuente en consecuencia.

 

Usted tiene TurnOver cálculo en su informe.

Estoy tratando de hacer lo mismo, pero sin MT4Ordes.

Como ejemplo he encontrado tu post https://www.mql5.com/ru/forum/98421/page2#comment_2908365
Uno de los resultados: -149,96. El signo - se puede quitar fabs()
Y para el mismo cálculo a través de Informe: 13.839.230,40.

Y en este ejemplo el cálculo es sólo para un símbolo CalcHistorySlip( const string Symb) Bueno esto se puede resolver llamando a la función para cada símbolo.

¿Tal vez tengas un equivalente para MT5 que coincida con MT4Orders? Si no, lo dejaré como está o no lo incluiré en el gran informe en absoluto. Como no está claro cómo puede ayudar. Ahora estoy mostrando la suma de volúmenes. Para Expert Advisors de un solo símbolo, el resultado de ordenar por la suma de volúmenes y TurnOver desde MT4Orders es el mismo. Es decir, hay un reemplazo para TurnOver . Pero para multisymbol será diferente. Porque la suma de lotes de diferentes símbolos no son equivalentes en términos monetarios. TurnOver sería mejor.

Y la comparación de la clasificación por volumen con la variante para MT5 (código en el enlace de arriba) no coincide en absoluto.

 
Aleksei Kuznetsov #:

¿Tal vez tenga un equivalente para MT5 que coincida con MT4Orders?

¿Es eso lo que quieres decir?

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

Si no, lo dejaré como está o no lo incluiré en el gran informe en absoluto. Como no está claro cómo puede ayudar.

Volumen de negocios - cuánto dinero usted muele. Los brokers normales calculan la comisión a partir de él.

Si, por ejemplo, se requieren condiciones individuales, lo primero que preguntarán es el tamaño del volumen de negocios.

 
fxsaber #:

¿Es eso a lo que te refieres?

Volumen de negocio - la cantidad de dinero que muele. La comisión se calcula a partir de ella en los corredores normales.

Si, por ejemplo, se requieren condiciones individuales, lo primero que preguntarán es el tamaño del volumen de negocios.

Creo que debería ser así:

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

Además es necesario comprobar el tipo de símbolo, porque para los brokers no forex es necesario calcular el coste de un tick de la moneda base a la moneda de la cuenta (para forex - el coste de un tick se informa inmediatamente en la moneda de la cuenta).

 
Stanislav Korotky #:

Parece que debería serlo:

Además, es necesario comprobar el tipo de símbolo, porque para no Forex es necesario calcular el valor de la garrapata de la moneda base a la moneda de la cuenta (para Forex - el valor de la garrapata se informa inmediatamente en la moneda de la cuenta).

Copié esto de Report.mqh. También es así.

  // No se tienen en cuenta los diferentes valores de las operaciones rentables y perdedoras
  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()*/) // El beneficio puede ser cero - OrderType() > OP_SELL
      TickValue[Pos] = ::MathAbs(OrderProfit() / (TmpPips * Lots));

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

El informe funciona para el historial de operaciones con símbolos que no han estado en la Observación del Mercado durante mucho tiempo. Y no tiene ni idea de si es Forex u otra cosa. Sin embargo, la información del historial suele ser suficiente para calcular el volumen de operaciones.


ZY De las fuentes se deduce que si los precios de apertura y cierre no coinciden, el cálculo sigue esta fórmula.

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

¿Es eso a lo que te refieres?

Volumen de negocio - la cantidad de dinero que muele. La comisión se calcula a partir de ella en los corredores normales.

Si, por ejemplo, se requieren condiciones individuales, lo primero que preguntarán es el tamaño del volumen de negocios.

He reproducido lo que se hace en Report y he escrito sobre ello en el primer post. La ordenación por ellos coincide con la ordenación sólo por volúmenes.
El problema con la variante de cálculo sin Mt4Orders.
La función https://www.mql5.com/ru/forum/98421/page2#comment_2908365 da resultados bastante diferentes.

Uno de los resultados de esta función: -149,96. El signo - se puede quitar fabs()
Y para el mismo cálculo a través de Informe: 13.839.230,40.

¿Tal vez usted tiene un equivalente para MT5 que coincida con MT4Orders?

Si no, entonces la solución más fácil es ver si una operación realizada a través de funciones MT5 se puede ver en la historia a través de MT4Orders. Para ello

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

Si no es así, entonces la solución más fácil es si una operación realizada a través de funciones MT5 se puede ver en la historia a través de MT4Orders.

¡Eso es exactamente cómo funciona Report.mqh! O no entiendo las preguntas en absoluto hoy.
 
fxsaber #:
Entonces, ¡así es exactamente como funciona Report.mqh! O estoy malinterpretando completamente las preguntas de hoy.
Voy a intentarlo...
 
fxsaber #:
Turn_Over += (OrderOpenPrice() + OrderClosePrice()) * MathAbs(OrderProfit() / ((OrderClosePrice() - OrderOpenPrice()));

Se puede simplificar sustituyendo:

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

Sustituir

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

Borrar (PrecioCierreOrden()-PrecioAperturaOrden()))

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

Busquemos el tamaño de 1 lote/contrato:

lotSize = (int)SymbolInfoDouble(OrderSymbol(),SYMBOL_TRADE_CONTRACT_SIZE); // no disponible en modo estera, pero sí en MT5

Obtener lotSize para Virtual en modo mat de OrderProfit()=(OrderClosePrice()-OrderOpenPrice())) * OrderLots() * lotSize

if(OrderProfit()!=0){lotSize=OrderProfit()/((OrderClosePrice()-OrderOpenPrice())*OrderLots());}
else{lotSize=lotSize;}// encontrar o ignorar un caso raro por el mismo carácter

Total para 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;}//encontrar o descuidar un caso raro por el mismo símbolo
        
       //lotSize=_TickValue/_TickSize;// - alternativa - necesitas obtenerlo de Virtual
        Turn_Over += (OrderOpenPrice() + OrderClosePrice())*OrderLots()*lotSize;
   }}}
   return Turn_Over;
}

Para MT5: (esto es lo que quería obtener inicialmente y resultó ser mucho más fácil que en ese ejemplo ).

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;
}

Los resultados son exactamente los mismos.

Pero no estoy seguro si debo usar SYMBOL_TRADE_CONTRACT_SIZE en lugar de lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;
¿O el resultado es el mismo en teoría? En la práctica con un simple ejemplo de un carácter, sí.

 
Aleksei Kuznetsov #:

Total para Virtual

Es decir, tenemos lo que escribimos originalmente.

No estoy seguro de si debería utilizar SYMBOL_TRADE_CONTRACT_SIZE en lugar de lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;

¿O el resultado es el mismo en teoría? En la práctica con un ejemplo sencillo con un solo símbolo, sí.

El símbolo puede no estar en el Market Watch.