初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1055

 
Igor Makanu:

というのはわかるのですが、2つの価格の差をポイント単位で計算するにはどうしたらよいのでしょうか?

ここで四捨五入が適用されることがあります。どちらにするか、あるいは整数にしておくかは、あなた次第です。

int pips_profit = (int)MathFloor(OrderOpenPrice()-OrderClosePrice())/_Point);
 
Igor Makanu:

これは正しいのか? オーダーループでは、OrderSymbol()が毎回異なるので、SymbolInfoDouble(OrderSymbol(),SYMBOL_POINT); が毎回再計算されるだろうか?

そこでの問題は少し違っていて、すべてのシンボルの利益の合計をpipsで表示することです。

 
Konstantin Nikitin:

ここで四捨五入が適用されることがあります。どちらにするか、あるいは整数にしておくかは、あなた次第です。


そうそう、このような構造を忘れていたのですが、Kimのロット計算関数では、正しい丸めが行われていました。
fxsaber

つまり、そこでの作業は少し違っていて、すべてのシンボルの利益の合計をpipsで表示することです。

しかし、なぜconstなのか、ループがconstを変更する場合、コンパイラはどのように動作するのでしょうか?

PS: コードは読めるが、チェックが必要、これを使ったことがない

 
Igor Makanu:

しかし、なぜ const なのでしょうか。ループ内で const が変更された場合、コンパイラはどのように動作するのでしょうか。

PS: コードは読めるが、チェックが必要、これを使ったことがない

各ステップで変数が作成されます。 const - このステップでは、どこも変更する予定はありません。

 
fxsaber:

各ステップでは、変数が作成されます。 const - このステップでは、どこにも変更する予定はありません。

は、ループの繰り返しなのか?

このような構成がどのように動作するかはまだ明らかではないので、チェックするためのスクリプトが必要です。

 
fxsaber:

つまり、すべてのシンボルにおける利益の合計をpipsで表すという、少し変わった目的を持っているのです。

それなら、こうだ

short pipsProfitOrder = (short)MathFloor( ( OrderProfit()+OrderSwap()+OrderCommission() ) / (SymbolInfoDouble(_OrderSymbol(), SYMBOL_TRADE_TICK_VALUE)*OrderLots()) );

私は1ポジションのpipsで利益を計算していますが、自分に当てはめても問題ないと思っています。

 
Igor Makanu:

ステップとは、サイクルの繰り返しなのですか?

はい。

このような構成がどのように動作するかはまだ不明なので、チェックするためのスクリプトが必要です。

以下は、変数の寿命を便利に使う例です。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

"トレーダー向けLifeHack: 定義にForEachを混ぜる(#define)" に関するディスカッション

fxsaber さん 2018.02.14 10:54

パフォーマンス測定

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

double GetAsk()
{
  static MqlTick tick = {0};
  
  return(SymbolInfoTick(Symbol(),tick) ? tick.ask : 0);
}

#define  AMOUNT 1 e6

void OnStart()
{
  double Sum = 0;
  
  BENCH(for (int i = 0; i < AMOUNT; i++) Sum += GetAsk())
  BENCH(for (int i = 0; i < AMOUNT; i++) Sum += SymbolInfoDouble(_Symbol, SYMBOL_ASK))
  
  Print(Sum);
}


結果

Time[for(inti=0;i<AMOUNT;i++)Sum+=GetAsk()] = 78952
Time[for(inti=0;i<AMOUNT;i++)Sum+=SymbolInfoDouble(_Symbol,SYMBOL_ASK)] = 162606
 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者からのFAQ MQL5 MT5 MetaTrader 5

コンスタンチン・ニキーチン, 2019.06.04 19:58

では

short pipsProfitOrder = (short)MathFloor( ( OrderProfit()+OrderSwap()+OrderCommission() ) / (SymbolInfoDouble(_OrderSymbol(), SYMBOL_TRADE_TICK_VALUE)*OrderLots()) );

1ポジションのpipsで利益を計算しているが、自分に当てはめても問題ないと思う。

これをコスト込みの利益をTRUE(終値ではない)pipsに変換することを言います。

 
fxsaber:

これをCURRENT(決算時ではない)ポイントへの原価利益振替といいます。

こうして利益をポイントに換算していく必要があるのだ。閉じたものを計算するときは、やはりポイント値を基準にする必要があります。pips単位の利益は、始値と終値のpipsの差と同じである必要はありません。 と終値。

 
Konstantin Nikitin:

だから、彼は利益をポイントに変換する必要がある。

利益=OrderProfit()と考えることもあるようです。

クローズド・シンボルを計算する際にも、やはりピップ値を基準にする必要があります。利益のpip値は、 値と終値の pip差と同じである必要はありません。

クローズ時のポイント数は計算時のポイント数と一致しません。また、計算時にそのシンボルがマーケットウォッチに掲載されていないだけかもしれません。

そのため、ポイントの値と決算時の値の両方が計算されます。

理由: