ライブラリ: 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。

この例では、計算は 1 つのシンボルに対してのみ行われます CalcHistorySlip( const string Symb) さて、これは各シンボルに対して関数を呼び出すことで解決できます。

MT4OrdersにマッチするMT5用の同等の関数があるかもしれません。そうでなければ、そのままにしておくか、大きなレポートにはまったく含めないつもりです。それがどのように役立つのか明確でないためです。現在、出来高の合計を出力しています。単一シンボルの Expert Advisor の場合、MT4Orders から Volume と TurnOver の合計でソートした結果は同じです。つまり、TurnOver の代わりになるものがあります。しかし、マルチシンボルの場合は異なります。なぜなら、たくさんの異なるシンボルの合計は、金額的には等価ではないからです。TurnOverの方が良いだろう。

そして、MT5用のバリアント(上記リンクのコード)とボリュームによるソートの比較は全く一致しません。

 
Aleksei Kuznetsov #:

MT4OrdersにマッチするMT5用の同等のものがあるのでは?

そういうことですか?

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

そうでなければ、そのままにしておくか、大きなレポートにはまったく含めないことにします。それがどのように役立つのか明確でないためです。

取引高 - あなたがいくら稼いだか。通常のブローカーはそこから手数料を計算する。

例えば個別条件が必要な場合、まず取引高を聞かれます。

 
fxsaber #:

そういうことですか?

取引高 - あなたがどれだけのお金を挽回したか。通常のブローカーではそこから手数料が計算されます。

例えば個別条件が必要な場合、まず取引高を聞かれます。

そうあるべきだと思います:

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

さらに、シンボルの種類を確認する必要があります。FX以外のブローカーでは、基準通貨から口座の通貨へのティックのコストを計算する必要があるからです(FXの場合、ティックのコストは口座の通貨で直ちに報告されます)。

 
Stanislav Korotky #:

そうあるべきだと思う:

さらに、シンボルの種類を確認する必要があります。FX以外の場合は、基準通貨から口座通貨へのティック値を計算する必要があるからです(FXの場合は、ティック値は口座通貨で直ちに報告されます)。

これは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は、Market Watchに長い間表示されていないシンボルの取引履歴に対して機能します。そして、それがFXなのかそれ以外のものなのか見当もつきません。しかし、取引高を計算するには、履歴の情報で十分なことが多い。


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); // マットモードでは利用できないが、MT5では利用できる。

OrderProfit()=(OrderClosePrice()-OrderOpenPrice()))から、マットモードでバーチャルのロットサイズを 取得。* OrderLots() *lotSize

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;// - 代替 - Virtualから取得する必要があります。
        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;
}

結果はまったく同じです。

しかし、lotSize=SYMBOL_TRADE_TICK_VALUE/SYMBOL_TRADE_TICK_SIZE;
の代わりにSYMBOL_TRADE_CONTRACT_SIZEを 使うべきかどうかはわかりません。単純な1文字の例では、実際にはそうです。

 
Aleksei Kuznetsov #:

バーチャル合計

つまり、最初に書いた とおりになりました。

lotSize=SYMBOL_TRADE_TICK_VALUE/SYMBOL_TRADE_TICK_SIZEではなく、SYMBOL_TRADE_CONTRACT_SIZEを 使うべきでしょうか;

それとも、理論的には同じ結果になるのでしょうか?シンボルが1つの単純な例では、実際にはそうです。

シンボルはMarket Watchに掲載されていないかもしれません。