程序库: 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()
而通过报告进行的相同计算结果为:13,839,230.40。

在这个例子中,计算只针对一个符号 CalcHistorySlip( const string Symb) 这可以通过调用每个符号的函数来解决。

也许您有与 MT4Orders 匹配的 MT5 对应函数?如果没有,我将保持原样,或者根本不将其纳入大报告中。因为不清楚它能提供什么帮助。我现在输出的是交易量总和。对于单符号智能交易系统,按交易量总和和 MT4Orders 的周转率排序的结果是一样的。也就是说,可以用 TurnOver 替代。但对于多符号 Expert Advisor 则不同。因为大量不同符号的总和在货币方面并不等同。TurnOver 会更好。

而按成交量排序与 MT5 的变体(上述链接中的代码)完全不匹配。

 
Aleksei Kuznetsov #:

也许您有与 MT4Orders 相似的 MT5 版本?

您是这个意思吗?

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;

报告适用于长期未出现在 Market Watch 中的符号的交易历史。它也不知道是外汇交易还是其他。不过,历史记录中的信息往往足以计算交易额。


ZY 根据资料来源,如果开盘价和收盘价不一致,则按照以下公式计算。

(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。

也许您有与 MT4Orders 匹配的 MT5 对应函数?

如果没有,最简单的办法就是查看 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())* 订单手数() * 手数大小

替换

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); // 在 mat 模式中不可用,但在 MT5 中可用

从 OrderProfit()=(OrderClosePrice()-OrderOpenPrice()) 中获取垫模式下虚拟交易的手数。)* 订单手数() *手数

if(OrderProfit()!=0){lotSize=OrderProfit()/((OrderClosePrice()-OrderOpenPrice())*OrderLots());}
else{lotSize=lotSize;}// 查找或忽略同一字符的罕见情况

虚拟总计

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;// - 另一种方法 - 您需要从虚拟
        Turn_Over += (OrderOpenPrice() + OrderClosePrice())*OrderLots()*lotSize;
   }}}
   return Turn_Over;
}

对于 MT5:(这是我最初想获得的结果,结果比该 示例简单得多)。

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 #:

虚拟总计

也就是说,我们得到了最初写的 东西。

我不确定是否应该使用SYMBOL_TRADE_CONTRACT_SIZE 而不是 lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;

理论上结果是一样的吗?在实际操作中,以单个符号为例,结果是一样的。

符号可能不在市场观察中。