スクリプト実行手順
- ファイル-新規作成 からウィザードでスクリプトを作成
- コーディングして、コンパイル
- ナビゲーターウィンドウに出現するので、チャートにドロップ
- ターミナルウィンドウ「エキスパート」に出力された
- スクリプトをはじめ、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ではストラテジーテスターという機能が搭載されている
- メニュー - 表示 - ストラテジーテスター で表示される