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

 
ijonhson:

問題は、インディケータコードを1ティックあたり900回(例えば300バーの3タイムフレーム)計算するか、3回計算するかです。 icustomの方が手間がかからないのは明らかです、ループに入れれば完了です。 オプションとして、dllを使ってEAに渡すインディケータ値の配列のアドレスを見ましたが、セットでインディケータを持っていくのは嫌なんですよねぇ


ここでも問題文に間違いがある。Expert Advisorで900本のバーが必要な理由は何ですか?もし、本当にインジケータで900本のバーという多くのデータが必要なら、インジケータ自体でそれらを使って作業し、なぜExpert Advisorにそれらをドラッグするのですか?正しいタスクが成功の50%である

 
Nikolay Ivanov:

問題文がまた間違っている...。なぜEAに900本のバーが必要なのですか?もし、本当にインジケータに多くのデータが必要であれば、900個、そしてインジケータ自体で作業し、なぜExpert Advisorにそれらをドラッグするのですか?正しいタスクが成功の50%である


例えば5分、15分、30分の3つの時間枠で、指標の最小、最大のピークを比較し、トレンドを判断する必要がありますが、私はピークを推測することはできません、それは全体の歴史の中でターンを取る必要があります。300本の歴史を例にとりました。

icustomを使うには、やはりリソースがかかりすぎるのです。

 
ijonhson:

私は、トレンドを決定するために、例えば5分15分と30分の3つの時間枠の最小および最大ピークの指標を比較する必要があり、私はピークを推測することはできません、それは全体の歴史を通して見なければならないことです。300本の歴史を例にとりました。

icustomを使うには、まだリソースが多すぎるのです。


最初の計算でIndicatorCounted()関数が-1を与えるので、Expert Advisorでどのようにそれを置き換えることができるのか、ontickで質問が残っています。

 
ijonhson:

"変更する必要はありません" - つまり、Expert AdvisorのonTickでも、インジケータのonCalculateでも正しく動作するのでしょうか?

いや、そこには全く必要ないという意味です。

 
Alexey Viktorov:

いや、そこに必要性が全くないという意味です。


Dug uphttps://www.mql5.com/ru/articles/1456、調べて みますが、もっと簡単な方法があるのではと思いました。

Перенос кода индикатора в код эксперта. Строение индикатора.
Перенос кода индикатора в код эксперта. Строение индикатора.
  • 2007.02.16
  • Nikolay Kositsin
  • www.mql5.com
Прежде чем приступить к основной теме статьи, мне следовало бы вкратце коснуться общего строения индикатора под углом зрения программиста, которого этот индикатор интересует, как будущая часть кода эксперта: Вполне естественно, что у реального индикатора может быть другое количество отображаемых индикаторных значений, другое количество...
 
ijonhson:

質問は、エキスパートアドバイザでそれを置き換える方法最初のチェックでontick関数IndicatorCounted()で開いたまま?

刻み目 ごとに上部に目を通す必要はなく、変化しない。

EAでは、バーのオープニングでサイクルを確認し、トップが見つかり次第、サイクルを終了します。

   int count=Bars(Symbol,Period);
   for(int i=0; i<count; i++) {
     // ищем и запоминаем в переменную, если нашли break;
   }
 
ijonhson: 質問はontickで開いたまま、最初の計算でIndicatorCounted()関数は、-1、何がExpert Advisorでそれを置き換えるのだろうか?

IndicatorCounted()関数は、以前はstart()関数と一緒にインジケータで使用されていました。OnCalculate() を持つ新しいインジケータは、代わりに2番目のパラメータprev_calculatedを使用します。特別に解析してみたところ、1.5倍も違うことがわかりました。その差はわずかで、すでに何本の小節が計算されているかを示しています。0(または-1)であれば、すべてのバーを計算する必要があります。これは、インジケータを起動する際に、線全体を描画し、結果をバッファ配列に保存しなければならないときに発生します。次のティックでは、最後のバーのデータのみを再計算する必要があります。したがって、ゼロ(または-1)値で行われることは、EAのOnInit()に配置する必要があります。残りの部分は、ごくわずかですが、OnTick() に配置します。

 
YarTrade:

ありがとうございます。頑張ります。ロングタイプについては、なぜか教科書に書いてありませんでした。

long int または short(あるいは他の言語の単語)にカーソルを置いて、F1キーを押す必要があります。

 
ijonhson:

ありがとうございます。しかし、私が関数の説明から理解する限り、それは私が指定した場所で、1つの値を得るために、指標のすべてのコードを実行します。つまり、すべてのトップを得るために私は指標のコードをn回計算する必要があります(すべてのバーに一つずつ目を通して)、私はいくつかの時間枠でこの指標のトップの順序を比較する必要があります。

そして、手動でトップを探すことになります。

これは絶対に間違っている!エキスパートアドバイザーからiCustom()を使用して呼び出されたすべてのインジケーターバーは、一度だけ再計算されます!次のインジケーターの呼び出しは すべてすでに計算された結果で動作し、前の呼び出しで計算されていないバーだけが再計算されます。例えば、H1チャートから新しいバーごとにM15期間インディケータを呼び出すと、インディケータへの呼び出しから15分足の4本のバーが再計算されないことが判明しました。そのため、この4本のバーだけが再計算されます。

0からxxxまでの一連のバーをループしても、インジケータは最初の呼び出しで一度だけ再計算されます。以下のすべての呼び出しは、再計算を行いません。

 
ijonhson:

Dug uphttps://www.mql5.com/ru/articles/1456、調べて みますが、もっと簡単な方法があるのではと思いました。

これは悪い例です。もう10年前の作品なんだ!!!言葉はすでに良い方向に変化しています。