MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 287

 
午後この関数でヘルプをお願いします。クローズした注文の合計損失、クローズ注文機能で使用するとメタトレーダーがクラッシュします。
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal();
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
印刷("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
If(OrderProfit()<0)i++。
}
If(i<0)
summa=OrderProfit()+summa;
}.
If(OrderProfit()>summa)とする。
summa=OrderProfit()+summa;
return(summa);
}.
 
Lowech:
こんにちは。この関数でクローズドオーダーの損失をまとめるのですが、クローズドオーダーの関数で使用するとメタトレーダーがクラッシュします、この関数に何らかのエラーがあると思うのですが、助けてください。

既成のものを見て、必要なら調整するのがよいでしょう。GetProfitFromDateInCurrency()

 
Lowech:
午後Help with function please, summarizes loss of closed orders, when used with close orders functionmetatrader crashes, I think there is some kind of error in this function.この関数に何らかのエラーがあると思われます。

メタトレーダーが クラッシュするってどういうこと?プログラムがエラーでコンパイルされる!!!

3か所で、if with small lowercase letterの代わりに、If with capital letterと書かれています。

int orders=OrdersHistoryTotal(); と summa=OrderProfit()+summa; の後にある2つの中括弧は、明らかに不要です。

然る事乍ら

 
Lowech:
午後この関数についてヘルプをお願いします。クローズした注文の損失を合計するものですが、クローズ注文関数で使用するとメタトレーダーがクラッシュします。この関数に何らかのエラーがあるのだと思います。

これを試してみてください。

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
書くのが2分遅かった・・・この部分をよく考えてみよう。
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

コンパイルは #property strict ディレクティブで行い、最終行に記述しています。'i' - 未宣言の識別子。ポイントは、ループ内で宣言された変数が、ループ内だけで有効であることです。property strictディレクティブがなければ、エラーなしでコンパイルされますが、これはまずいですね。ディレクティブを使用する必要があります。

if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) の代わりに if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) ==false) と書くと簡単です。さて、次はブレークです。これは、ループからの出口です。しかし、他の注文を処理する必要があります。しかし、歴史上、これは必要ない。成行注文 および保留中の注文で、処理の瞬間までに注文が終了しており、それが欠落している場合にエラーが発生します。一般的な経験則では if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; - 次のオーダーの処理を継続する。

同じ理由で、if(OrderProfit()>0) break; を if(OrderProfit()>0) continue に置き換えてください。

そして、以下がエラーの原因です: if(OrderProfit()<0)i++; - if(OrderProfit()>0; - インデックスがインクリメントされます。そして、ループヘッダ for(int i=orders-1;i>=0;i--) がそれを減少させる。同じ順番の処理が繰り返され、プログラムがループ状態になる。これがあるべき姿なのでしょう。

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
執筆中に2分遅刻・・・この部分をよく考えてみよう。

コンパイルは #property strict ディレクティブで行い、最終行に記述しています。'i' - 未宣言の識別子。ポイントは、ループ内で宣言された変数が、ループ内だけで有効であることです。property strictディレクティブがなければ、エラーなしでコンパイルされますが、これはまずいですね。ディレクティブを使用する必要があります。

if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) の代わりに if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) ==false) と書くと簡単です。さて、次はブレークです。これは、ループからの出口です。しかし、他の注文を処理する必要があります。しかし、歴史上、これは必要ない。成行注文 および保留中の注文で、処理の瞬間までに注文が終了しており、それが欠落している場合にエラーが発生します。一般的な経験則では if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; - 次のオーダーの処理を継続する。

同じ理由で if(OrderProfit()>0) break; を if(OrderProfit()>0) continue に置き換えてください。

そして、以下がエラーの原因です: if(OrderProfit()<0)i++; - if(OrderProfit()>0;) インデックスがインクリメントされます。そして、ループヘッダ for(int i=orders-1;i>=0;i--) がそれを減少させる。同じ順番の処理が繰り返され、プログラムがループ状態になる。これがあるべき姿なのでしょう。


メタトレーダーのクラッシュはもうありません。

if(OrderProfit()>0) break; if(OrderProfit()>0) continueに置き換えます。

この関数では、注文が利益で決済された場合、この利益は無視されます。 最初の注文が利益で決済されるまでの損失額のみを含めるようにしたいのです。すなわち

if(OrderProfit()>0)ブレーク。


私は、注文が利益で閉じている場合、カウンタを停止する必要があり、私はそれを正しく参照してください?
 
Lowech:

ありがとうございます、もうメタトレーダーのクラッシュはありません)私が必要とするのは、注文が利益で閉じた場合、関数はこの利益を考慮せず、損失の量と利益で閉じた最初の注文までしか考慮しません。すなわち
私は、注文が利益で閉じている場合、カウンタを停止する必要があり、私はそれを正しく参照してください?
あなたの推理はほぼ正しいです。履歴の中で、いかなる受注を保証するものではありません。自分のためならいいが、売るのはまずい。
 
STARIJ:
あなたの推理はほぼ正しいです。履歴の中の順序配列は保証されません。自分のためならOK、売るためならNG。
オーダーベースのループは、オーダーを順番に計算しているのでは?
 
STARIJ:

ソースがある場合 - DROW_NONE - 描画しない

それでも、コーナーに数字が表示されたままです。

 
Lowech オーダーループはオーダーを順番にカウントしているのでは?

リスト内の順番でただし、このリストにはいかなる順序も保証されていない