特定指標のユニークIDジェネレーター - ページ 3

 
Ovo: 教えてもらった」という意味かどうかはわかりませんが。デバッグ用にいくつか使っていますが、__DATETIME__については まだ使い道が見つかりませんでした...どこを目指しているのでしょうか?

すみません、同じインジケータを複数のウィンドウで表示することをお探しなのを忘れていました。

何か別の方法を考えてみます。

===============================================

あはは、やってみたよ。ちゃんとした長さ計算をする関数を 作る。

そして、その関数が完了するまでの時間経過を固有番号として返す。

 

TimeCurrent()はユニークな数字です。

この時刻をラベルに保存して使ってみてはいかがでしょうか?

 
Ovo:
なぜなら、私はすべてのアドバイスを試しているわけではないからです。私はセンスのあるものだけを選んでいるのです。
あなたを助け ようと する人に対してはその 傲慢な 態度を慎む ことをお勧め します。そのような態度はこのフォーラムでは歓迎されません。
 
angevoyageur:
あなたを助けようと する人に対してはその 傲慢な 態度を慎む ことをお勧め します。この ような態度は、このフォーラムでは歓迎 されません。

私は近づかないようにします。
 

どうして私の考えが無意味だと言えるのでしょうか?

時間電流は 一意な数字です...

次のコードを試してみてください...1つのチャートに貼り付けてください...ただし、異なる入力周期で

#property strict
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
extern int periode=4;
int OnInit()
  {
//--- indicator buffers mapping
string shortname=StringConcatenate(WindowExpertName(),"_",periode);
IndicatorShortName(shortname);
int wind=WindowFind(shortname);
string name=StringConcatenate("TIME_TAG",wind);
  if (ObjectFind(name)!=wind)
  {  ObjectCreate(name, OBJ_LABEL, wind, 0, 0);
      ObjectSet(name, OBJPROP_CORNER,2);
      ObjectSet(name, OBJPROP_XDISTANCE,2 );
      ObjectSet(name, OBJPROP_YDISTANCE,5); 
      ObjectSetText(name,DoubleToStr(TimeCurrent(),0)+DoubleToStr(wind,0) ,9,"Arial",Yellow);   
  }
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
WDholic:

TimeCurrent は一意な番号です。

以下のような様々な状況が考えられる中、TimeCurrent()は一意の番号ではありません。

* 複数の既存チャートとそれらのチャートに接続された複数のインジケータを持つMT4のコピーを再始動している場合。これらはすべて同時に初期化され、同じTimeCurrent()が表示されます。

*流動性が低い期間に指標のコピーを追加している。ブローカーの価格フィードの種類によっては、5~10秒間新しいティックがなく、TimeCurrent()が変化しない時間帯があります。そのような期間に新しいインディケータを追加すると、TimeCurrent()の値が同じになります。

 
string name=StringConcatenate("TIME_TAG",wind);
  if (ObjectFind(name)!=wind)
  {  ObjectCreate(name, OBJ_LABEL, wind, 0, 0);
      ObjectSet(name, OBJPROP_CORNER,2);
      ObjectSet(name, OBJPROP_XDISTANCE,2 );
      ObjectSet(name, OBJPROP_YDISTANCE,5); 
      ObjectSetText(name,DoubleToStr(TimeCurrent(),0)+DoubleToStr(wind,0) ,9,"Arial",Yellow);   
  }

TIME TAGラベルが見つからない場合のみ、TIME TAGを追加する。

そのため、deinit時にTIME TAGの ラベルを削除しない。

もし、5秒や10秒の間に刻み目がないことを心配するなら、Time Currentの代わりにTimeLocalを 使うことができるかもしれません。

 
WDholic:

TIME TAGラベルが見つからない場合のみ、TIME TAGを追加する。

そのため、deinit時にTIME TAGの ラベルを削除しない。

もし、5秒や10秒の間に刻み目がないことが心配なら、Time Currentの代わりにTimeLocalを使うことができる。

...また、チャート・オブジェクトに関しても、上で述べたような問題があります インジケータをチャートに追加して、テンプレートを作成すると、そのテンプレートから作成された新しいチャートはすべて同じTIME_TAG値を持つことになります。そして、オブジェクトの使用は、1つのチャートにつき1つのインジケータのインスタンスしか許可しません。IndicatorShortNameに可能な限りの パラメータを入れない限り、複数のインジケータは同じIDを取得することになります。

 
gchrmt4:

...また、チャート・オブジェクトについては、前述した問題があります。チャートにインジケータを追加してからテンプレートを作成すると、そのテンプレートから作成されたすべての新しいチャートは同じTIME_TAG値を持つことになります。そして、オブジェクトの使用は、1つのチャートにつき1つのインジケータのインスタンスしか許可しません。IndicatorShortNameに可能な限りの パラメータを入れない限り、複数のインジケータは同じIDを取得することになります。


試してみてください。

1つのテンプレートに5つのインジケータを設定すると...

例:時間値が111111000の場合

ウィンドウ1には 1111110001が 表示されます。
を表示させると、2番目の ウィンドウには1111110002が 表示されます。
が表示され、ウィンドウ3には 1111110003が 表示されます。
4には 1111110004と 表示されます。

5の ウィンドウでは1111110005と 表示されます。

なぜなら、ウィンドウ番号を含むからです

ObjectSetText(name,DoubleToStr(TimeCurrent(),0)+DoubleToStr(wind,0),9,"Arial",Yellow).となります。


IndicatorShortNameに可能な限りのパラメータを 入れないと、 複数のインディケータが同じIDを 取得することになります。

はい、それは考慮されるのは良いことです。

しかし、OVOやあなたのようなマスターコーダーにとっては簡単なことでしょう。

 
WDholic:

1つのテンプレートで5つのインディを異なるセッティングにした場合。

MT4のどのバージョンをお使いか分かりませんが、私のPCのv616では、OnInit()中にWindowFind()が-1を返します。ドキュメントには ずっと "WindowFind() は init() 関数が動作するときにカスタムインジケータが自分自身を検索する場合は -1 を返す。"と書いてありました。