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

 
Vitaly Muzichenko:

この関数は、時間的に新しいもの、つまり最後のものを選びます。

次に、選択したものがあるので、それを関数iBarShift(sym, tf,oot ,true) に代入します。

この関数は、時間ごとのバー番号を返します。以上です。

残念ながら確認はできませんが、私が使用したところ、I.Kimさんがここで公開されているすべての機能と同様に、完全に動作しました。

また、注文時にチケットが割り当てられ、機能で連番が選択される場合は大丈夫でしょうか?
 
Вадим Мотеюнас:
if( iOpen[0] != time_open )'iOpen' - 未宣言の識別子 であることを示すエラーを書き込む

ちょっと間違った、思考の方向が違うことを書いてしまいました。iOpen[0]を Open[0]に変更します。 修正しました。でも、簡単に言うとね。バーを開くと、バーの開店時刻を覚えていて、このバーにはすでに注文が入っていない。

 

また、関数の説明には次のように書かれています。

考慮すべき位置の選択は、外部パラメータで指定する。

  • sy- 市場商品の名前。このパラメータを設定すると、指定した楽器の位置のみを考慮するようになります。デフォルト値-NULLは、現在の市場商品を意味する。
  • tf- タイムフレーム.デフォルトの値0 は、現在のタイムフレームを意味する。
  • op-貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
これらの値は、最初の特殊関数の前に宣言されるべきです。つまり、NumberOfBarOpenLastPos() 関数自体の記述に含まれているという事実だけでは十分ではありませんか?

 
Вадим Мотеюнас:

また、関数の説明には次のように書かれています。

考慮する位置の選択は、外部パラメータで設定します。

  • sy- 市場商品の名前。このパラメータを設定すると、指定した楽器の位置のみを考慮するようになります。デフォルト値-NULLは、現在の市場商品を意味する。
  • tf- タイムフレーム.デフォルトの値0 は、現在のタイムフレームを意味する。
  • op-貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
外部パラメータで? 最初の特殊関数の前に宣言する必要がありますか? つまり、NumberOfBarOpenLastPos() 関数自体の記述にあるのでは不十分なのでしょうか

十分です。外部パラメータに必要な値を入力します:MagicNumber、どのポジションを探すか、もしBUY(0)とSELL(1)が必要なら-1と書いてください。

 
Konstantin Nikitin:

ちょっと間違った、思考の方向が違うことを書いてしまいました。iOpen[0]を Open[0]に変更します。 修正しました。でも、簡単に言うとね。バーを開くと、バーを開いた時刻を記憶して、このバーでは注文を開けないようにします。

多くの注文が開かれ、NumberOfBarOpenLastPosが-1を返すので、非注文が開く前に if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) という条件が満たされたように見える。

 
Вадим Мотеюнас:

多くの注文が開かれ、非注文が開かれる前に if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) という条件が満たされると、NumberOfBarOpenLastPos は -1 を返すようです。

注文を探すのであれば、ポジションだけでなく、注文で検索できる機能を備えたフルバージョンの機能を使用する必要があります。

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

これで十分です。外部パラメータに必要な値を入力します:Majik、どのポジションを探すか、多分BUYのみ、BUY(0)とSELL(1)が必要なら -1 と書きます。

テスターで起動すると、未決済の注文がないので、もしかしたらそのせいで-1が返され、if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0という条件が成立しないのではないでしょうか。

 
Вадим Мотеюнас:

テスターで起動すると、未決済の注文がないため、-1が返され、そのため if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) の条件が満たされないのではないでしょうか?

これから確認します。

 
Vitaly Muzichenko:

注文を探すのであれば、ポジションだけでなく、注文で検索できる機能をフルバージョンで使用する必要があります。

が返ってくる

 
Вадим Мотеюнас:

が返ってくる

完璧に動作します!

スクリーンショットにあるように、2つのポジションから最後の1つを選択しました。


コードを確認する。

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }