ライブチャットで出会う

MaxSystemFX公式ブログ

EAプログラミング6

みなさん
どうも!

ブログ記事のアップが2週も空いてしまって
反省した直後にまた空けてしまったことを
すごく反省している真っ最中です。

反省しつつ
今回のEAプログラム入門を進めていきまーす!!


さて、今回はEAプログラム入門(6)です。
なんだかんだで6回目まできちゃいました!
今回で最後になりますよー。


プログラム経験者にとっては簡単な内容だと思いますが、
「プログラムも初心者なんですよーwww」
とかいう人はしっかり学んでいきましょう!


今回は、前回までに作成したEAの解説をしていきます。

前回のプログラムを上から順にいきますね。


//+------------------------------------------------------------------+
//| Tony_test.mq4 |
//| Copyright ゥ 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ゥ 2011, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"



//ユーザーが変更可能なパラメーター、変数
extern int MA_Tyoki_Kikan = 75;
extern int MA_Tanki_Kikan = 14;
extern double LotSize = 0.1;



//ユーザーはさわることが出来ない、共通で使用できる変数
double Pips;

ここの部分はパラメータを設定しています。
変数を宣言する前の部分にexternをつけると
ユーザーが変更できるパラメータになります。

上記のように、変更が必要だと思われるもの、
変更できると便利だと思われるものを
ユーザー可変の変数にセットします。

例:ロットサイズ、MAの期間、システムの稼動時間等

パラメータの下の部分は内部で使用する変数です。


関数の中でも変数を宣言できますが、
関数の中で宣言した変数は、宣言した関数内でしか使えません。

この部分で宣言することで、
どの関数の中でも自由に使えるようになります。

いろいろな関数で使う必要がある場合などはここで宣言します。

例:Pipsの設定変数等


パラメータに関してはこのくらいです。
他にもありますが、今回はふれません。
機会があれば、記事にしますね!

次は・・・


//+------------------------------------------------------------------+
//| EAを設置するときに通る処理 |
//+------------------------------------------------------------------+
int init()
{
/*
通貨ペアによって、1ピップの単位がかわるので、
通貨ペアの小数点を調べて、1ピップの単位を設定
*/
if(Digits <= 3) Pips = 0.01;
if(Digits >= 4) Pips = 0.0001;
return(0);
}

//+------------------------------------------------------------------+
//| EAを撤去するときに通る処理 |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}


こちらはEAを設置するときに行われる処理と
EAを撤去するときに行われる処理です。
撤去時の処理は何も指定してません。

EAを設置するときに通貨ペアによってPipsを変えています。
基本的に1Pipを扱っているので、0.1Pipなどではなく、
1Pipに合わせています。

これは僕のプログラムなので、
絶対1Pipに合わせろ!
と、言っているわけではありませんよ(^^;

さて、ここからが本番です。
次に解説するものは、ティックが更新される度に行われる処理です。
ここからは少し複雑になるので、しっかり理解していきましょう。





//+------------------------------------------------------------------+
//| ティックが更新される度に通る処理 |
//+------------------------------------------------------------------+
int start()
{
int pos;

//移動平均線の値を格納する変数の宣言
double iMA_tyoki1; //1本目の長期移動平均線
double iMA_tanki1; //1本目の短期移動平均線
double iMA_tyoki0; //0本目の長期移動平均線
double iMA_tanki0; //0本目の短期移動平均線

//移動平均線の値を格納
iMA_tyoki1 = iMA(Symbol(),0,MA_Tyoki_Kikan,0,MODE_SMA,MODE_CLOSE,1); //1本目の長期移動平均線
iMA_tyoki0 = iMA(Symbol(),0,MA_Tyoki_Kikan,0,MODE_SMA,MODE_CLOSE,0); //0本目の長期移動平均線
iMA_tanki1 = iMA(Symbol(),0,MA_Tanki_Kikan,0,MODE_SMA,MODE_CLOSE,1); //1本目の短期移動平均線
iMA_tanki0 = iMA(Symbol(),0,MA_Tanki_Kikan,0,MODE_SMA,MODE_CLOSE,0); //0本目の短期移動平均線

上記は移動平均線の値を格納する変数の宣言をし、
その変数に移動平均線の値を格納しています。
iMA()関数の使い方は、

iMA(使用する通貨ペア,使用する時間足,MAの期間,MAの転移,MAの種類,適用する価格,インデックス値);

・・・わかりにくいですよね?
一応、ここで簡単に説明しましたが、詳しく教えているサイトは検索すれば、
いくつでも見つかります。
ここで理解できない場合は、他のサイトを参考にしてみるのも良いでしょう。

では・・・次にいきます。



//長期移動平均線と短期移動平均線のゴールデンクロスを判断するロジック
if(iMA_tyoki1 > iMA_tanki1 && iMA_tyoki0 < iMA_tanki0)
{
//ゴールデンクロスだった場合、ショートポジションを決済する処理

//オーダーの数の分だけ処理を行う
for(int i = OrdersTotal() - 1; i >= 0; i--){
//オーダーの検索
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
//オーダーの種類が同じだった場合(通貨ペアとマジックナンバー)
if(OrderSymbol() == Symbol() && OrderMagicNumber() == 100){
//オーダーの種類がショートポジションだった場合
if(OrderType() == OP_SELL){
//決済処理
OrderClose(OrderTicket(),OrderLots(),Ask,2,Yellow);
}
}
}

ここでは値を比較して条件を満たしているか確認し、条件を満たしていたら、
ポジションを決済するというロジックです。

1本前の長期移動平均線の値より1本前の短期移動平均線の値が小さく、
現在の長期移動平均線の値より現在の短期移動平均線の値が大きい

これでゴールデンクロスと判断しています。



//ポジション保有チェック
pos = PosCheck();

if(pos == 0)
{
//ゴールデンクロスだった場合、ロングのポジションを保有する処理
OrderSend(Symbol(),OP_BUY,LotSize,Ask,2,0,0,"Long Position",100,0,Blue);
}
}

ここで、エントリー前に現在ポジションを保有しているかチェックしています。

ポジション保有チェックに関してのロジックは後半で書きますが、
必要性について書いておきます。

今回の売買条件はすごくシンプルです。
条件を満たす場面はたくさんあると思いますし、
処理自体が、ティックごとになっています。

ポジションを保有しているかチェックしないと、
「条件を満たしたぞ!ポジションを持て!!」
「ん?また条件を満たしたぞ!ポジションを持てー!!
「何ぃ!?またポジションを満たしただと?ポジションを持てー!!!」
と、どんどんポジションを保有していき、
気が付けば、数十個のポジションを保有してしまうことも・・・。

ここでは、同じポジションが重複しないように監視しています。


※売りの部分に関しては処理が同じなので、省略します。


最後に関数としておいた、
ポジションを保有しているか確認する関数の解説にいきます。



//ポジションを保有しているか確認する関数
int PosCheck()
{
int re_int = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
//ポジション保有確認
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == 100)
{
//ポジションを保有していたら変数に1を代入
re_int = 1;
}
}
//結果を返す
return(re_int);
}
//ここまで

for文で現在保有しているポジション分ループします。
OrderSelectという関数でポジションを呼び出しています。
通貨ペアとマジックナンバーでこのシステムのポジションか
確認し、このシステムのポジションと判断されたら、
ポジションを保有していると結果を返します。


・・・どうでしょう?

EAプログラミング入門はいかがでしたか?

僕は初心を思い出しながら楽しくやっていましたが、
果たして、これを見てくれた人々に
どのくらい伝わったのか・・・

気になって気になって夜も眠れません。

質問や応援メッセージ、
するどいツッコミなど、
どんどん受け付けています!

それでは、今回はこの辺で・・・


最後にTony流プログラム川柳
「何事も 教えることは 難しい それをこなせば 成長できるのさ(字余り)」


・・・プログラムだけではなく、全てに通ずることですね。

93点!!

失礼しましたー!!

2012年9月12日|コメント (0)

カテゴリー:FXプログラム(EA)完全制覇

コメントを投稿する