MT4
プログラムの種類
- 種類によって保存される場所が異なる
- 保存フォルダ一覧を開くには、ファイル-データフォルダを開く
- プログラムファイルなどは、MQL4フォルダ以下に格納される
- mac の場合、/Users/{ユーザー名}/Library/Application Support/MetaTrader 4/Bottles/metatrader4/drive_c/Program Files/MetaTrader 4/MQL4 が物理的な場所
スクリプト(Script)
- Scriptsフォルダに保存される
- 複数の処理をまとめて実行
- チャートに挿入すると一度だけ実行
- 口座情報や通貨ペア情報の取得
- 過去のチャートデータの一斉処理
カスタム指標(Custom Indicator)
- Indecatorsフォルダに保存される
- MT4にすでに組み込まれているテクニカル指標と同様に、チャートに挿入することで独自に作成したテクニカル指標をチャートにプロットする
エキスパートアドバイザー(Expert Advisor,EA)
- Expertsフォルダに保存される
- チャートに挿入すると、価格の変化に応じて自動売買のできるプログラム
- 過去のデータに対して仮想売買を実行し結果を表示するバックテストにも利用可能
売買注文
メタトレーダーで出せる注文
- 成行注文
- その時点での買い気配や売り気配ですぐにポジションを建てる
- 逆指値注文
- 待機注文の一種
- 価格が一定になったら、成り行きで注文を建てる
- 買いの逆指値は現在価格の上、売りの逆指値は現在価格の下に置かれる
- 価格がその水準まで上昇、下落して、その後もそのポジションに動いて利益を生むことを想定する
- 指値注文
- 逆指値注文の逆
- 価格がその水準まで上昇、下落したのち、反転して利益を生むことを想定する
- 自動売買ではあまり使われない
基本
コンパイル
- ソースコードは拡張子、mq4
- コンパイルすると、ex4
変数
定義済変数
変数
|
意味
|
備考
|
Bid
|
売値
|
|
Ask
|
買値
|
|
Open
|
始値
|
配列
|
High
|
高値
|
配列
|
Low
|
安値
|
配列
|
Close
|
終値
|
配列
|
_Symbol
|
通貨ペア名
|
|
_Point
|
通貨ペアごとの異なる最小値幅
|
|
_Digit
|
小数点以下桁数
|
|
_Period
|
現在のチャートのタイムフレーム(分)換算
|
|
|
|
|
|
|
|
|
|
|
|
外部変数
- トレーディングシステムに対して調整可能なパラメータ
- トレードやインディケーターの設定を行う
- 変数の前に、extern をつけて宣言
組込関数
定義済変数
- 自動売買を許可する必要がある
- ツール-オプション -エキスパートアドバイザ タブ - 自動売買を許可する にチェック
定義済関数
|
意味
|
備考
|
OrderSend
|
取引操作の実行に使用され、リクエストを取引サーバに送信
|
|
|
|
|
|
|
|
プリプロセッサ
プリプロセッサ定義
|
意味
|
備考
|
#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
|
|
|
|
|
|
|
関数のインポート
#import "library.ex4"
double MyFunction();
#import
プログラミング
スクリプト実行手順
- ファイル-新規作成 からウィザードでスクリプトを作成
- コーディングして、コンパイル
- ナビゲーターウィンドウに出現するので、チャートにドロップ
- ターミナルウィンドウ「エキスパート」に出力された
- スクリプトをはじめ、MT4で作成するあらゆるプログラムは、チャートに挿入して実行される
カスタム指標(インディケーター)プログラミング
- よく利用されるインディケーターとして、移動平均線や、ストキャスティックスなどがある
- カスタム指標は、チャート上にテクニカル指標データを順次プロットしていく
- プログラムは、チャート上の価格が更新されるたびに繰り返し実行される
表示方法
- 配列を指標バッファにSetIndexBuffer()関数を用いて関連づける
- 新規作成-カスタムインディケーター
#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);
}
//+------------------------------------------------------------------+
エキスパートアドバイザプログラミング
- 一般にEAはインディケーターを使って売買シグナルを点灯させる
EA例
#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);
}
}
}
ヒストリーセンター
バックテスト
- EAを過去のチャート上で仮想的に動作させること
- MT4ではストラテジーテスターという機能が搭載されている
- メニュー - 表示 - ストラテジーテスター で表示される
Tips
- ExtensionをMQL4で検索し、以下をインストール
MetaTrader4 開発をMacとVisual Studio Codeで行う手順