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

 
Artyom Trishkin:

上に示したのは、どうすればいいかということです。開発者が推奨する方法があるのに、なぜこんなに面倒なことをするのか。

どの時間帯にオブジェクトを表示し、どの時間帯に表示しないかを選択する問題だったのでしょうか?

チャート上にトレーディングパネルがあるとします。その後、手動でオブジェクト(トレーディングレベル、垂直線、長方形)を構築しています。

私が手動で構築したものは、すべてトレーディングパネルに適用されます。すべてのオブジェクトが同じ時間軸にある。

また、この場合、「開発者推奨の方法」はどのように役立つのでしょうか?

 
Aliaksei Karalkou:
こんにちは。

ATPインジケータを価格チャートに移したいのですが、どうすればいいですか?でも、どうしたらいいのかわからない。同時期の正中線からのボラティリティの最大値の動きを表示してほしい。もし、コードをお持ちの方がいらっしゃいましたら、教えていただきありがとうございます。

https://www.mql5.com/ru/code/23304

Multi_ATR_Bands
Multi_ATR_Bands
  • www.mql5.com
Индикатор Three ATR Bands with multiple selection
 
Artyom Trishkin:

OBJPROP_TIMEFRAMESのプロパティです。

OBJ_NO_PERIODS - すべての期間で表示されません。

OBJ_ALL_PERIODS - すべての期間について表示されます。

ありがとうございます。

この方法は本当にうまくいき、非常にコンパクトになりました。

そのオブジェクトは、他のオブジェクトの上に視覚的に表示されるようになりました。

 
Maksym Mudrakov:

どのタイムフレームにオブジェクトを表示し、どのタイムフレームには表示しないかを選択する問題だったのでしょうか?

チャート上にトレーディングパネルがあるとします。その後、手動でオブジェクト(トレーディングレベル、垂直線、長方形)を構築しています。

私が手動で構築したものは、すべてトレーディングパネルに適用されます。すべてのオブジェクトが同じ時間軸にある。

また、この場合、「開発者推奨の方法」はどのように役立つのでしょうか?

ご指摘を参考にさせていただきましたが、オブジェクトを削除して再描画するとチラツキが発生しました。

Artyom Trishkin氏が 提案した方法は、実際に効果があります。

これでオブジェクトの再描画やちらつきがなくなり、何より視覚的に残るようになりました。

ちなみに私の場合は、取引パネルで、取引開始と取引終了を矢印でブロックしていたのも原因です。

どうやって問題を解決したか

// Глобальное объявление
int last_tick_objects = 0;                // количество объектов на прошлом тике
// имена графических объектов:
string tp_rctngl = "TP Rectangle";
string sl_rctngl = "SL Rectangle";
string vol_rctngl = "Volume Rectangle";

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   long cid = ChartID();
   if(ObjectsTotal() != last_tick_objects)  // количество объектов поменялось
     {
      last_tick_objects = ObjectsTotal();   // запоминаем новое количество объектов
      // выводим на передний план объекты: tp_rctngl, sl_rctngl, vol_rctngl
      if(ObjectFind(cid, tp_rctngl) > -1) // объект существует
        {
         ObjectSetInteger(cid, tp_rctngl, OBJPROP_TIMEFRAMES, OBJ_NO_PERIODS);  // делаем невидимым на всех таймах
         ObjectSetInteger(cid, tp_rctngl, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS); // делаем видимым на всех таймах
        }
      //---
      if(ObjectFind(cid, sl_rctngl) > -1) // объект существует
        {
         ObjectSetInteger(cid, sl_rctngl, OBJPROP_TIMEFRAMES, OBJ_NO_PERIODS);  // делаем невидимым на всех таймах
         ObjectSetInteger(cid, sl_rctngl, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS); // делаем видимым на всех таймах
        }
      //---
      if(ObjectFind(cid, vol_rctngl) > -1) // объект существует
        {
         ObjectSetInteger(cid, vol_rctngl, OBJPROP_TIMEFRAMES, OBJ_NO_PERIODS); // делаем невидимым на всех таймах
         ObjectSetInteger(cid, vol_rctngl, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS);// делаем видимым на всех таймах
        }
      ChartRedraw(cid);// перерисовка графика для применения изменений
     }
  }
//+------------------------------------------------------------------+
 

私は、時々、異なる再計算のいくつかの長いサイクルを実行する必要があるEAを書いています(例えば、12、24、48時間ごと)。 このような再計算のたびに、1コア(つまり1スレッド)で1.5~2時間かかります。もちろん、これによって新しいティックの処理やこのEAでの取引は停止します。

...このような計算は、別のスレッドの別のEAに委ねることができ、EventChartCustom関数と OnChartEventイベントハンドラを使用して、最終データをEA間で転送することができる


しかし、私はEAをマーケットプレイスで公開できるようにする必要があります。したがって、同じスレッドで再計算と再計算を委任することは適切ではありません。このような特殊なEAをMQL5で実装するために、C++のスレッドライブラリの類似版などはあるのでしょうか?(検索エンジンのサイトに「ドキュメント」フィルターをかけて「スレッド」と入力しても、何も出てきません)。

 
Oleg Remizov:

ご指摘を参考にさせていただきましたが、オブジェクトを削除して再描画するとチラツキが発生しました。

Artyom Trishkin氏が 提案した方法は、実際に効果があります。

これでオブジェクトの再描画やちらつきがなくなり、何より視覚的に残るようになりました。

ちなみに私の場合は、取引パネルで、取引開始と取引終了を矢印でブロックしていたのも原因です。

どうやって問題を解決したか

要は、削除とレンダリングが頻繁に起こるからちらつくのであって、新しいオブジェクトの出現をキャッチすればいいだけなんです。その方法がうまくいけば、もちろん私も取り入れますが、ドキュメントにはそんな便利なプロパティは書かれていないので、今まで気にも留めていませんでした。

独自のトレーディングパネルと、同じくオブジェクトを構築するサードパーティ製のインジケータを併用する場合は、疑問が残りますが。

 
Maksym Mudrakov:

どの時間帯にオブジェクトを表示し、どの時間帯に表示しないかを選択する問題だったのでしょうか?

チャート上にトレーディングパネルがあるとします。その後、手動でオブジェクト(トレーディングレベル、垂直線、長方形)を構築しています。

私が手動で構築したものは、すべてトレーディングパネルに適用されます。すべてのオブジェクトは同じ時間軸にある。

また、この場合、「開発者推奨の方法」はどのように役立つのでしょうか?

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

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

オレグ・レミゾフ, 2020.04.26 14:44

ありがとうございます。

この方法は、本当に効果的で、非常にコンパクトであることが証明されました。

これで、そのオブジェクトは他のすべてのオブジェクトよりも視覚的に高い位置にあることになります。


 
Maksym Mudrakov:

要は、削除とレンダリングが頻繁に起こるからフリッカーが発生するのであって、新しいオブジェクトの出現をキャッチすればいいだけなんです。その方法がうまくいくのであれば、もちろん私も採用するのですが、ドキュメントにはそんな便利なプロパティは書かれていないので、気にしたことがありません。

独自のトレーディングパネルと、同じくオブジェクトを構築するサードパーティ製のインジケータを併用する場合は、疑問が残りますが。

スラバが勧めた方法が唯一受け入れられる方法だったのです。彼の投稿を検索することができます - 彼のプロフィール - 出版物/すべての投稿にあります。

そうそう、同じような状況で、すべてのオブジェクトを再作成するという方法はどうでしょうか?

 
Artyom Trishkin:

スラバは、この方法が唯一最適な方法だと勧めた。彼の投稿を検索することができます - 彼のプロフィール - 出版物/すべての投稿にあります。

そうそう、同じ状況で、すべてのオブジェクトを再作成するという方法は、どのように役立つのでしょうか?

私なら次のようにします。サードパーティのインジケータでObjectsTotal()を追跡し、私のパネルオブジェクトの最大のインデックスがObjectsTotal()-1より小さい場合、パネルを再作成する必要があります。まずはいろいろな場面で試してみる必要がありますが、今のところ、Objects Visibilityを使っても 自由度が増すとは思えません。
 
Artyom Trishkin:

Meta Trader 5をビルドできない