ライブチャットで出会う

MaxSystemFX公式ブログ

EAプログラミング5

みなさん
どうも!


自称『SE』のTonyです!!


ブログ記事のアップが2週も空いてしまって
反省しています。

「反省だけならサルでもできる」という言葉が
ありますが、僕は反省しつつ、開き直ってみせます!

みなさん!
EAプログラム入門、楽しんでいきましょー!!


さて、今回はEAプログラム入門(5)です。
前回までで分からないことがあれば、ちゃんと復習しておきましょう!
そして、今回からコメント機能が実装されていますので、
気軽にコメントしてください!

例えば、
「え、これ、間違ってるんじゃん?」
とか、
「・・・なるほど。つまり、XとYの相対関係からZの3乗となり、それを証明するとしたら・・・」
というような意味不明なものまで待ってますwww

もちろん、いちばん欲しいのは応援コメントですけどね。

あんまり関係ないことコメントされちゃうと、
削除の対象になってしまうこともあると思いますがww

では、今回は実際にEAを作っていきます!

今回作っていくEAは
移動平均線のゴールデンクロスでロング保有、
移動平均線のデッドクロスでショート保有、
ドテン方式でやってみます。
短期移動平均線の期間は14、
長期移動平均線の期間は75に設定します。

このEAはあくまで
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;


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

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

//+------------------------------------------------------------------+
//| ティックが更新される度に通る処理 |
//+------------------------------------------------------------------+
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本目の短期移動平均線
//長期移動平均線と短期移動平均線のゴールデンクロスを判断するロジック
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);
}
}
}

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

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


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

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

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

if(pos == 0)
{
//デッドクロスだった場合、ショートのポジションを保有する処理
OrderSend(Symbol(),OP_SELL,LotSize,Bid,2,0,0,"Short Position",100,0,Red);
}
}


return(0);
}

//ポジションを保有しているか確認する関数
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);
}
//ここまで

以上になります。

コピペしていただいてもかまいませんが、
実際に手入力していただいたほうが、
早く覚えられるのではと思います。


「入力はめんどいっすよー」
とか、
「同じように入力してるのに、エラーがでてますけど?」
などという方は、
下記からダウンロードできるようにしておきます。

Tony_test.mq4


プログラムコード内にある、
OrderSendやOrderCloseは実際に注文を行う関数です。
僕は、"取引関数"とよんでいます。

OrderSendはポジションを保有するための関数
OrderCloseはポジションを決済するための関数です。

それぞれの関数をWebで検索すると使い方などが
簡単に見つかるので、そこを参考にしてください。


さて、ここで気になるのが、
実際に作ったプログラムの結果ですね!
バックテストの結果は・・・

※クリックで拡大します。

・・・orz
散々な結果になってしまいました・・・
・・・やっぱりEA作成は簡単じゃないですね!!


結果の見方はこのサイトが参考になります。
MetaTrader(MT4)インジケーターPRO

今回は散々な結果にいじけてしまいました・・・
自分で結果に期待するなと言っておきながら・・・

でも、EA作成はここからが本当のスタートです!
ここから、検証を重ねて、もっと良いロジックを見つけて
それをプログラム化していくのです!!

次回は、今回作成したEAをもう少し細かく説明していきたいと思います!!


乞うご期待!!
です。

最後にTony流プログラム川柳
「最高の 成績出すのは ムズいっす・・・」


・・・。

53点!!

今回はここまで!!

失礼しましたー!!

2012年8月17日|コメント (0)

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

コメントを投稿する