【MQL4 : MT4】GUI で 売買機能を実装した EA を作る。① 【Dialog】

23/09/22追記
note購入者はDMして下されば続きが読めます！
https://note.com/iceseeds/n/nfdae2c5ac2ef

# はじめに
ここでは、GUIで売買機能（ワンクリックトレード）を実装します。
作成手順としては、以下の通りです。

1. GUIの基盤
2. ロットを表示するEdit部品
3. ロットを増減させるButton部品
4. 買い、売りを入れるButton部品
5. それぞれの部品にイベントを付与

1 の GUIの基盤 に関しては前回の記事をご覧ください。
[【MQL4 : MT4】GUI の インジケータ | EA を作る【備忘録】](https://qiita.com/IceSeed/items/648d80af445e5db01380)
※前回とは画面サイズを変えています。
`if( !AppWindow.Create( ChartID(), "SampleTitle", 0, 50, 50, 500, 400 ) )`
            　　　　　　　　　　　　　　　　　　　↓↓↓↓
`if( !AppWindow.Create( ChartID(), "SampleTitle", 0, 0, 0, 250, 100 ) )`


いろいろと初心者な為、至らない部分もありますが、宜しくお願いします。


部品を作成する部分は、複雑になるので、別ファイルに分けます。

- Experts/
    - Sample/
        - guiwindow.mq4 　　 ←前回の記事で...
        - AppWindow.mqh　　←このファイルで作業します。

---

## ロットを表示させるEdit部品を作成
ロットを表示させるEdit部分を作ります。
今回は、バリデーションを「マイナスは受け付けない」のみ実装します。
**↓↓　Editを作成するを作成するコード　↓↓**

```AppWindow.mqh
#include <Controls\Dialog.mqh>
#include <Controls\Edit.mqh>  //--- 1

class CPanelDialog : public CAppDialog
{
   public:
       CPanelDialog();
      ~CPanelDialog();
   
      /* create */  //--- 2
      virtual bool      Create( const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2 );
      
      CEdit             m_editLots; //--- 3
      
   protected:
      bool              CreateEditLots(); //--- 3
};

CPanelDialog::CPanelDialog(){}
CPanelDialog::~CPanelDialog(){}

bool CPanelDialog::Create( const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2 )
{
   if( !CAppDialog::Create( chart, name, subwin, x1, y1, x2, y2 ) )
      return false;
   
   if( !CreateEditLots() )    return false;
   
   return true;
}

bool CPanelDialog::CreateEditLots()
{
   int widths = ClientAreaWidth() / 5; //--- 4-1
   int x1 = widths;
   int y1 = 0;
   int x2 = widths * 4;
   int y2 = 20;
   
   if( !m_editLots.Create( m_chart_id, m_name + "Edit", m_subwin, x1, y1, x2, y2 ) ) return false;
   if( !m_editLots.ReadOnly( false ) ) return false; //--- 4-2
   if( !Add( m_editLots ) ) return false;
   m_editLots.TextAlign( ALIGN_CENTER );
   m_editLots.Text( "0.10" );　//---　4-3
   
   return true;
}
```

### ソースコード詳細

##### 1. Controlsフォルダの中のEdit.mqhをインクルードする。
```
#include <Controls\Edit.mqh>
```

##### 2. create関数を宣言
この関数を使って、いろんな部品を作っていきます。

```
Create( const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2 );

Create( ChartID、 部品の名前、 表示ウィンドウ、 表示位置 X軸、 表示位置 Y軸、 部品サイズ X、 部品サイズ Y ) )
```

##### 3. Editの宣言

```
      CEdit             m_editLots;
 
      bool              CreateEditLots();
```

##### 4-1. Editの表示位置とサイズ

```
   int widths = ClientAreaWidth() / 5;　
   int x1 = widths;     　　AppWindowの1/5のサイズ
   int y1 = 0;　　　　　　　　高さ0
   int x2 = widths * 4;　　　AppWindowの4コ文
   int y2 = 20;　　　　　　　20 cm? px?
```
ClientAreaWidth()でAppWindowの横幅を取得します。
それを5分割して、表示位置などを指定しています。

##### 4-2. Editの読み込み設定
初期設定は、読み込みだけなので、書きこめるようにします。

```
if( !m_editLots.ReadOnly( false ) ) return false;
```

##### 4-3. Editの表示文字
```
m_editLots.Text( "0.10" );
```

## 実行結果
![Screenshot_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542117/974647a6-f5d1-9170-d308-e934254ae8f9.png)


## さいごに
今回は、ロットを表示させるところまでを実装しました。
明日は、Buttonを実装します:thumbsup_tone1:

YoutubeでLive配信しながら作ってます。
https://www.youtube.com/channel/UCcTw_iVgpLfrep9f94KxwLg?sub_confirmation=1 
チャンネル登録お願いします:relaxed:

Twitterでは毎日呟いています。
https://twitter.com/IceSeed_bz
フォローお願いします:relaxed:

明日は、Buttonを実装します。
お疲れ様。:eye::eye: