初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1345

 
Vitaly Muzichenko #:

繰り返しになりますが、次のコピーを読み込む際に、プレフィックスを変更する必要があるのでしょうか?

その目的は何ですか?

ボタンを作成し、窓の外からコントロールすることができます。


どうなるんだろう

 
Igor Makanu #:

その目的は何ですか?

また、ボタンを作成し、ウィンドウの外からコントロールすることも可能です。


なんだろう

よくわかりませんが、サブウィンドウに作成し、クリックするとこのサブウィンドウの番号を取得する、というような感じでいいと思います。何も描画する必要はなく、クリックするとAlertにサブウィンドウの番号に関する情報が表示されるボタンがあるだけです。

 
Vitaly Muzichenko #:

よくわかりませんが、サブウィンドウで作成し、それをクリックするとサブウィンドウの番号が表示される、という方法です。何も描画する必要はなく、クリックするとAlertにサブウィンドウの番号に関する情報が表示されるボタンがあるだけです。

は、最初のソースで確認しました。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


このインジケータをデフォルトのパラメータで複数回実行すると、ボタンはサブウィンドウの最初のインジケータにのみ表示されます。

が、起動中にパラメータを変更すると全てOKになる


いっぱんにわからなくなる

 
Igor Makanu #:

最初のソースで確認しました。

このインディケータをデフォルトのパラメータで複数回実行すると、ボタンはサブウィンドウの最初のインディケータにのみ 表示されます。

が、起動中にパラメータを変更すると全てOKになる

いっぱんにわからなくなる

そこで質問ですが、設定に入らずに、自動的にパラメータを変更する方法はありますか?

今のところ何も動いていない・・・。

---

追伸:理想はともかく、残念なことに

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

今のところうまくいっていない・・・。

そして、そうならない。

を追加しました。

int OnInit()
{
   Print(__FUNCTION__);

あるインジケータを置くと、ログにOnInitが表示されるが、次のインジケータはすでに沈黙している、つまりインジケータの1つのコピーだけが本当に実行されていて、他のインジケータは単なるグラフィックシェルである。

 
Igor Makanu #:

となってしまい、うまくいきません。

を追加しました。

インジケータを置いた - ログにOnInitが表示されるが、次のインジケータはすでに沈黙している、つまり、インジケータの1つのコピーだけが実際に実行されており、他のインジケータは単なるグラフィックシェルである。

そういうものなんです。mt5のアーキテクチャがおかしいのでしょう。mt4端末は正常に動作しています。

mt5でそうすることにした場合、存在するようで存在しないので、同じ入力パラメータでインジケータのコピーを実行することを禁止することになります。

 
Vitaly Muzichenko #:

そういうことなんです。mt5のアーキテクチャは滅茶苦茶なんだろうな。mt4ではすべて正常に動作しています。

mt5でそう決めたのであれば、あるようで実はないのだから、同じ入力パラメータを持つインジケータコピーの起動を禁止すべきでしたね。

インジケーターの計算部分は、グラフィカルなものと同じではありません。したがって、計算部分はどれも同じです。グラフィカルなものがいくつかあります。

1つのインジケーターで全てのサブウィンドウを検索し、サブウィンドウ番号を記載したラベルを貼ることはできないのでしょうか?同時に、チャートのサブウィンドウの数をタイマーでキャッチするために:増加 - 新しいサブウィンドウのラベルに追加します。でも、どんなインジケーターが配置されているかも検索してみてください。もし違うのであれば、追加しないでください...。

ただ、未検証のアイデアです。

ZS.「曲率」については、納得がいきません。20の同じ指標に対して20の計算部があるより、20の同じ指標に対して1つの計算部がある方が良い。

 
Artyom Trishkin #:

指標の計算部分はグラフ部分と同じではありません。したがって、計算部分はどれも同じです。グラフィカルなものがいくつかあります。

1つのインジケーターで全てのサブウィンドウを探し、サブウィンドウ番号の入ったラベルを貼ることはできないのでしょうか?同時に、チャートのサブウィンドウの数をタイマーでキャッチするために:増加 - 新しいサブウィンドウのラベルに追加します。でも、どんなインジケーターが配置されているかも検索してみてください。もし違うのであれば、追加しないでください...。

ただ、未検証のアイデアです。

ZS.「曲率」については、納得がいきません。20の同じ指標に対して20の計算部があるより、20の同じ指標に対して1つの計算部がある方が良い。

した、ボタンに反応しない - OnChartEventコピーがトリガーされず、サブウィンドウの番号を理解しない。

とにかく、以下がうまくいかない部分であり、それとともに残りのコードもあります。

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

初心者からのFAQ MQL5 MT5 MetaTrader 5

イゴール・マカヌ, 2021.09.12 21:53

しない

に追加されました。

int OnInit()
{
   Print(__FUNCTION__);

あるインジケータを置くと、ログにOnInitが表示されるが、次のインジケータはすでに沈黙している、つまりインジケータの1つのコピーだけが実際に動作しており、他のインジケータは単なるグラフィックシェルである。


 
Vitaly Muzichenko #:

した、ボタンに反応しない - OnChartEventのコピーが機能せず、サブウィンドウの番号を理解しない。

とにかく、以下はうまくいかない部分と、それに伴う残りのコードです。


しかし!!!このインジケータを2-3個、「Debug.tpl」という名前でテンプレートを作り、デバッグを開始すると、OnInit()が正常に動作するようになります。

一般的には、こんな実験をしてみました。

OnInit()で#propertyを最大にしたのは、インディケータが作成されていない間にOnInit()が実行され、ウィンドウ内のインディケータの数に応じて短い名前が作成されることを期待してのことです。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

しかし、それは何の役にも立たなかった。

1枚目のコピーを開始する

インジケータ名 2...........................

2つ目のコピーを開始する - インジケータ名は両方のインジケータで2のままです。

デバッグを開始すると、なんと!?まだロードされていないインジケータがすでに印刷されている...2行目と3行目を読んでください...。

なんでやねん


OnInit()に入るとデバッグが止まり、windows_total変数にゴミが入り、short_nameが空文字列のまま...。

ハイ......でも、もう全部印刷されてるんですけど......どうしてですか?

そして、short_nameはすでに変更されています。

その結果、デバッグモードでインジケータをフルロードした後、インジケータは次のような名前になります。

このようなバグは、開発者の注意を喚起すべきかもしれませんね...。

 
こんにちは、私は間違った場所にいるかもしれませんが、私はと呼ばれるセクションを参照してください: "初心者からの質問MQL5 MT5 MetaTrader 5"。 そこで私の質問は:私はテストのために市場からデモEAをダウンロードしていた私は今何をしたMT5は、デモをダウンロードすることはできません。 MT4は問題なく、MT5はありません何が理由ですか?