Bibliotecas: Report - página 16

 
fxsaber #:

Isso é fácil de fazer, mas por quê?

No final do Report.mqh há uma entrada desse 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(OpenPriceRequest) + FIELD(ClosePriceRequest) +
                                      FIELD(Slippage) +
#endif // REPORT_SLIPPAGE
                                      FIELD(MagicNumber) + FIELD(LengthTime) + FIELD(Balance);

Para mover/excluir uma coluna, você precisa alterar apenas essa sequência na fonte de acordo.

 

Você tem o cálculo do TurnOver em seu relatório.

Estou tentando fazer o mesmo, mas sem o MT4Ordes.

Como exemplo, encontrei sua postagem https://www.mql5.com/ru/forum/98421/page2#comment_2908365
Um dos resultados: -149,96. O sinal - você pode remover fabs()
E para o mesmo cálculo via Relatório: 13.839.230,40.

E, nesse exemplo, o cálculo é apenas para um símbolo CalcHistorySlip( const string Symb) Bem, isso pode ser resolvido chamando a função para cada símbolo.

Talvez você tenha um equivalente para o MT5 que corresponda ao MT4Orders? Caso contrário, deixarei como está ou não a incluirei no relatório geral. Como não está claro como isso pode ajudar. Agora estou gerando a soma dos volumes. Para os Expert Advisors de símbolo único, o resultado da classificação pela soma de volumes e TurnOver do MT4Orders é o mesmo. Ou seja, há um substituto para o TurnOver. Mas para os multissímbolos será diferente. Porque a soma de muitos símbolos diferentes não é equivalente em termos monetários. O TurnOver seria melhor.

E a comparação da classificação por volume com a variante para MT5 (código no link acima) não corresponde de forma alguma.

 
Aleksei Kuznetsov #:

Talvez você tenha um equivalente para o MT5 que corresponda ao MT4Orders?

É isso que você quer dizer?

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

Caso contrário, deixarei o relatório como está ou não o incluirei no relatório geral. Como não está claro como isso pode ajudar.

Volume de negócios - quanto dinheiro você negocia. As corretoras normais calculam a comissão a partir dele.

Se, por exemplo, forem exigidas condições individuais, a primeira coisa que eles perguntarão é o tamanho do volume de negócios.

 
fxsaber #:

É disso que você está falando?

Volume de negócios - quanto dinheiro você moe. A comissão é calculada a partir desse valor em corretoras normais.

Se, por exemplo, forem exigidas condições individuais, a primeira coisa que eles perguntarão é o tamanho do volume de negócios.

Acho que deveria ser assim:

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

Além disso, é necessário verificar o tipo de símbolo, porque, para as corretoras que não são de câmbio, é necessário calcular o custo de um tick da moeda base para a moeda da conta (para forex, o custo de um tick é imediatamente informado na moeda da conta).

 
Stanislav Korotky #:

Parece que deveria ser:

Além disso, você precisa verificar o tipo de símbolo, pois, para o não forex, é necessário calcular o valor do tick da moeda base para a moeda da conta (para o forex, o valor do tick é informado imediatamente na moeda da conta).

Copiei isso do Report.mqh. Também é assim.

  // Valores diferentes para negociações lucrativas e perdedoras não são levados em consideração
  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()*/) // O lucro pode ser zero - OrderType() > OP_SELL
      TickValue[Pos] = ::MathAbs(OrderProfit() / (TmpPips * Lots));

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

O relatório funciona para o histórico de negociação com símbolos que não estão no Market Watch há muito tempo. E ele não tem ideia se é Forex ou outra coisa. No entanto, as informações do histórico geralmente são suficientes para calcular o volume de negócios.


ZY De acordo com as fontes, se os preços de abertura e fechamento não coincidirem, o cálculo seguirá esta fórmula.

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

É disso que você está falando?

Volume de negócios - quanto dinheiro você moe. A comissão é calculada a partir desse valor em corretoras normais.

Se, por exemplo, forem exigidas condições individuais, a primeira coisa que eles perguntarão é o tamanho do volume de negócios.

Reproduzi o que é feito no Report e escrevi sobre isso na primeira postagem. A classificação por eles coincide com a classificação apenas por volumes.
O problema com a variante de cálculo sem Mt4Orders.
A função https://www.mql5.com/ru/forum/98421/page2#comment_2908365 fornece resultados bastante diferentes.

Um dos resultados dessa função: -149,96. O sinal - você pode remover fabs()
E para o mesmo cálculo via Report: 13.839.230,40.

Talvez você tenha um equivalente para o MT5 que corresponda ao MT4Orders?

Caso contrário, a solução mais fácil é verificar se uma negociação feita por meio das funções do MT5 pode ser visualizada no histórico por meio do MT4Orders. Para usar isso

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

Caso contrário, a solução mais fácil é saber se uma negociação feita por meio das funções do MT5 pode ser visualizada no histórico por meio do MT4Orders.

É exatamente assim que o Report.mqh funciona! Ou eu não estou entendendo nada das perguntas de hoje.
 
fxsaber #:
Então é exatamente assim que o Report.mqh funciona! Ou estou entendendo completamente errado as perguntas de hoje?
Vou tentar...
 
fxsaber #:
Turn_Over += (OrderOpenPrice() + OrderClosePrice()) * MathAbs(OrderProfit() / ((OrderClosePrice() - OrderOpenPrice()));

Isso pode ser simplificado com a substituição:

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

Substituir

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

Excluir (OrderClosePrice()-OrderOpenPrice()))

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

Vamos descobrir o tamanho de 1 lote/contrato:

lotSize = (int)SymbolInfoDouble(OrderSymbol(),SYMBOL_TRADE_CONTRACT_SIZE); // não está disponível no modo mat, mas está disponível no MT5

Obtenha o lotSize para o Virtual no modo mat a partir de OrderProfit()=(OrderClosePrice()-OrderOpenPrice())) * OrderLots() * lotSize

if(OrderProfit()!=0){lotSize=OrderProfit()/((OrderClosePrice()-OrderOpenPrice())*OrderLots());}
else{lotSize=lotSize;}// encontrar ou ignorar um caso raro do mesmo caractere

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 ou negligenciar um caso raro com o mesmo símbolo
        
       //lotSize=_TickValue/_TickSize;// - alternativa - você precisa obtê-lo do Virtual
        Turn_Over += (OrderOpenPrice() + OrderClosePrice())*OrderLots()*lotSize;
   }}}
   return Turn_Over;
}

Para MT5: (isso é o que eu queria obter inicialmente e acabou sendo muito mais fácil do que no exemplo ).

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

Os resultados são exatamente os mesmos.

Mas não tenho certeza se devo usar SYMBOL_TRADE_CONTRACT_SIZE em vez de lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;
Ou o resultado é o mesmo em teoria? Na prática, com um exemplo simples de um caractere, sim.

 
Aleksei Kuznetsov #:

Total para Virtual

Ou seja, obtivemos o que escrevemos originalmente.

Não tenho certeza se você deve usar SYMBOL_TRADE_CONTRACT_SIZE em vez de lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;

Ou o resultado é o mesmo na teoria? Na prática, com um exemplo simples de um único símbolo, sim.

O símbolo pode não estar no Market Watch.