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

 
iClose: 0 - エラーです。この関数はエラーを出しません。現在では廃止されている値が表示されます。
 
iClose()ブローカーのサーバーから値を取得 する "とありますが、これらの関数のデータが誠実なブローカーによって生成されたものであれば、すべてがうまくいくでしょう)))現在のティックを信用するしかないことがわかった。
 
Artyom Trishkin:
いいえ、そんなことはありません。関数のヘルプには、戻り値についてどのように書かれていますか?
iClose

戻り値

対応するチャートのバークローズ価格(shiftパラメータで指定)の値、またはエラーの場合は0。GetLastError()を呼び出すと、エラーに関する詳細な情報を得ることができます。

0でなければエラーにならないと書いてあります。しかし、値も変わらない...ということは、RefreshRates();をしないと更新されないということで、驚きました。
 
Mikhail Nazarenko:

また、タイムフレームを現在のものと異なるものに変更すると、RefreshRates() を使用してもデータの更新が間に合わなくなります。だから、MT4のiClose等の基本機能は、無関係なデタラメを生み出す。8割のインフォは、このようなMT4独自の機能を考慮していないのではないでしょうか。どう生きるか)))

時間軸を変えても何もできない。現在のiCloseの値は、チャート期間に 関係なくBidの値と等しくなります。
 
Alexey Viktorov:
チェンジオフでは何も出ません。iCloseの現在値は、チャート期間に 関係なくBid値と同じです。

EAを作ってM5で1日動かしてみました。時間軸の変化で、それぞれの値に対して水平線を引きます: iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_ M5,1),iClose(symbol,PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - チャート上と同じように表示されました。
  2. 入札が近く、これが次のティックになる
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_ M1,1) - 同じ時もあれば、特に夕方の時間帯はRefreshRates()を接続しても完全にクソを表示する時もあった。

開発者に質問です。MQL4のiClose 関数は、正しい情報を提供せず、データを更新する 方法もないのに、なぜ必要なのでしょうか?

 
Mikhail Nazarenko:

EAを作ってM5で1日動かしてみました。時間軸の変化で、それぞれの値に対して水平線を引きます: iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_ M5,1),iClose(symbol,PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - チャート上と同じように表示されました。
  2. 入札が近く、これが次のティックになる
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_ M1,1) - 同じ時もあれば、特に夕方の時間帯はRefreshRates()を接続しても完全にクソを表示する時もあった。

開発者に質問です。MQL4では、iClose 関数は信頼できる情報を提供しないし、データを更新する 方法もないのに、なぜ必要なのですか?

これはナンセンスだ。RefreshRates()の呼び出しは、何らかの理由で実行が遅延した場合にのみ必要である。長いサイクルや、注文を出す瞬間に価格を更新して注文を出すようなケース。バリアントで問題はないはずです。値段の値を間違えるコードの例を載せた方がいい。

今、以下のコードを実行しています。

double close_H1,
       close_M1;

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

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\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;
 }/******************************************************************/
要するに、分足の終値が、チャート上の どの高値の期間とも一致する必要があるのです。ログに何か書かれているかどうか、後で確認します。
 
Mikhail Nazarenko:

また、タイムフレームを現在のものと異なるものに変更すると、RefreshRates() を使ってもデータの更新が間に合わなくなります。

この文章を確認するためのテストコードはありますか?私自身は気づいていないのですが。TFを入れ替えるときは、履歴が入れ替わるのを待つだけで、作業ができます。


そのため、iCloseをはじめとするMT4の基本機能は、無関係な無意味なものを生み出してしまうのです。

これはあまりにも大きな主張です。可能な場合もありますが、そのためにエラーコードが あるのです。チェックしないと、得られた結果を使えるかどうかわからない。


8割の情報商材は、このようなMT4独自の機能を考慮していないのではないでしょうか。どう生きるか)))

もっと言うと、ほとんどすべてのプログラムがこれらの機能を考慮していないのです。そのため、新しいバージョンがリリースされるのです。サポートが終了した時点で、その製品は使えなくなります。

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

これはナンセンスだ。RefreshRates()を呼び出すのは、何らかの理由で実行が遅延した場合のみである。長いサイクルのようなケースや、注文を出す時に価格だけ更新して注文を出すようなケース。バリアントで問題はないはずです。値段の値を間違えるコードの例を載せた方がいい。

現在、このようなコードを実行しています。

要するに、分足の終値がチャート上の 高値の期間と一致すればよいのです。後で、ログに何か書かれているかどうか見てみます。

私のコードはこれに似ています。OnTickにエラーがあります。

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

であるべきです。

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


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

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

Alpari real EURCHF M5で確認しましたが、Printではなく、各レベルで横棒を描きました。

 
Ihor Herasko:

この文章を裏付けるテストコードはありますか?自分では気づいていないのですが。TFを切り替えるときは、履歴が入れ替わるのを待つだけで、作業ができます。


これはあまりにも大きな発言です。場合によっては可能ですが、そのためにエラーコードが あるのです。チェックしないと、得られた結果を使えるかどうかがわからない。


もっと言うと、ほとんどすべてのプログラムは何かを考慮していない。そのため、新しいバージョンがリリースされるのです。サポートが終了した時点で、その製品は使用できなくなります。

これがそのコードです。これを入れてチェックしてみてください。すべてのキャンドルにマッチがあるわけではありません。アルパリ・リアルEURCHF M5.

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);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\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;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: 0 - エラーです。この関数は、エラーを報告しません。現在廃止されている値を出力する。

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