*

(MQL4)MT4のチャート上にボタンを作るやり方[EA自作]

Originally posted 2019-01-24 18:42:53.

現在のMT4は比較的いろいろな機能が追加されていて、DLLや拡張ファイルを使わずに、EA単体でボタンやフォームを作ることが可能です。

昔はオブジェクト表示の専用のdllとかが必要で、高額で販売されていたんですけどね~(それだけをやっている会社とかあったんですけど、どうなったことやら…)

 

MT4のチャートのボタン

ボタンをただ表示するだけでなく、
「ボタンを押したら××を実行する」
などのようなインタラクティブな機能を実装することができます。

ボタン操作は、OnChartEvent内に記述します。

逆に言うとこれまでスルーされていたOnChartEventの唯一と言っても過言ではない出番です。

OnChartEventはティック更新のイベントとは別で、チャート内でイベントが発生した際に呼び出されます。

ボタンは、
色、大きさ、文字、位置など
すべて自由に変更できます。

また、複数のオブジェクト(ボタン)同時に表示させることもできるので、
EAを稼働させつつ、裁量トレードボタンを表示する、
なんていうことも可能になります。

bandicam-2016-12-28-15-47-06-958

オブジェクトの操作は、作る作業と設定する作業に分かれます。

オブジェクトを作る

これはラベルや矢印やテキストと同じなので問題ないと思います。OBJ_BUTTONを指定するだけです。

(現在のチャートにbuttonIDという名前のオブジェクトを作る。オブジェクトの種類はボタン)

オブジェクトのプロパティを設定する

ってな感じで一個一個関数を呼び出して設定する必要があります。めんどくさいですね。しかし、これも他のオブジェクトと同じなので特に引っ掛かる要素はないと思います。

 

ボタンが押されている状態

id, lparam, dparam, sparamはOnChartEvent上で使える変数です。

ObjectGetInteger(0,buttonID,OBJPROP_STATE)でボタンの状態を取得することができます。押されている場合はif文の中で処理を書けばOkです。

 

 

押したボタンを押してない状態にするには

ボタンが押されているかどうかを判定するにはOnChartEvent内で記述を行います。

先に言っておくと、MQLでのボタンの挙動は押すと勝手に押してない状態に戻る訳ではなく、

「”押された状態”から”押されていない状態”に戻す記述」が必要です。

(ちょっとややこしくなってきましたね。)

つまり、そもそもボタンというものには

押された場合に”押された状態”を維持し続けるタイプのボタンと

押されたら押されていない状態に勝手に戻るボタン

の二種類があるという前提があります。

MQLでは後者がデフォルトになっているので、

押したら”押されていない状態”に戻るボタンを作るには、押されたら1秒後に押されていない状態に勝手に戻る記述を別途しなくてはなりません。

ObjectGetInteger(0,buttonID,OBJPROP_STATE)がtrueの時がボタンが押されている状態です。

 

ボタンが押されていない状態に戻す

これでオブジェクトの状態を元に戻せます。ボタンが押されてすぐにこの状態に戻してしまうと、押されたかどうかユーザーが分からないくらいすぐに戻ってしまうので、少し時間をおいてから(0.5秒とか1秒とか)、ボタンの状態を戻すのが良いと思います。

 

応用版:外部ソフトなしでチャート上に操作パネルを表示する

 

[Q&A]チャート上に複数のボタンオブジェクトを設置して…(MQL4)

Q.

ラベルの上に複数のボタンオブジェクトを設置して、ラベルを選択状態にして、ドラックしたら上に乗っているオブジェクトも移動するようなことは可能でしょうか

A.

チャートオブジェクトの関数群を使えば可能だと思います。build610以降のMT4ではオブジェクト関数群が追加されているので、従来と比較して簡単に実装することができます。

ただ、ちょっと気になることとして、ドラッグというのが ”マウスの左クリックを押し続けた状態で、マウスカーソルを移動させること”を意味していると思うのですが、これはUIを変えた方がよさそうな雰囲気はしています。

 

最近のITの世界ではリアルタイムGUIによる操作が標準になりつつありますが、MQL4はそもそもCをベースにした低級言語のため、GUIにはあまり向いていないという性質があります。

そのため、ちょっと古臭いUI(入力ボックスと)決定ボタンのようなUIにした方がいいんじゃないかな~とは思います。

 

ただ、グラフィカルオブジェクトをいじるということはMQL4の経験がそこそこある方だと思いますので、ドキュメントがあればなんとかなると思います。

 

チャートイベントに関するドキュメントはこちら

https://docs.mql4.com/eventfunctions/eventchartcustom

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。
 

コメント

  1. 山崎 より:

    ボタンスイッチすごく重宝しています
    しかしスイッチを複数同時に表示させる方法がどうしてもわからなく
    初めてメールさせていただきました

    お手数だとは思いますがどのように作ればいいのか教えてはいただけないでしょうか?
    よろしくお願いします

  2. 管理人 より:

    ボタンオブジェクトはオブジェクトの名前でそれぞれ区別することができます。
    https://fxantenna.com/post-1417/
    を例にすると、
    BUYボタン、SELLボタン、△、▽、各種時間足ボタンがありますが、
    それぞれ名前と座標を変えれば別物として扱えます。


    CreateButton("▲ CALL/BUY",200,70,30*1,30*10,clrRed,20);
    CreateButton("▼ PUT/SELL",200,70,30*1,30*6,clrBlue,20);

    CreateButton("1min", 40,20,20, 30*1+10,clrNavy,8);
    CreateButton("3min", 40,20,20+45*1,30*1+10,clrNavy,8);
    CreateButton("5min", 40,20,20+45*2,30*1+10,clrNavy,8);
    CreateButton("10min",40,20,20+45*3,30*1+10,clrNavy,8);
    CreateButton("60min",40,20,20+45*4,30*1+10,clrNavy,8);

    CreateButton("▲",15,15,110,80,clrNavy,5);
    CreateButton("▼",15,15,110,64,clrNavy,5);
    //CreateButtonはオリジナル関数

    あとはOnChartEvent内で

    if(id==CHARTEVENT_OBJECT_CLICK)
    {
    if(clickedChartObject==IntegerToString(30*1,3)+IntegerToString(30*10,3))
    {
    selected=ObjectGetInteger(ChartID(),IntegerToString(30*1,3)+IntegerToString(30*10,3),OBJPROP_STATE);
    if(selected)
    {
    //ボタン(BUY)が押された時の処理
    }
    }
    if(clickedChartObject==IntegerToString(30*1,3)+IntegerToString(30*6,3))
    {
    selected=ObjectGetInteger(ChartID(),IntegerToString(30*1,3)+IntegerToString(30*6,3),OBJPROP_STATE);
    if(selected)
    {
    //ボタン(SELL)が押された時の処理
    }
    }

    のときのようにifで分けて処理すればOKです。

Message

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

(MQL4)ロウソク足が確定したタイミング(始値)で演算するやり方[EA自作]

EAやインジケーターの演算はティック更新毎に行われますが、演算内容によってはロウソク足が確定するタイ

記事を読む

EAが動かないときのその原因 一覧

「EAが動かな~い」というときには様々な原因と可能性がありますが、それらを一個一個解消していかないと

記事を読む

(MQL4)iCustomでインジケーターをEA化するやり方[EA自作]

インジケーターとiCustom 今回はインジケーターのシグナルを使って、EAを作ります。 iCu

記事を読む

[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5)

良いEAができると、クレクレ厨がよってきますが、身内の人にならひっそりと配布したい場合もあります。

記事を読む

[ソースコード開示]たった30行のコードでも右肩上がりにすることはできるのさ(MT4EA)

バックテスト結果   ソースコードはこちら 33行あるやんけ...

記事を読む

 
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

     


  • 横瀬兼元(ペンネーム)です。

    プロフィール
    商材を買わせようとする偽者がいるらしいのでご注意ください。
    ツイッター始めました(イマサラー)
    https://twitter.com/FxantennaC
    (埋め込みするとページ表示が極端に遅くなるので、リンクでご容赦を) 4000文字未満のトピックや話題はツイッターで発信しています。
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

Translate »
ページトップへ