質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

1572閲覧

オブジェクトのイベントについて

nisei2

総合スコア19

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2020/12/13 13:26

調べながらボタンを作成していたのですがボタンをクリックしたときの処理がうまくいかず困っています。
long_term_legsは最初trueに設定しておりボタンを押すことでtrueとfalseを切り替えたいのに切り替わってくれません。
このコードのどこがおかしいのか教えてもらえないでしょうか?

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
if(id == CHARTEVENT_OBJECT_CLICK && sparam == "position_total_R" && long_term_legs == true)
long_term_legs = false;

if(id == CHARTEVENT_OBJECT_CLICK && sparam == "position_total_R" && long_term_legs == false)
long_term_legs = true;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1回目のif文に入ったあとすぐに2回目のif文に入ってしまうからです。

MQL4

1void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam) 2{ 3 if(id == CHARTEVENT_OBJECT_CLICK && sparam == "position_total_R" && long_term_legs == true) 4 long_term_legs = false; 5 else if(id == CHARTEVENT_OBJECT_CLICK && sparam == "position_total_R" && long_term_legs == false) 6 long_term_legs = true; 7}

投稿2020/12/13 14:16

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nisei2

2020/12/13 14:35

なるほど、こういう時はelseを使えばよかったんですねありがとうございます。 何回も申し訳ないのですが、水平線の表示非表示をボタンで行いたかったので if(long_term_legs == true)の時水平線オブジェクト処理を行い if(long_term_legs == false)の時その水平線をデリートする処理を書いてました。 しかし、教えてもらった通りelseでイベント処理を書き直したのですが水平線をボタンで消すことは出来ませんでした。 イベントの所ががvoidなのが原因でしょうか?
mah

2020/12/13 14:58

ソースがないとわかりません。
nisei2

2020/12/13 15:08

bool long_term_legs = false; //長期足の4本値表示 bool mid_term_legs = false; //中期足の4本値表示 /*--------------------------------------------------//長期足の4本値オブジェクト--------------------------------------------------*/ if(long_term_legs == true) { //上位足高値オブジェクト--------------------------------------------------------------------------- ObjectCreate("high_line_MNH",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iHigh(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("high_line_MNH",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("high_line_MNH",OBJPROP_COLOR,clrDarkViolet); //上位足安値オブジェクト--------------------------------------------------------------------------- ObjectCreate("high_line_MNL",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iLow(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("high_line_MNL",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("high_line_MNL",OBJPROP_COLOR,clrDarkViolet); //上位足始値オブジェクト--------------------------------------------------------------------------- ObjectCreate("high_line_MNO",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iOpen(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("high_line_MNO",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("high_line_MNO",OBJPROP_COLOR,clrDarkViolet); //上位足終値オブジェクト--------------------------------------------------------------------------- ObjectCreate("high_line_MNC",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iClose(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("high_line_MNC",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("high_line_MNC",OBJPROP_COLOR,clrDarkViolet); } if(long_term_legs == false) { ObjectsDeleteAll("high_line_MNH","high_line_MNL","high_line_MNO","high_line_MNC"); } こんな感じです。
mah

2020/12/13 15:23

ObjectsDeleteAllの使い方を間違えています。
nisei2

2020/12/14 09:51

if(long_term_legs == true) { //上位足高値オブジェクト--------------------------------------------------------------------------- ObjectCreate("MN_high_low_H",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iHigh(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("MN_high_low_H",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("MN_high_low_H",OBJPROP_COLOR,clrDarkViolet); //上位足安値オブジェクト--------------------------------------------------------------------------- ObjectCreate("MN_high_low_L",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iLow(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("MN_high_low_L",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("MN_high_low_L",OBJPROP_COLOR,clrDarkViolet); //上位足始値オブジェクト--------------------------------------------------------------------------- ObjectCreate("MN_high_low_O",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iOpen(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("MN_high_low_O",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("MN_high_low_O",OBJPROP_COLOR,clrDarkViolet); //上位足終値オブジェクト--------------------------------------------------------------------------- ObjectCreate("MN_high_low_C",OBJ_HLINE,0,iTime(NULL,get_Long_Term_Legs(),1),iClose(NULL,get_Long_Term_Legs(),1)); //ラインの作成と座標指定 ObjectSet("MN_high_low_C",OBJPROP_STYLE,STYLE_SOLID); //ラインの種類 ObjectSet("MN_high_low_C",OBJPROP_COLOR,clrDarkViolet); } if(long_term_legs == false) { ObjectsDeleteAll(ChartID(),"MN",EMPTY,EMPTY); } chart_idというところがよくわからず自分なりにやってみたのですがラインは消えませんでした。
mah

2020/12/14 13:36

chart_idは開いているチャートのウィンドウの通し番号みたいなもんです。 自分のところでは↑のソースで動いているので、他のところでなにか間違えているのでは? ライン名称が前回(high_line_)と変わっていますが、それが残っているだけとか。
nisei2

2020/12/18 10:00

返事が遅れてすみません。 いろいろ試した結果なんとかこちらでもできました。 extern bool で変数を定義していたのがダメだったみたいです。 ありがとうございました。
nisei2

2020/12/18 19:02

すいません、このイベント関係の質問になるのですがここで聞いてもいいでしょうか? 僕のPCが悪いのかもしれないのですが少し気になることがでてきまして。 もし質問を立て直した方がいいならそうします。
mah

2020/12/18 19:18

短ければいいと思いますが、ソースとかを張り付ける場合は新規の方がいいんではないでしょうか。 もちろん回答できる保証はないので、新規で回答がつかない場合はわからなかったと思ってください。
nisei2

2020/12/18 21:12 編集

先に間違った事を言ってしまったことを謝ります、すみません。聞きたかったのは処理がとても重くなるということなんですが、前教えてもらったときイベントのコードをあれこれしてたら重くなった時があったのでさっきイベント関係といってしまったんですが間違いです。 おそらく下記に書いたコードが原因?なのかもしれません。 前重くなった時最適化?みたいなことが必要なのかと思い、今まで関数で書いてたところを変数にいれて置き換えるなどいろいろ挑戦してたのですがその時 int limit = Bars - IndicatorCounted() - 1; if(limit < 1) limit = 1; for(int i = limit; i >= 0; i--){処理} こんなコードを知りOnCalculateの括弧の中に記入して↑のコードの「」内に今までのコードを書いていたのですがこれはなにか問題があるコードなのでしょうか? また処理を軽くするためにした方がいいことなど教えてもらえたら助かります。
mah

2020/12/19 02:16

OnCalculateの中で未計算のバーを計算するためにループするのはインジケータでは普通のことです。 そのへんは入門書に書いてあるのでは? ループの中で重い処理をやればもちろん重くなります。 ループの中に何が書かれているかわからない状態ではそれ以上はわかりませんので、解決しないのであれば新規の方がいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問