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

 
こんにちは!困っていることがあるので、助けてください。1つのEAから異なるシンボル/TFのデータを取得する必要があります。マニュアルには、「データのためのサーバーへのアクセスの仕組みは、リクエストがどのように開始されたかに依存しない - チャートをナビゲートするユーザーによって、またはMQL4内のプログラムによって」と書かれています。しかし、実際には、リアルタイムで、例えば、EAが動作しているシンボルとは異なるシンボル/TFのバー 数を追跡すると、次のようなことが起こります。新しいシンボルでは、最初のアクセスで少数のバーがロードされ(M1では約1000)、この数は変更されません。また、ChartNavigate(_ID, CHART_BEGIN)を移動させても、新しいデータはロードされず、バーの数も変わりません。しかし、同じExpert Advisorからプログラムでウィンドウを開き(以前にもChartNavigate()関数で開いています)、矢印/Home/PgUpボタンでチャートを左に移動すると、タイムシリーズ配列の増加につながり、バー数がリアルタイムで増加、つまりデータがロードされます。キーボードの物理キーを押さずにプログラムで履歴を読み込むには、どうしたらよいのでしょうか?ありがとうございます)
 
Ihor Herasko:

そのようにやってください。コードはほぼ正しいです。たった一文字足りないだけ。

ありがとうございました。
 
Alexandr Mordashov:
こんにちは!問題を解決するのを助けてください。1つのEAから異なるシンボル/TFのデータを取得する必要があります。ヘルプによると、「データに対するサーバーへのアクセスの仕組みは、リクエストがどのように開始されたかに依存しない - チャートをナビゲートするユーザーによって、またはMQL4のプログラムによって-」とあります。しかし、実際には、リアルタイムで、例えば、EAが動作しているシンボルとは異なるシンボル/TFのバー 数を追跡すると、次のようなことが起こります。新しいシンボルでは、最初のアクセスで少数のバーがロードされ(M1では約1000)、この数は変更されません。また、ChartNavigate(_ID, CHART_BEGIN)を移動させても、新しいデータはロードされず、バーの数も変わりません。しかし、同じExpert Advisorからプログラムでウィンドウを開き(ChartNavigate()関数用に既に開いています)、矢印/Home/PgUpボタンでチャートを左方向に移動すると、タイムシリーズ配列の増加につながり、バー数がリアルタイムで増加、つまりデータがロードされます。キーボードの物理キーを押さずにプログラムで履歴を読み込むには、どうしたらよいのでしょうか?ありがとうございます)

もっと明確に質問する必要があります。問題が提起されていなければ、解決することはできない。

 
Galim_V:
フクロウがホバリングしている時間枠以外の時間枠から、一番下の指標を取得する方法を教えてください。
double iRev()
{
 static int wtf;
 static int tf;  
 int xtf =Period();       // таймфрейм текущего графика 
 
                          //PERIOD_CURRENT;
 if(xtf != PERIOD_CURRENT)
 {
 Print("xtf  ",xtf);
   switch(xtf)
   {
    case 1: tf = PERIOD_H1;
    break;
    case 5: tf = PERIOD_H4; wtf = PERIOD_H1;
    break;
    case 15: tf = PERIOD_D1;
    break;
   }
     
 }
Print("tf == ",tf,"wtf ==",wtf);
 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
   if(iRa != 0) ObjectCreate("Ra",OBJ_HLINE,0,Time[0],iRa,0,0);
     
     ObjectSet("Ra",OBJPROP_TIME1,Time[0]);
     ObjectSet("Ra",OBJPROP_PRICE1,iRa);
   
   if(wRa != 0) ObjectCreate("weRa",OBJ_HLINE,0,Time[0],wRa,0,0); 
     ObjectSet("weRa",OBJPROP_TIME1,Time[0]);
     ObjectSet("weRa",OBJPROP_PRICE1,wRa); 
    
     
  Print("iRa   ",iRa,wRa);
 return(iRa);
}  
動作するが、必ずしも正しく動作しない。視覚的に評価できるようにオブジェクトを添付しました。何かヒントや見るべきところがあれば教えてください。
 
Galim_V:
動作はしますが、必ずしも正しく動作するわけではありません。視覚的に評価できるように、オブジェクトを添付しました。アドバイスか、どこを見ればいいのか、教えてください。

DRAW_LINEは何のためにあるのですか?

 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 
Alexey Viktorov:

DRAW_LINEは何のためにあるのですか?

コードを修正しました。しかし、コードに誤りがあるわけでもなく、正しく動作しませんでした。私はブローカーの端末でテストを行うので、常にサーバーとの接続を監視しているわけではありません。この場合、非常に重要です。ありがとうございます。
 

こんにちは。EAがH1チャートの場合、M30での終値を 知るには?

Close_M30= iClose(Symbol(),PERIOD_M30,1);
 
bij:

こんにちは。EAがH1チャートの場合、M30での終値を 知るには?

質問して自分で答えてくれる人が好きです ))

基本的には、すべて正しいです。ただ、1つだけ微妙な点があります。それは、別の時間軸で得られたデータを使う前に、そのデータが全く存在しないことを確認しなければならないことです。

したがって、完全な正しいコードは次のようになります。

ResetLastError();
Close_M30= iClose(Symbol(),PERIOD_M30,1);
if (GetLastError() != ERR_NO_ERROR)
{
  // Значение Close_M30 использовать нельзя
}
 
Ihor Herasko:

質問しておいて、自分で答えるというのが好きです ))

大体において、すべてが正しいのです。ただ、1つだけニュアンスがあります。他のTFのデータを使う前に、そのデータが全く存在しないことを確認する必要があるのです。

ですから、完全な正しいコードは次のようになります。

ありがとうございます、アクションはH1クローズ後のみですが、H1クローズの30分前に条件を満たしています。

 ResetLastError();
   niz_=NormalizeDouble(iCustom(NULL,PERIOD_M30,"mand v.1",2,1),Digits);
   Close_M30=iClose(Symbol(),PERIOD_M30,1);
   if(GetLastError() != ERR_NO_ERROR)return;
   if(Close_M30>niz_)//условие
     {
      //действие
     }
 
bij:

ありがとうございます!アクションはH1クローズ後のみですが、H1クローズの30分前に条件が成立しています。

最後のH1終値と一緒に閉じたM30ローソクを取りたい場合、それはインデックス1だけでなく、2を持つローソクになることができます。もう一つは、それならなぜ、前のH1ローソクの終値と同じなのに、M30の終値が 取られるのかがはっきりしないことです。つまり、この場合、他のTFの終値は現在のTFの終値と一致しているので、問い合わせる意味がない。