程序库: Report - 页 16 1...91011121314151617 新评论 fxsaber 2025.08.12 20:17 #151 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); 要移动/删除一列,只需相应更改源代码中的这一序列。 Aleksei Kuznetsov 2025.12.30 10:12 #152 您的报告中有 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 的变体(上述链接中的代码)完全不匹配。 fxsaber 2025.12.30 13:34 #153 Aleksei Kuznetsov #:也许您有与 MT4Orders 相似的 MT5 版本? 您是这个意思吗? OrderLots() * TickValue * (OrderOpenPrice() + OrderClosePrice()) 如果不是,我将保持原样,或者根本不将其包含在大报告中。因为不清楚它能提供什么帮助。 交易营业额--你赚了多少钱。一般经纪商会从中计算佣金。 例如,如果需要个人条件,他们首先会询问交易额的大小。 Stanislav Korotky 2025.12.30 13:38 #154 fxsaber #:你是在说这个吗?交易额--你赚了多少钱。一般的经纪商会以此计算佣金。如果需要个别条件,他们首先会询问交易额的大小。 我认为应该这样: OrderLots() * TickValue * fabs(OrderOpenPrice() - OrderClosePrice()) 此外,有必要检查符号类型,因为对于非外汇交易经纪商来说,有必要计算从基准货币到账户货币的一个刻度线的成本(对于外汇交易--一个刻度线的成本立即以账户货币报告)。 fxsaber 2025.12.30 13:51 #155 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())) Aleksei Kuznetsov 2025.12.30 15:24 #156 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.20www.mql5.com мистер o O очень хорошо знает что такое DEAL Потому что Ку. Количество пунктов - средневзвешенное по объему количество пунктов каждой из сделок. может о О вполне и подойдет предложенный Вами вариант fxsaber 2025.12.30 15:28 #157 Aleksei Kuznetsov #:如果不能,那么最简单的解决办法就是通过 MT5 功能进行的交易是否可以通过 MT4Orders 查看历史记录。 这正是 Report.mqh 的工作原理!或者说我完全不明白今天的问题。 Aleksei Kuznetsov 2025.12.30 15:36 #158 fxsaber #: 原来 Report.mqh 是这样工作的!还是我完全误解了今天的问题。 我试试看... Aleksei Kuznetsov 2025.12.31 06:37 #159 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; 或者理论上结果是一样的吗?以一个简单的单字符示例为例,实际结果是一样的。 fxsaber 2025.12.31 07:18 #160 Aleksei Kuznetsov #:虚拟总计 也就是说,我们得到了最初写的 东西。 我不确定是否应该使用SYMBOL_TRADE_CONTRACT_SIZE 而不是 lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE; 理论上结果是一样的吗?在实际操作中,以单个符号为例,结果是一样的。 符号可能不在市场观察中。 1...91011121314151617 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这很容易做到,但为什么呢?
在 Report.mqh 的末尾有这样一个条目。
要移动/删除一列,只需相应更改源代码中的这一序列。
您的报告中有 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 的变体(上述链接中的代码)完全不匹配。
也许您有与 MT4Orders 相似的 MT5 版本?
您是这个意思吗?
如果不是,我将保持原样,或者根本不将其包含在大报告中。因为不清楚它能提供什么帮助。
交易营业额--你赚了多少钱。一般经纪商会从中计算佣金。
例如,如果需要个人条件,他们首先会询问交易额的大小。
你是在说这个吗?
交易额--你赚了多少钱。一般的经纪商会以此计算佣金。
如果需要个别条件,他们首先会询问交易额的大小。
我认为应该这样:
OrderLots() * TickValue * fabs(OrderOpenPrice() - OrderClosePrice())此外,有必要检查符号类型,因为对于非外汇交易经纪商来说,有必要计算从基准货币到账户货币的一个刻度线的成本(对于外汇交易--一个刻度线的成本立即以账户货币报告)。
看来应该是这样:
另外,您需要检查符号类型,因为对于非外汇交易,您需要计算从基准货币到账户货币的刻度值(对于外汇交易--刻度值立即以账户货币报告)。
我是从 Report.mqh 复制的。也是这样的。
报告适用于长期未出现在 Market Watch 中的符号的交易历史。它也不知道是外汇交易还是其他。不过,历史记录中的信息往往足以计算交易额。
ZY 根据资料来源,如果开盘价和收盘价不一致,则按照以下公式计算。
(OrderOpenPrice() + OrderClosePrice()) * MathAbs(OrderProfit() / ((OrderClosePrice() - OrderOpenPrice()))你是在说这个吗?
交易额--你赚了多少钱。一般的经纪商会以此计算佣金。
如果需要个别条件,他们首先会询问交易额的大小。
我已经复制了 Report 中的做法,并在第一篇文章中进行了介绍。
没有 Mt4Orders 的计算变体的问题。
函数https://www.mql5.com/ru/forum/98421/page2#comment_2908365 给出了截然不同的结果。
该函数的结果之一:-149,96.符号 - 您可以删除 fabs()
而通过 Report 进行相同计算的结果为:13,839,230.40。
也许您有与 MT4Orders 匹配的 MT5 对应函数?
如果没有,最简单的办法就是查看 MT5 功能进行的交易是否可以通过 MT4Orders 查看历史记录。使用此方法
如果不能,那么最简单的解决办法就是通过 MT5 功能进行的交易是否可以通过 MT4Orders 查看历史记录。
原来 Report.mqh 是这样工作的!还是我完全误解了今天的问题。
Turn_Over += (OrderOpenPrice() + OrderClosePrice()) * MathAbs(OrderProfit() / ((OrderClosePrice() - OrderOpenPrice()));可以用以下方法简化:
OrderProfit()=(OrderClosePrice()-OrderOpenPrice())* 订单手数() * 手数大小
替换
删除(OrderClosePrice()-OrderOpenPrice()))
我们来计算 1 手/合约的大小:
从 OrderProfit()=(OrderClosePrice()-OrderOpenPrice()) 中获取垫模式下虚拟交易的手数。)* 订单手数() *手数
虚拟总计
对于 MT5:(这是我最初想获得的结果,结果比该 示例简单得多)。
结果完全相同。
但我不确定是否应该使用SYMBOL_TRADE_CONTRACT_SIZE,而不是lotSize=SYMBOL_TRADE_TICK_VALUE/SYMBOL_TRADE_TICK_SIZE;
或者理论上结果是一样的吗?以一个简单的单字符示例为例,实际结果是一样的。
虚拟总计
也就是说,我们得到了最初写的 东西。
我不确定是否应该使用SYMBOL_TRADE_CONTRACT_SIZE 而不是 lotSize=SYMBOL_TRADE_TICK_VALUE / SYMBOL_TRADE_TICK_SIZE;
理论上结果是一样的吗?在实际操作中,以单个符号为例,结果是一样的。
符号可能不在市场观察中。