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

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

 

2010年11月15日(月)

MQL5:トレードクラスを使ったEAその2 [MetaTrader5]



前回、前々回と、標準ライブラリのトレードクラスを使ったEAを紹介しましたが、MQL5のサイトでも、同様の記事が掲載されています。

と言っても、同様なのはタイトルだけで、中身はむこうの方が圧倒的に多いです。その中で、EAをもう少し簡単に書ける方法があったので、今回はその部分だけ紹介します。

今回紹介するのは、CTradeクラスのメンバ関数の中の成行買い、成行売り、指値買い、指値売り、逆指値買い、逆指値売りに対応するメンバ関数です。

成行買い - Buy()
成行売り - Sell()
指値買い - BuyLimit()
指値売り - SellLimit()
逆指値買い - BuyStop()
逆指値売り - SellStop()

ここでは、成行買いのBuy()というメンバ関数の仕様を見てみます。このメンバ関数は次のような引数を取ります。
double volume //売買ロット数
const string symbol=NULL //通貨ペア名
double price=0.0 //売買価格
double sl=0.0 // 損切り価格
double tp=0.0 //利食い価格
const string comment="" //コメント

これらの引数のうち、volume 以外はそれぞれ初期値が代入されているので、初期値を変更する必要がなければ指定する必要はありません。

実際、この関数の中身を見ると、price=0の場合、買値のAskが代入され、symbol=NULLの場合、Symbol()が代入されるようになっています。なので、引数を省略しても、挿入したチャート上の通貨ペアをトレードできるようになっています。

ということで、予め、売買ロット数lotsと、CTradeのオブジェクトTradeを

double lots = 0.1;
CTrade Trade;
のように宣言しておけば、
Trade.Buy(lots);
と書くだけで、成行買いオーダーを送信することができるわけです。

成行売りの場合も同様で、
Trade.Sell(lots);
と書くだけでOKです。

このようにトレードクラスのメンバ関数を使うと、BidとAskを求めるコードを書く必要がなくなるので、プログラムがさらに簡単になります。

結局、前回のEAのプログラムは以下のように書くことができます。

#include <Trade¥Trade.mqh>
#include <Indicators¥Trend.mqh>

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

// レート
double Close[];

// トレードクラス
CTrade Trade;

// MAクラス
CiMA MA;

// 初期化関数
int OnInit()
{
// MAの初期化
MA.Create(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);

ArraySetAsSeries(Close, true);

uint slippage = Slippage;
if(_Digits == 3 || _Digits == 5) slippage *= 10;
Trade.SetDeviationInPoints(slippage);

return(0);
}

// ティック関数
void OnTick()
{
if(!RefreshRates()) return;
double pos = OpenLots();
double lots = MathAbs(pos) + Lots;

if(pos <= 0 && Close[2] <= MA.Main(2) && Close[1] > MA.Main(1))
Trade.Buy(lots);
if(pos >= 0 && Close[2] >= MA.Main(2) && Close[1] < MA.Main(1))
Trade.Sell(lots);
}

// レートの更新
bool RefreshRates()
{
// MAの更新
MA.Refresh(-1);

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

// オープンポジションのロット数
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 13時40分


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

Sponsor AD

2010/11

  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

実際の相場におけるランダムウォーク

実際の相場におけるランダムウォーク

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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