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

 
Vitalie Postolache:
サイクルは、OrdersTotal()-1 から 0 までの逆順に数える必要があります。
ループで閉じる場合。
 
Vitalie Postolache:
ループは、OrdersTotal()-1 から 0 まで、逆算する必要があります。
これらはKimの機能であり、欠けることなく動作しています。
 
つまり、同じシンボルで複数のアドバイザーのスイッチを誤って入れてしまった、そんな人も少なくないはずです。
 
Neron_76:
こんにちは!私のFXロボットをデモ口座に インストールし、2ヶ月目も稼働しています。今日ターミナルを開いているのですが、以前は1つだけ注文を出していたのに、1つのシグナルによって2つのオープンオーダーが出ています。注文数に制限があるのですが。その理由は何でしょうか。

コードから判断すると、成行注文ではなく、保留注文をしているように見えます。

未決済注文数の制限は、成行注文にのみ適用されます。

そのため、エラーは発生せず、したがって問題はないのです。

 
Renat Akhtyamov:

コードから判断すると、成行注文ではなく、保留注文をしているように見えます。

未決済注文数の上限は、成行注文にのみ適用されます。

したがって、エラーはなく、したがって問題はない。

この制限は、未決済注文 および保留中の注文に 適用されます。これは1ヶ月半の間に2回目のケースです。他のケースはすべて正しいです。
 
Neron_76:
この制限は、未決済注文 および保留中の注文 に適用されます。この1ヵ月半で2回目ですが、他のケースはすべてその通りになっています。

この方法で試してみてください。

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
 
Vitaly Muzichenko:

この方法で試してみてください。

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
機能を交換したところ、テストでは問題なく動作しています。デモでの取引でどうなるのか見てみましょう。しかし、なぜか私の場合、これらとこれらの関数は同じタスク、つまり注文とポジションがあるかどうかという質問に答えているように思えます。
 
Neron_76:
機能を入れ替えました、テストでは問題なく動作しています。デモでの取引でどうなるのか見てみましょう。しかし、なぜか私の場合、両方の関数が同じタスク、つまり注文とポジションがあるかどうかの質問に答えているように見えます。
注文の二重設定を繰り返す場合、"SetOrder"関数は再考されるべきです、おそらくそれは2つの要求を与え、最初の要求の後に関数からの終了がなく、それは2番目のものを送信する時間があります。
 
Vitaly Muzichenko:
注文の二重設定が繰り返される場合、「SetOrder」関数を見直す必要があります。おそらくそれは2つの要求を与え、最初の要求の後に関数から終了がなく、2番目のものを送信するために管理されます。
もしそうだとしたら、なぜいつもそうなるのではなく、ティックとティックの間に何かが起こるのでしょうか?苦手なんです。
 
Neron_76:
もしそうだとしたら、なぜいつもそうならないのか、チックの間に何かあるのか。苦手なんです。
あるシンボルのティックとティックの間に、別のシンボルのティックがある場合があります。EAがマルチカレンシーの場合、別のシンボルからのティックを見ます。また、タイマーイベント - OnTimer() とOnChartEvent() イベントは、ティックの間に発生することがあります - もう少しで「イベントイベント」と書くところでした...。がセットアップされているのだろう...