==MT4==
{{amazon|B017HFIIEA}}
*[https://mql4.metasys-seeker.com/category/index/ MQL4リファレンス]
*[https://www.mql5.com/ja/docs MQL5リファレンス]
===プログラムの種類===
*種類によって保存される場所が異なる
====スクリプト(Script)====
----
*Scriptsフォルダに保存される
*複数の処理をまとめて実行
*チャートに挿入すると一度だけ実行
====カスタム指標(Custom Indicator)====
*Indecatorsフォルダに保存される
*MT4にすでに組み込まれているテクニカル指標と同様に、チャートに挿入することで独自に作成したテクニカル指標をチャートにプロットする
====エキスパートアドバイザー(Expert Advisor,EA)====
*Expertsフォルダに保存される
*チャートに挿入すると、価格の変化に応じて自動売買のできるプログラム
*過去のデータに対して仮想売買を実行し結果を表示するバックテストにも利用可能
==売買注文==
===メタトレーダーで出せる注文===
#成行注文
##その時点での買い気配や売り気配ですぐにポジションを建てる
#逆指値注文
##待機注文の一種
##価格が一定になったら、成り行きで注文を建てる
##買いの逆指値は現在価格の上、売りの逆指値は現在価格の下に置かれる
##価格がその水準まで上昇、下落して、その後もそのポジションに動いて利益を生むことを想定する
#指値注文
##逆指値注文の逆
##価格がその水準まで上昇、下落したのち、反転して利益を生むことを想定する
##自動売買ではあまり使われない
==基本==
===コンパイル===
*ソースコードは拡張子、mq4
*コンパイルすると、ex4
[[File:mt4_programming_compile.png|600px]]
===変数===
----
====定義済変数====
----
{| class="wikitable"
|-
! scope="col"| 変数
! scope="col"| 意味
! scope="col"| 備考
|-
| Bid
| 売値
|
|-
| Ask
| 買値
|
|-
| Open
| 始値
| 配列
|-
| High
| 高値
| 配列
|-
| Low
| 安値
| 配列
|-
| Close
| 終値
| 配列
|-
| _Symbol
| 通貨ペア名
|
|-
| _Point
| 通貨ペアごとの異なる最小値幅
|
|-
| _Digit
| 小数点以下桁数
|
|-
| _Period
| 現在のチャートのタイムフレーム(分)換算
|
|-
|
|
|-
|
|
|-
|
|
|-
|
|
|-
|
|
|-
|}
====外部変数====
----
*トレーディングシステムに対して調整可能なパラメータ
*トレードやインディケーターの設定を行う
*変数の前に、extern をつけて宣言
===組込関数===
----
*[https://www.mql5.com/ja/docs MQL5リファレンス]
===定義済変数===
----
====[https://www.mql5.com/ja/docs/trading 取引関数]====
----
*自動売買を許可する必要がある
*ツール-オプション -エキスパートアドバイザ タブ - 自動売買を許可する にチェック
[[File:et4_ordersend.png|300px]]
{| class="wikitable"
|-
! scope="col"| 定義済関数
! scope="col"| 意味
! scope="col"| 備考
|-
| [https://www.mql5.com/ja/docs/trading/ordersend OrderSend]
| 取引操作の実行に使用され、リクエストを取引サーバに送信
|
|-
|
|
|-
|
|
|-
|
|
|-
|}
===プリプロセッサ===
----
{| class="wikitable"
|-
! scope="col"| プリプロセッサ定義
! scope="col"| 意味
! scope="col"| 備考
|-
| #property indicator_chart_window
| 指標をチャートと同じウインドウに表示
|
|-
| #property indicator_separate_window
| 指標をチャートと別のウインドウに表示
|
|-
| #property indicator_buffers N
| プロットさせる指標の数(N)
|
|-
| #propertyindicator_typeN
| 指標の種類を指定
| Nの部分は、1 - 512 を指定
|-
| #propertyindicator_colorN
| 指標の色を指定
| 例:#propertyindicator_color1clrRed
|-
| #propertyindicator_styleN
| 指標の線種
| STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT 例:#propertyindicator_style1STYLE_DOT
|-
| #propertyindicator_widthN
| 指標の太さ
| 例 #propertyindicator_width1 2
|-
|
|
|-
|
|
|-
|
|
|-
|}
====[https://www.mql5.com/ja/docs/account 口座情報]====
{| class="wikitable"
|-
! scope="col"| 定義済関数
! scope="col"| 意味
! scope="col"| 備考
|-
| [https://www.mql5.com/ja/docs/account/accountinfostring AccountInfoString]
| 口座のプロパティの値を返します
| [https://www.mql5.com/ja/docs/constants/environment_state/accountinformation#enum_account_info_string プロパティ]
|-
| [https://www.mql5.com/ja/docs/account/accountinfointeger AccountInfoInteger]
| 口座のプロパティの値を返します
| [https://www.mql5.com/ja/docs/constants/environment_state/accountinformation#enum_account_info_integer プロパティ]
|-
| [https://www.mql5.com/ja/docs/account/accountinfodouble AccountInfoDouble]
| 口座のプロパティの値を返します
| [https://www.mql5.com/ja/docs/constants/environment_state/accountinformation#enum_account_info_double プロパティ]
|-
|}
===関数のインポート===
----
<pre>
#import "library.ex4"
double MyFunction();
#import
</pre>
==プログラミング==
===スクリプト実行手順===
#ファイル-新規作成 からウィザードでスクリプトを作成
#コーディングして、コンパイル
#ナビゲーターウィンドウに出現するので、チャートにドロップ
#ターミナルウィンドウ「エキスパート」に出力された
[[File:mt4_dev_proc.png|600px]]
*スクリプトをはじめ、MT4で作成するあらゆるプログラムは、チャートに挿入して実行される
===カスタム指標(インディケーター)プログラミング===
----
*よく利用されるインディケーターとして、移動平均線や、ストキャスティックスなどがある
*カスタム指標は、チャート上にテクニカル指標データを順次プロットしていく
*プログラムは、チャート上の価格が更新されるたびに繰り返し実行される
====表示方法====
----
*配列を指標バッファにSetIndexBuffer()関数を用いて関連づける
*新規作成-カスタムインディケーター
<pre>
#property indicator_separate_window
#property indicator_buffers 1
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, buf);
//---
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=0; i<5; i++) {
buf[i] = close[i];
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
</pre>
[[File:mt4_custom_indicator.png|800px]]
===エキスパートアドバイザプログラミング===
----
*一般にEAはインディケーターを使って売買シグナルを点灯させる
====EA例====
----
<pre>
#property strict
input int FastMAPeriod = 10;
input int SlowMAPeriod = 40;
input double Lots = 0.1;
int Ticket = 0;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double FastMA2 = iMA(_Symbol, 0 ,FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
int pos = 0;
if (OrderSelect(Ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{
if (OrderType() == OP_BUY)
{
pos = 1;
}
if (OrderType() == OP_SELL)
{
pos = -1;
}
}
bool ret;
if (FastMA2 <= SlowMA2 && FastMA1 > SlowMA1)
{
if (pos < 0)
{
ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
if (ret)
{
pos = 0;
}
}
if (pos == 0)
{
Ticket = OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0);
}
}
if (FastMA2 >= SlowMA2 && FastMA1 < SlowMA1)
{
if (pos > 0)
{
ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
if (ret)
{
pos = 0;
}
}
if (pos == 0)
{
Ticket = OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0);
}
}
}
</pre>
====ヒストリーセンター====
----
*メニュー - ツール - ヒストリーセンター
*通貨ペアと足を選択し、ダウンロード
*上記ストラテジーテスターを実行
*[https://www.fxddtrading.com/bm/jp/resources/mt4-one-minute-data ヒストリカルデータダウンロード]
[[File:mt4_history_center.png|500px]]
*https://efxcursion.com/812.html
====バックテスト====
----
*EAを過去のチャート上で仮想的に動作させること
*MT4ではストラテジーテスターという機能が搭載されている
*メニュー - 表示 - ストラテジーテスター で表示される
[[File:mt4_storategy_tester.png|600px]]
*結果
[[File:mt4_backtest_chart.png|700px]]
*レポート
[[File:mt4_backtest_result_report.png|400px]]
===ボリンジャーバンド===
ボリンジャーバンドの上位ライン、下位ラインは、一定期間の価格の標準偏差に比例した幅をもつため、値動きが大きくなると幅が広がります。通常は、価格がその上下ラインを超えることはないのですが、さらに値動きが大きくなると、上下ラインを超える場合が出てきます。その状態を、買われ過ぎ、売られ過ぎと判断すると、そのうち価格が元の移動平均に戻ると期待できます。そのような想定にもとづくと、下図のように価格が上位ラインを上抜けたときに売りシグナル、下位ラインを下抜けたときに買いシグナルとする方法が考えられます。これがいわゆる「逆張り(カウンタートレンド)」のシステムです。
==Tips==
===[[Visual Studio Code]]===
*https://fx-ai-trading.com/fx/mql/vs-code.html
*https://creator.fx-ea-system-project.com/mql-programming/visual-studio-code/
*ExtensionをMQL4で検索し、以下をインストール
[[File:mt4_vscode_extension.png|700px]]
*コンパイラの設定
[[File:mt4_vscode_estention_compiler_setttings.png|500px]]
*メタエディタパスの設定
[[file:mt4_vscode_extension_metaeditor_path.png|600px]]
====[[Mac]]====
[https://www.typea.info/blog/index.php/2021/06/06/mt4_dev_mac_vscode_method/ MetaTrader4 開発をMacとVisual Studio Codeで行う手順]