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

 
dimkh87:
午後MT4とMT5で、1つの商品のチャートを異なる時間枠で重ね合わせ、その時間枠に対応したインジケータを表示することが可能かどうか、教えてください。例えば、EUR/USDペアの 3つのチャートを1つのウィンドウに表示し、日足、4時間足、1時間足のTFを表示し、さらにこれらのTFのスライドインジケーターを重ね合わせたいと思います。可能なのでしょうか?よろしくお願いします。

タイムラインをどうするか?あるいは、より小さなタイムスケールから数本の幅でバーを描画しますか?

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

皆さん、アドバイスをお願いします。私は、最後に開いたポジションのバー 番号または- 1を返すキムから関数を取りました。

この関数を呼び出して、条件を書くと

Printを見ると、この関数は-1を返しています。最初は注文がないと思いましたが、しばらくすると注文が再び現れ、同じバーでストップの後に取引が開始されました。

static datetime time_open = 0;
if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {
      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if( Open[0] != time_open )
         if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь
            ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);

      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         time_open = Open[0];
         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
         SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
         modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
       }
      }
 
Konstantin Nikitin:
if( iOpen[0] != time_open )'iOpen' - 未定義識別子 を示すエラー

 
Вадим Мотеюнас:
エラーはif( iOpen[0] != time_open )'iOpen' - 未宣言の識別子 を指して書き込まれます。

キムは全機能が使える!正しく適用できていなかったんですね。

 
Vitaly Muzichenko:

キムは全機能が使える!正しく適用できていなかったんですね。

誰も議論していない、私がどのように誤用したかを理解したいだけだ。

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

誰も議論していない、私はどのように間違って適用しているのか理解したい。

すべてを印刷する - 間違いや欠点を明らかにするために行うべき正しいことです。

Print( NumberOfBarOpenLastPos("",0,-1,-1) );
 
Vitaly Muzichenko:

すべてを印刷する - これは、エラーや欠陥を特定するための最良のソリューションです。

私はそれが-1、すなわち、注文が開かれた最後のバーが関数によって検出されないことを言った、私は正しいパラメータを渡していないことを心配しています。

 
int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();//что означает это строка?что текущее время раньше цены открытия ордера, это как?
                    }
                 }
              }
           }
        }
     }
 
Вадим Мотеюнас:

ラインというのは、すべてのポジションを調べて、一番新しいものを選んで/覚えて、それを使って仕事をするということです。これは、ポジションが順番にではなく、ばらばらになっている場合です。

 

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

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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнюю позицию
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

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

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

残念ながら確認はできませんが、私が使用したところ、I.Kim氏がここで公開したすべての機能と同様に、問題なく動作しました。