説明1
始にMQL5のエデイターでEAの雛形ファイルを作成。
新規作成をクリックし、エキスパートアドバイザ(テンプレート)をチェック、
「次へ」をクリック、必要な箇所を入力。
名前
著作者
リンク
パラメータを入力するため、追加ボタンをクリックします。
始めに、Stop変数と値として50を入力します。
同様に追加ボタンを使い、
Takeと、値として100
Magicと、値として1000
Lotsと、値として0.01
Slipageと、値として10
MA_Periodと、値として10
を入力します。
Takeはポジションの利益を確定。
Magicは、どのエキスパートアドバイザの注文か区別するためのものです。
Lotsのタイプはintではなくdoubleにします。
int(整数型)からdouble(実数型)になります。
Slipageは注文の買値、売値からの許容値です。
MA_Periodは移動平均値の期間の値です。
移動平均からエントリーのシグナルを計算します。
初期値は、あとでストラジーテストを行い、Stop、Take、MA_Periodの最適値を検査後最適値に変更します。
「次へ」をクリックします。
エキスパートアドバイザのイベントハンドラは、
チェックをすべて外します。
「次へ」をクリックします。
Tester event handlers of Expert Advisorも、
チェックをすべて外します。
「完了」をクリックします。
プログラムテキスト画面が現れます。
//+------------------------------------+
// SMA_EA01.mq5
// Copyright 2015,
//-------------------------------------+
#property copyright "Copyright 2015, "
#property link ""
#property version "1.00"
//+------------------------------------+
// Expert initialization function
//+------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------+
// Expert deinitialization function
//+------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------+
// Expert tick function
//+------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------+
説明2
int maH;は、関数の外で宣言されたグローバル変数で、
プログラム内のどの関数からでもアクセスができる変数です。
intは整数型の変数、doubleは実数型の宣言です。
実数型のグローバル変数、配列の要素は3個、1次元のスタティック配列です。
maV[]とスクエア・ブラケットに数字、変数が入っていなければダイナミック配列です。
最大で4次元まで宣言できます。
double sclose;は、実数型のsclose変数の宣言です。
int STP, TKP ,SL;は3個の整数型のSTP, TKP ,SL変数の宣言です。
//--------------------------
int maH;
double maV[3];
double sclose;
int STP, TKP ,SL;
double maV[3];は
次のint OnInit() はInit(初期化)イベントハンドラーです。
OnInit() の戻り値はvoidあるいはintタイプ2通りがあります。
return(INIT_SUCCEEDED)でINIT_SUCCEEDEDの値が返される時は、初期化が成功したときです。
テクニカルインジケータ関数の1つ、
iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);は
インデイケータのハンドル(アドレス)を値として返します。
//+------------------------------------------+
// Expert initialization function
//+------------------------------------------+
int OnInit()
{
//---
maH=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);
//--- What if handle returns Invalid Handle
if( maH==INVALID_HANDLE)
{
Print("Indicators error ");
return(INIT_FAILED);
}
//---
STP = Stop;
TKP = Take;
SL = Slipage;
if(_Digits==5 || _Digits==3) //EURUSD=5
{
STP = STP*10;
TKP = TKP*10;
SL = Slipage*10;
}
//---
return(INIT_SUCCEEDED);
}
_Symbolはチャートの通貨ペアー、
_Periodはチャートの時間足(例15分足、1時間足、日足等)、
MA_PeriodはiMAでは移動平均の期間、inputで入力したMA_Periodの値になります。
次のiMAのフォーマットを参考にします。
int iMA(
string symbol,
ENUM_TIMEFRAMES period,
int ma_period,
int ma_shift,
ENUM_MA_METHOD ma_method,
ENUM_APPLIED_PRICE applied_price
);
int ma_shiftは移動平均を水平移動します。
ENUM_MA_METHOD
ma_methodは下記の移動平均の種類から選びます。
MODE_SMA // Simple averaging
MODE_EMA // Exponential averaging(指数移動平均)
MODE_SMMA // Smoothed averaging(スムージングファクターNでの
//スムージング、詳しくは下記参考へ)
MODE_LWMA // Linear-weighted averaging(より新しいデータのウエイトを大きくした
//移動平均)
// ENUM_APPLIED_PRICE applied_priceは下記の(価格の種類)の1つから選びます。
PRICE_CLOSE // Close price
PRICE_OPEN // Open price
PRICE_HIGH // The maximum price for the period
PRICE_LOW // The minimum price for the period
PRICE_MEDIAN // Median price, (high + low)/2
PRICE_TYPICAL // Typical price, (high + low + close)/3
PRICE_WEIGHTED //Average price, (high + low + close + close)/4
次のアルゴリズムでは
if( maH==INVALID_HANDLE)
{
Print("Indicators error ");
return(INIT_FAILED);
}
もしハンドルmaHがうまくいかないとき、つまりINVALID_HANDLEの状態では
操作 logに、"Indicators error "をメッセージし、
初期化がうまくいかない時の値、INIT_FAILEDを返します。
このときはテスト終了します。
下記の式では、
STP = Stop;
TKP = Take;
SL = Slipage;
inputで入力したStop、Take、 Slipageのの値を計算しやすいように
STP、TKP、SLに移し変えます。
下記の式では、
if(_Digits==5 || _Digits==3) //EURUSD=5,USDJPY=3
{
STP = STP*10;
TKP = TKP*10;
SL = Slipage*10;
}
_Digitsはチャートの通貨ペア価格の小数点以下の桁数です。
EURUSDは現在は5桁です。
5桁ではSTP、TKP、SLを10倍にして計算します。
USDJPYは3桁です。
同じようにSTP、TKP、SLを10倍にして計算します。
//-------------------------------------
参考
Smoothed Moving Average (SMMA)
最初にSMAを計算
SUM1 = SUM (CLOSE (i), N)
SMMA1 = SUM1 / N
2番目は次の式を計算
SMMA (i) = (SMMA1*(N-1) + CLOSE (i)) / N
最後は次の式を計算します。
PREVSUM = SMMA (i - 1) * N
SMMA (i) = (PREVSUM - SMMA (i - 1) + CLOSE (i)) / N
ここで
SUM — sum;
SUM1 — N期間の終値合計; 前のバーからカウント;
PREVSUM — 前のバーのスムーズ合計;
SMMA (i-1) 前のバーからの— smoothed moving average ;
SMMA (i) — 現在バーからのsmoothed moving average ;
CLOSE (i) — 現在の終値;
N — スムージング期間.
//-----------------------------------
説明3
//+----------------------------+
// Expert deinitialization function
//+----------------------------+
void OnDeinit(const int reason)
{
//---
IndicatorRelease(maH);
}
Deinitイベントは
Expert Advisorsあるいはindicatorsのときに使用します。
mql5プログラムがチャートに貼り付けてあるとき、
Deinitイベントは、
1、通貨ペアーあるいは時間足の変更のとき再初期化の前、
2、inputパラメータの変更のとき再初期化の前、
3、mql5プログラム使用を終了する前に呼び出されます。
void OnDeinit(const int reason)イベントのconst int reasonは、
UninitializeReason() 関数により下記の値となります。
1、Expert AdvisorがExpertRemove() functionで終了したとき、
REASON_PROGRAM 0
2、プログラムがチャートから消去されたとき、
REASON_REMOVE 1
3、プログラムが再コンパイルされたとき、
REASON_RECOMPILE 2
4、チャートの通貨ペアあるいは時間足を変更したとき、
REASON_CHARTCHANGE 3
5、チャートが閉じたとき、
REASON_CHARTCLOSE 4
6、ユザーがパラメータを変更したとき、
REASON_PARAMETERS 5
7、他の口座がアクテブになったり、口座の変更でサーバに接続し直すとき、
REASON_ACCOUNT 6
8、新しいテンプレートが生じたとき、
REASON_TEMPLATE 7
9、OnInit() ハンドラが0以外の値を返したとき、
REASON_INITFAILED 8
10、端末がクローズしたとき、
REASON_CLOSE 9
次のIndicatorRelease(maH)では、
iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE)のハンドルmaHを開放します。
説明4
次のvoid OnTick()では新しい quoteを受け取ったとき生成されるNewTickイベントを処理します。
しかし、自動売買ボタンが許可されていなとい、エキスパートアドバイザはトレード
操作が出来なくなります。
//+-------------------------------+
// Expert tick function
//+-------------------------------+
void OnTick()
{
//------------------------------------------------
MqlTradeRequest mreq;
MqlTradeResult mresu;
MqlTick l_pr;
MqlRates mrate[2];
//------------------------------------------------
ZeroMemory(mreq);
ZeroMemory(mresu);
MqlTick は最新の価格を収めた構造体です。
Ask、 Bid価格を使うためには、MqlTickタイプとして、l_prを宣言します。
構造体は新しいデータの型を定義したものです。
以下はMqlTick構造体の定義です。
struct MqlTick
{
datetime time; // 最新のアップデート時間
double bid; // Bid価格(売値)
double ask; // Ask価格(買値)
double last; // 最新の約定価格
ulong volume; //ボリューム(バーの更新回数)
};
次のMqlTradeRequest mreq;は
トレードに必要なトレードリクエストの構造体です。
以下はこの構造体の定義です。
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action;
// トレードタイプ(詳細は下記参照1をご覧ください)
ulong magic; // マジックナンバー(Expert Advisor ID )
ulong order; // 注文チケット番号
string symbol; // トレード通貨
double volume; // 注文ロット数
double price; // 注文価格
double stoplimit; // オーダのStoplimit(ストップ注文)レベル
double sl; // オーダのストップロスレベル
double tp; // オーダのTake Profit(利食い) レベル
ulong deviation; // スリッページの最大値
ENUM_ORDER_TYPE type;
// 注文の種類(詳細は下記参照2をご覧ください)
ENUM_ORDER_TYPE_FILLING type_filling;
// ファイリングの種類(詳細は下記参照3をご覧ください)
ENUM_ORDER_TYPE_TIME type_time;
// 有効期限種類(詳細は下記参照4をご覧ください)
datetime expiration; // 有効期限
string comment; // コメント
};
//
次のMqlTradeResult mresu;は
トレード結果の構造体です。
struct MqlTradeResult
{
uint retcode; // トレードサーバのリターンコード
//(例:注文完了 10009 TRADE_RETCODE_DONE)
ulong deal; // 約定チケット番号
ulong order; // 注文チケット番号
double volume; // 約定ロット数
double price; // 約定価格
double bid; // Bid価格(売値)
double ask; // Ask価格(買値)
string comment; // ブローカのコメント
};
次の MqlRates mrate[2];は
チャート・バーの価格等の構造体、mrate[2]は要素数2の1次元配列です。
struct MqlRates
{
datetime time; //バーの開始時刻
double open; // 始値
double high; // 高値
double low; // 安値
double close; // 終値
long tick_volume; // ティック値
int spread; // スプレッド
long real_volume; // ボリューム(バーの更新回数)
};
次ので、mreq、mresuを初期化します。
ZeroMemory(mreq);
ZeroMemory(mresu);
//------------------------------------------------
参照1
ENUM_TRADE_REQUEST_ACTIONS
TRADE_ACTION_DEAL //成行注文
TRADE_ACTION_PENDING //指値注文
TRADE_ACTION_SLTP //ストップ値、テイクプロフィット値の修正
TRADE_ACTION_MODIFY //指値注文の修正
TRADE_ACTION_REMOVE //指値注文の取り消し
//------------------------------------------------
参照2
ENUM_ORDER_TYPE
ORDER_TYPE_BUY //買い注文
ORDER_TYPE_SELL //売り注文
ORDER_TYPE_BUY_LIMIT //指値買い注文
ORDER_TYPE_SELL_LIMIT //指値売り注文
ORDER_TYPE_BUY_STOP //逆指値買い注文
ORDER_TYPE_SELL_STOP //逆指値売り注文
ORDER_TYPE_BUY_STOP_LIMIT //利益確定の指値買い注文
ORDER_TYPE_SELL_STOP_LIMIT //利益確定の指値売り注文
//------------------------------------------------
参照3
ENUM_ORDER_TYPE_FILLING
ORDER_FILLING_FOK //注文の詳細をファイル
ORDER_FILLING_IOC //注文の表示にのみ最大可能
ORDER_FILLING_RETURN //普通注文だけでなく、スワップ等のとき
//------------------------------------------------
参照4
ENUM_ORDER_TYPE_TIME
ORDER_TIME_GTC //キャンセルまで有効
ORDER_TIME_DAY //トレード日の間有効
ORDER_TIME_SPECIFIED //有効期限まで有効
ORDER_TIME_SPECIFIED_DAY //有効期限日の00:00まで有効。
// If this time is outside a trading session, the order expires in the nearest trading //time.
// (この時間がトレード期間から外れているなら、最も近いトレードタイムまでの注文期//限となる。)
//------------------------------------------------