エラー、バグ、質問 - ページ 2995

 
   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


なぜこのコードは分単位でしか正しく動作しないのか、どなたかお答えいただけないでしょうか。

これは指標となるものです。


P.S.

分足以外のタイムフレームでは、間違った値が出力されます。

 
Francuz:


なぜこのコードは分単位でしか正しく動作しないのか、どなたかお答えいただけないでしょうか。

これは指標となるものです。

P.S.

分以外の時間軸では、間違った値が出力されます。

なぜなら、OnCalculateの 最初の訪問時、prev_calculated = 0のときだけ、1回の反復を実行したからです。その時点では、まだバーが形成されていないかもしれません。そして、すべてのTFは1M TFから形成されている。
チェックに挿入する。

if(prev_calculated>0 && handle != INVALID_HANDLE)

そして、すべてがうまくいくのです。

 

MEで2つのEAタブが開いていて、両方とも未保存の変更があります。そのうちの1つのEAのコンパイルボタンを押すと、MEが両方のEAに変更を保存するのを確認できます。なぜ?誰がそんなことを頼んだんだ?

MEがコンパイル前にリンク先ファイルの変更を保存しておけば、論理的な動作になるのですが、それで......。 もちろん、こんなに簡単なのだから、どのファイルが誰のものかを選別する必要はない。開いているファイルを すべて保存して終わりにした方がずっと簡単だ......。

 
Andrey Dik:
MEで2つのEAのタブを開き、両方とも未保存の変更がある状態で、片方のEAのコンパイルボタンを押すと、MEが両方のEAに変更を保存するのを確認できます。なぜ?誰がそんなことを頼んだんだ?
他にどうすればいいのか?
これしかないんです。
すべてのIDEにおいて、これは事実である。
 
Nikolai Semko:
他に方法は?
これしかないんです。
IDEはみんなそうなんです。

すべてのIDEで確実なのでしょうか?

今、VSを試しましたが、はい、動作は同じです。 しかし、最も有名な製品であっても、その遅れた動作をベンチマークと考えるべきでしょうか? VSのバグや誤解をすべてコピーしましょう、なぜですか?

))

 
Andrey Dik:

は、すべてにおいて正確なのでしょうか?

しかし、ある製品の、それも最も有名な製品の、遅れた動作をベンチマークと考えるべきなのでしょうか? それなら、VSのバグや誤解をすべてコピーしましょうよ、なぜですか?

))

私はこの1年で少なくとも9種類のIDEを使いました。どこもこんな感じなんですね。
あるコードでコンパイルしたものと、別のコードでコンパイルしたものでは、すでに同じ名前のex5ファイルを2つ作らなければならないなど、論理的に考えて、1つのファイルに複数のマスターがあり、互いの変更を見ることができない場合、どれだけの問題があるか。
 

ナビゲーターをMarket Watchのウィンドウのように表にしてみてはいかがでしょうか。マーケットウォッチに 仕分けが実装されましたね、お見事です。- 私たちは、ずっとそれを求めてきました。

ナビゲータの内容を表示し、タイトル、 著者、コンパイル日、最終実行日、ソースの有無、プログラムの種類という列でソートする(ソートを無効にすると現在の表示に戻る)という、メガ・クールな使い勝手の新しい夢の時代がやってきました。

 
Nikolai Semko:
私はこの1年で少なくとも9種類のIDEを使いました。どこもかしこもこんな感じです。
論理的に考えて、1つのファイルに複数のホストが存在し、互いの変更を見ることができない場合、どれだけの問題が発生するか。 一方があるコードでコンパイルし、他方が別のコードでコンパイルした場合、すでに同じ名前のex5ファイルを2つ作る必要がある、などです。

2つの異なるEAが開かれた場合、それらの間にどのようなつながりがあるのでしょうか? フクロウの一部であるinludeのみが保存されるべきで、それらのinludeが他の誰のものであるかは関係ないのです。

例えば、保存されていない*txtファイルを開いた場合、それはコンパイルされたファイルやプロジェクトとは 何の関係もないので、なぜそれを保存するのでしょうか?

 
Nikolai Semko:

なぜなら、最初のOnCalculate の エントリで、prev_calculated = 0 のときだけ、1回の反復を実行するからです。この時点では、まだ棒は形成されていないかもしれません。そして、すべてのTFは1M TFから形成されている。
チェックに挿入する。

で、すべてがうまくいきます。

的外れなこと言ってますね。このコードは一度だけ動作するようにします。その目的は、呼び出されたインジケータが機能しないことを示すことです。問題は、呼び出されたインジケータの任意のバリエーションで、それ(および呼び出し元)が分と異なるTimeFrameを持っている場合は動作しないということです。松葉杖でしか解決できないMetaTraderの バグであることがわかりました。そして、この問題はかなり古くからある。詳しくは「古いTF123のインジケーターデータが取得 できない」で紹介しています。

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Francuz:

論点がずれていますね。このコードは一度しか使えないことになっています。その目的は、呼び出されたインジケータが機能しないことを明確に示すことにある。問題は、呼び出されたインジケータが(呼び出し元も)分と異なるTimeFrameを持っている場合、動作しないことです。松葉杖でしか解決できないMetaTraderの バグであることがわかりました。そして、この問題はかなり古くからある。詳しくは「主要なTF123のインジケーターデータが取得 できない」にて解説しています。

それは昔の話です。この問題はとっくに解決している。ネイティブでないタイムフレーム/シンボルのデータにアクセスするには、少なくとも2分に1回の頻度でアクセスする必要があります。メインループでは、要求された時間枠からのデータがまだない場合は、ループを終了する必要があります - ちょうど次のティックを待つためにゼロを返し、インジケータは、履歴データがまだ計算されていないことを知っていました。