RefreshRates()の更新内容 - ページ 3

 
Artyom Trishkin:

iXXXXX関数にエラーがあると思われる場合、SymbolInfoXXXXX関数を使用してください。

iXXXXXをSymbolInfoXXXXXに 置き換えた例を挙げることができます。

 
Mikhail Nazarenko:

私のコードも似たようなものです。OnTickのエラー

はず

現在のタイムフレームがM5であれば、M5をH1やM1と比較する必要があります。

現在のタイムフレームM5が正しく表示されます。問題はH1とM1であった。

Alpari real EURCHF M5で確認したところ、Printの代わりに各レベルで横棒を描きました。

そうですね、最初はH1をそのように表記していたのですが、あまりにレアな比較になると思い、そうしました。そこで、M5に変更しました。

ミハイル・ナザレンコ

iXXXXXXXをSymbolInfoXXXXXXに 置き換えた例でよろしいでしょうか。

アルチョムは小さなミスを犯した...。

iCloseの代わりに

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

斯くあるべし

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

この方法では、一回の魔法の杖の動きで複数のバーの値を 取得することができます。

この関数はtrueまたはfalseを返しますが、この例では確認しませんでした。自分で推測してください...。

 
Alexey Viktorov:
ええ、最初はそうやってH1を入れたんですが、あまりにレアな比較になると思い、そうしました。そこで、M5に変更しました。

そこであなたのコードを完成させ、上に掲載しました。あなたのバージョンを私のものに入れましたが、結果は同じです。ほぼすべてのM5キャンドルにミスマッチがあります。成果はいかがですか?

 
Mikhail Nazarenko:

そこであなたのコードを完成させ、上に掲載しました。あなたのバージョンを私のものに入れましたが、結果は同じです。ほぼすべてのM5キャンドルにミスマッチがあります。成果はいかがですか?

ここで、変更する必要があるのは

if(NewBar(PERIOD_M5))

まで

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

ここで、変更しなければならないのは

まで

いや、もっといい_Period.なぜなら、今期が正しく 更新されている間は、H1からのゼロクォートを無理やり待つことになるからです。データは、時間が更新されたときではなく、時間の最初の秒数で受信する必要があります。

例題に追加して確認したい
double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

 
Alexey Viktorov:

ここで、変更しなければならないのは

まで

結果はiClose() と同じで、iCloseとCopyCloseは同じところからデータを取っているようです。

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

いや、もっといい_Period.なぜなら、今期が正しく 更新されている間は、H1からのゼロクォートを無理やり待つことになるからです。データは、時間が更新されたときではなく、時間の最初の秒数で受信する必要があります。

例題に追加して確認したい

新しいバーが現れるという機能の仕組みが全くわかっていないようですね。

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

そして、その結果。

ミハイル・ナザレンコ

結果はiClose() のときと同じです。iCloseとCopyCloseは同じところからデータを取っているようです。

新しいTIKA値を受信した際に、OHLCからbar closure値などを受信する場合は、常に問題なく受信することができます。
 
Alexey Viktorov:

新バー機能の仕組みを全く理解していないようですね。

そして、その結果。

OHLCからバークローズ値などを取得する際、新しいTIKAが到着すると、その値は常に問題なく表示されます。

質問に答えてください。なぜ新しいローソク足ではiClose(1)関数が 古い情報を返し、更新されないかエラーになるのでしょうか?これはバグです。

 
Mikhail Nazarenko:

質問に答えてください。新しいローソク足で、iClose(1)関数が 古い情報を返し、更新されないかエラーになるのはなぜですか?これはバグです。

バグなら全員、いやほとんど全員が持っているはずです。もし、あなただけなら、コードの問題です。

私のEAはM15で新しいバーのH1を決定しています。

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_H1))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M5[0], "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

そして、このようなコメントがあります。

齟齬はない。

 
よし、開発者の皆さん、ご配慮ありがとうございます!NewBarのような松葉杖を作りに行ってきます))トピックを閉じました。