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

 

Tarasさん、マウスクリックでフレームが変わるようなグラフの正規化は可能でしょうか?

時々、習慣でカーソルがボタンの近くにあるときにクリックしてしまうのですが、その結果はあまり好きではありません。

イベント処理の リストに適当なものがなく、CHARTEVENT_CHART_CHANGEだけが あり、具体的な説明が ありません。マウスクリックをバインドすることはできますが、私の理解では、ユーザーはシステムメニューを操作することはできず、自分でボタンを作成した場合のみです。何か簡単な解決策はないのでしょうか?

 
psyman:

Tarasさん、マウスクリックでフレームが変わるようなグラフの正規化は可能でしょうか?

時々、習慣でカーソルがボタンの近くにあるときにクリックしてしまうのですが、その結果はあまり好きではありません。

イベント処理の リストに適当なものがなく、CHARTEVENT_CHART_CHANGEだけ、具体的な説明が ありません。マウスのボタンクリックをバインドすることはできますが、私の理解では、ユーザーはシステムメニューで作業することはできません、彼自身のボタンを作成する場合のみ。何か簡単な解決策はないのでしょうか?

つまり、チャート上のいくつかの "タップゾーン "をクリックすること?
できます。カーソル座標とマウスボタンのクリックを記録しておく必要があります。

チャートイベント_マウス_ムーブ

 

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

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

タラス・スロボダニク 2018.10.04 09:37

チャート上のいくつかの「タップゾーン」をマウスでクリックするということですか?
できます。カーソル座標とマウスクリックを記録しておく必要があります。



システムメニューのボタンではなく、チャート上のクリックであることです。このような出来事をどのように処理すればよいのか、私にはわからない。
 
psyman:

システムメニューからのボタンではなく、チャート上のクリックということです。このような出来事をどう処理したらいいのかわからない。

現在の文字期間を記憶し、"CHARTEVENT_CHART_CHANGE"で変更を確認し、必要な処理を行う。

 
OK、ありがとうございました。
 

EA本体のOnTick()の同じ関数が動作しない(というより、動作するが全てのチャートで正しく動作しない)理由を教えてください。

しかし、OnInit()プロシージャからは正常に動作しますし、通常のスクリプトからも動作します。Expert Advisorを一度に80チャート(20通貨、各4ウィンドウ W1 D1 H4 H1)にインストールしていますが、私のコンピュータが対応できないだけでしょうか?アドバイスをお願いします。このロボットの目的は、チャートの一つでシグナルが検出された場合、MessageBoxの メッセージを画面に出力することです。もしかしたら、このメッセージが出る瞬間にパソコンの動作が遅くなっているのかもしれません。
 

イベントが処理 されるまでの期間を記憶するのが面倒なんですが、どこでやればいいんですか?

CHARTEVENT_CHART_CHANGEが1回のクリックで2回処理され、ctime変数がリセットされることが判明したため、メッセージで追跡することにした。


#プロパティの厳密さ

#property indicator_chart_window

int ctimeです。


void OnInit()

{

Print(" OnInit------------1 ", ChartPeriod(0));

Print("OnInit ctime = ", ctime);

// ctime=ChartPeriod(0)とする。

}


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[])

{

ctime=ChartPeriod(0)。

return(rates_total);

}

void OnChartEvent(const int id,

const long &lparam,

const double &dparam,

const string &sparam)


{


if(id==CHARTEVENT_CHART_CHANGE)

{

Print("CHARTEVENT_CHART_CHANGEが開始されました ctime=", ctime);

if(ctime!=ChartPeriod(0))

{

Print(ChartPeriod(0), " CHANGED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", ctime)とする。

}

}

}



1時間足でインジケータを追加し、日足に切り替えた場合

2018.10.05 01:04:45.171 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE が開始されました ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: 1440 CHANGED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE が開始されました ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily:初期化されました。

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit------------1 1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1: uninit reason 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE を開始しました ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 60 CHANGED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE が開始されました ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 初期化されました。

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit------------1 60

2018.10.05 01:02:01.078 カスタムインジケータ _t1 CADJPY,H1: ロードに成功しました。





 
psyman:

イベントが処理 される前の期間が思い出せず困っているのですが、どこを処理する必要があるのでしょうか?

CHARTEVENT_CHART_CHANGEが1回のクリックで2回処理され、ctime変数がリセットされることが判明したため、メッセージで追跡することにした。

コードをメッセージに正しく入れてくださいこの形ではとても読みにくいですね。こんな感じなんでしょうね。

#property strict
#property indicator_chart_window
int ctime;
void OnInit()
   {
     Print("  OnInit------------1  ", ChartPeriod(0));
     Print("OnInit ctime = ", ctime);
   //  ctime=ChartPeriod(0);   
   }
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[])
  {
   ctime=ChartPeriod(0);         
   return(rates_total);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CHART_CHANGE)
      {
      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);
      if(ctime!=ChartPeriod(0))
      {
      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);
      }
      } 
}

チャートのパラメータを変更すると、インジケータが強制的にリロードされます。

必要なパラメータを保存するために、グローバルターミナル変数を使用することができます。

 
Vitaly Gorbunov:

コードをメッセージに正しく挿入してくださいこうやって読んでみると、とても難しいですね。こんな感じでいいんじゃないでしょうか。

チャートパラメータを変更した場合、インジケータは強制的に再起動されます。

必要なパラメータを保存するために、端末のグローバル変数を使用することができます。

はい、GlobalVariableに値を格納し、起動時にその存在を確認する必要があります。

つまり、チャート番号、シンボル、ピリオドを保存する必要があります。
そして、不要な変数を削除したり、最初は一時的なグローバル変数 にしたりします。

ps. チャート上のオブジェクトに情報を保存することも可能です - チャートが存在する限り、オブジェクトも存在します

 

もっと簡単だと思ってたんだけどな :-)

私のコードは取引やグラフィックに関係ないのですが、どのようなプログラムを使えばいいのでしょうか?

スクリプトは一回限りですが、ループで実行することは可能でしょうか?Expert Advisorを使ったことがないので、純粋に惰性でカスタムインディケーターを 宣言しました。今まで使ったことがないのですが、必要のない自動再起動をします。アドバイスをお願いします。

ps

オブジェクトは、視覚的に邪魔にならないように、ゼロサイズにすることができるのですね。