基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2010年09月21日(火)

MQL5でEA(4) [MetaTrader5]



今回は、簡単な売買システムをEAとして作成してみます。

作成する売買システムは、終値が移動平均線を上回ったら買い、下回ったら売りという単純なルールとします。またポジションは反対シグナルが出たところで途転売買し、常にどちらかのポジションが建っているものとします。

このシステムで必要なテクニカル指標は移動平均だけです。まずは、移動平均をiMA()という組込み関数を使って実現してみます。

考え方は、カスタム指標プログラムでテクニカル指標を表示させたのとほぼ同じです。

まずは、外部変数として

// テクニカル指標ハンドル
int hMA;
// iMA()用配列
double BufMA[];

を宣言します。

次に、初期化関数である OnInit()で、

// テクニカル指標の初期化
hMA = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);

と記述し、iMA()を初期化します。

同じく OnInit()で、
ArraySetAsSeries(BufMA, true);

として、BufMA[]という配列を時系列配列に設定します。ここは、カスタム指標プログラムの場合と違うところです。

EAでは最新のバーを基準にして過去の数本のバーにおけるテクニカル指標の値を使います。時系列配列に設定するのは、最新のバーをBufMA[0]、1本前のバーをBufMA[1]、2本前のバーをBufMA[2] という形で使えた方が便利だからです。

但し、この状態ではまだBufMA[]は使えません。BufMA[]として使えるようにするには、CopyBuffer()でデータをコピーする必要があります。

ここでもカスタム指標プログラムと違う点があります。カスタム指標プログラムでは、チャート全体分のBufMA[]をコピーしたのですが、EAではチャート全体のデータは必要なく、せいぜい数本のバーだけで構いません。

ここでは、最新のバーから3個のデータのみをコピーすることにしてみます。

テクニカル指標のコピーは、Bid、Askなどと同じくRefreshRates()関数の中に次のように書いておきます。
int count = 3;
CopyBuffer(hMA, 0, 0, count, BufMA);

これで、BufMA[0]、BufMA[1]、BufMA[2]の3個の値を使うことができるようになりました。

最後にOnDeinit()関数でiMA()用のメモリを解放しておきます。
// テクニカル指標の解放
IndicatorRelease(hMA);

ここまで準備ができれば、後は簡単です。

前回作成したオープンポジションのロット数を返す関数 OpenLots()と、成行オーダーを送信する関数OrderSendMarket()を利用すると、売買ルールは次のようにOnTick()関数中に書くことができます。

// ティック関数
void OnTick()
{
if(!RefreshRates()) return;
double pos = OpenLots();
double lots = MathAbs(pos) + Lots;
if(pos <= 0 && Close[1] > BufMA[1]) OrderSendMarket(ORDER_TYPE_BUY, lots);
if(pos >= 0 && Close[1] < BufMA[1]) OrderSendMarket(ORDER_TYPE_SELL, lots);
}

これは最も簡単な書き方で、ポジションがないか売りポジションでかつ、1本前の終値が1本前の移動平均線より上のときに買いオーダーを実行します。

また、ポジションがないか買いポジションでかつ、1本前の終値が1本前の移動平均線より下のときに買いオーダーを実行します。

ここで、売買ロット数lotsがMathAbs(pos) + Lots となっているのは、MQL5ではオープンポジションが合算されるので、途転売買の際に、一旦ポジションを決済してからオープンし直さなくても、2倍のロット数で反対売買を行えばよいからです。

こう書いておくと、ポジションがない場合は、lots=Lots、ポジションがある場合は、lots=2*Lots となり、ちょうど途転売買に対応できるのです。

但し、このままでは、一番最初のオーダーが移動平均と終値の交差を待たずに勝手に入ってしまいます。そこで、交差をチェックして売買するために、もう1本前の Close[2]とBufMA[2]を見て

if(pos <= 0 && Close[2] <= BufMA[2] && Close[1] > BufMA[1])
OrderSendMarket(ORDER_TYPE_BUY, lots);
if(pos >= 0 && Close[2] >= BufMA[2] && Close[1] < BufMA[1])
OrderSendMarket(ORDER_TYPE_SELL, lots);

のように書くこともできます。

全体のプログラムリストを以下に示します。

// パラメータ
input int MAPeriod = 20;
input double Lots = 0.1;
input int Slippage = 2;

// レート
double Bid, Ask;
double Close[];

// テクニカル指標ハンドル
int hMA;

// iMA()用配列
double BufMA[];

// 初期化関数
int OnInit()
{
// テクニカル指標の初期化
hMA = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);
ArraySetAsSeries(BufMA, true);
ArraySetAsSeries(Close, true);

return(0);
}

// 終了関数
void OnDeinit(const int reason)
{
// テクニカル指標の解放
IndicatorRelease(hMA);
}

// ティック関数
void OnTick()
{
if(!RefreshRates()) return;
double pos = OpenLots();
double lots = MathAbs(pos) + Lots;
if(pos <= 0 && Close[2] <= BufMA[2] && Close[1] > BufMA[1]) OrderSendMarket(ORDER_TYPE_BUY, lots);
if(pos >= 0 && Close[2] >= BufMA[2] && Close[1] < BufMA[1]) OrderSendMarket(ORDER_TYPE_SELL, lots);
}

// レートの更新
bool RefreshRates()
{
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick)) return(false);
Bid = tick.bid;
Ask = tick.ask;

int count = 3;
if(CopyClose(_Symbol, _Period, 0, count, Close) < count) return(false);
if(CopyBuffer(hMA, 0, 0, count, BufMA) < count) return(false);
return(true);
}

// 成行オーダー
void OrderSendMarket(ENUM_ORDER_TYPE type, double lots)
{
MqlTradeRequest request;
MqlTradeResult result;

request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
if(type == ORDER_TYPE_BUY) request.price = Ask;
else if(type == ORDER_TYPE_SELL) request.price = Bid;
request.deviation = Slippage;
request.volume = lots;
request.type = type;

OrderSend(request,result);
Print("OrderSendRetCode = ", result.retcode);
}

// オープンポジションのロット数
double OpenLots()
{
double lots = 0.0;
if(PositionSelect(_Symbol))
{
lots = PositionGetDouble(POSITION_VOLUME);
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) lots = -lots;
}
return(lots);
}

>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 14時39分


ページのトップへ ページのトップへ

Sponsor AD

2010/9

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

Excelでヒストグラムの作成

Excelでヒストグラムの作成

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.