【無料】メールマガジン配布します!

真実!しか流さないメールマガジン《不定期》

メルマガのお申し込みはコチラ

やれ、つくろ~、それ作ろう、まずつくってみよう。EAを

明日、、、トレードしながらあとは外出するので、記事を書かないだろうなと思いながら暑さに負けて・・・・・・・・・・・・・f^^;

流れにのってEA作成の記事を書いてしまおう!!っとやる気になってきました。

暑くてなにもしたくないし

 

 

20130713210604

 

上の画像は、前回の記事に紹介した画像です。

 

これにそっていきなり作っていきましょう!!

基礎なんてあとあと、、、まず作る。野球ならとりあえずバット振ってから考えればいい!サッカーならボールは、友達って感じですよ。

 

練習用にEAをつくってみました。

(日々まにあっくなブログになるのかも、と思いながらw需要はないくても趣味なのですと)

 

初期設定数値の部分

int MAGIC=1;
string comment="tomo_ver1";

 

こんなコードを書いてみました。もう、必要最低限と直感的に作れるようにしたつもりです。

 

大雑把に説明すると、int って整数の宣言ですね。MAGICって関数を整数型で使いますよってまぁ決まり文句見たいな命令です。

 

ちなみに、EAの場合は、注文ごとにマジックナンバーを任意に割り振ることが可能です。EAを使ったことがある人はわかると思うのですがロジック毎に指定するあれです(笑)

 

一つ一つの注文を区別する為に指定してあげないといけません。

そうしないと、違うEAを同時に稼働していたときに、間違って違うEAのポジションを決済したり(汗)実際にあるのです。

 

もうひとつのstring comment="tomo_ver1";

まぁstring ってのは、文字で使いますよって宣言ですね^^ここは、そんなもんなんだと覚えておきましょう。

commentは、文字で使います。そして、commnentに tomo_ver1という文字を

いれますよって命令です。

 

ちなみに;(セミコロン)が命令文の後ろにあるのは、ここで終わりですよって決まりなので忘れずにいれてくださいね。これがないと動きません。

 

あくまで、我流で覚えてきたのでただしい、プログラムの解釈やルールはまだまだ勉強中です。

 

初期設定は、これだけ(笑)簡単じゃないですか?

 

ループ処理の部分

 

int start()
  {
//—-

 

//—-
   return(0);
  }

 

MQLの構造で、start~return(0)の間をループしてくれます。

難しいことは、MT4が処理してくれるので問題ありません。

ただ、知っておいて欲しいことに、Tick(ティック)が動くごとにこのstart~return(0)が1回実行されるということです。

※Tickとは、チャートが動いた最小単位です。

 

 

まず、決済ロジックから先に書きます。

これは、単純で命令の順番として注文より優先すべきは、決済注文だからです。

 

う~ん、説明になってないですが、これも理由があるのですが上手に文字で説明できないので、”そうなんだ”って覚えて大丈夫です^^

 

//—決済ロジック

//—オーダー状況の確認命令
OrderSelect(0, SELECT_BY_POS, MODE_TRADES);

//—エントリーポジションの時間経緯か判断
if(TimeCurrent() – OrderOpenTime() >60*60 && OrdersTotal()==1){  

OrderClose(OrderTicket(), OrderLots(), Ask , 3 /*Slippage*/ , Violet);
}

そのコードがこれです。

OrderSelect という命令は、MT4が現在持っているポジションを確認してくれるものです。これ単体では、役に立たないのですが、OrderOpenTime()などのオーダー系注文をセットで利用します。

 

OrderSelect で、MT4が現在持っているポジションを確認する。

OrderOpenTime()は、エントリー注文の時間を返します。

このようにセットで使うのです。

 

TimeCurrent() これは、サーバー時間を返します。現在の時間です。あくまで海外サーバーの時間なので、日本時間ではないところを注意が必要です。

 

そして、TimeCurrent() も OrderOpenTime()も、秒単位で数値を返してくれるので、 ”60*60” というのは、60秒×60分のことで、いったら1時間ということです。 360デモいいのですが、あとで変更するときに直感的に分かりやすいのでこうしてます。

 

TimeCurrent() – OrderOpenTime() >60*60

ここの式が何を表わすのかというと、

サーバー時間(現在)ーポジションを持った時間 =ポジションの保有時間となります。

 

そう、ポジションの保有時間が > 1時間より大きくなったら 条件を満たすって感じです。

そして、、、&& アンドって命令ですね。

 

OrdersTotal()==1

その前に、この命令を解説すると、MT4のトータルポジション(全部のポジション)数を教えてくれます。

持っているポジションが1つだったら”=” OKですよという命令です。

 

 

OrderClose(OrderTicket(), OrderLots(), Ask , 3 /*Slippage*/ , Violet);

ticket:チケット番号これは、オーダーが入った注文には、全てに番号が振られておりその番号のオーダーを求めるものです。

OrderTicket() と書いておけば、先ほどOrderSelect で選んだポジションの番号を返してくれます。

lots:決済するロット数(取引数)を指定する。

これも、OrderLots() と書いておけばOrderSelectで選んだポジションのロットを返してくれます。

price:決済価格を指定する。これは、買い注文を決済するときは、Bid。売り注文を決済するときは、Askって書けばOKです。

>>MT4のちょっとした便利な使い方!

 

slippage:スリッページを pips で指定する。ここでは一般的な 3っと指定してます。

color:チャート上に表示する決済矢印の色を指定する

こんな感じです^^;大丈夫ですか?ついて来れてますか。ちょっと心配になってきましたが、もうちょっとなので興味のある人は、頑張って読んでくださいよ。

 

日本語で書くと、注文したポジションが一時間を超えており、なおかつポジション数が1つだったら、そのポジションを決済クローズするというコードです。

 

【ちょいっとコラム】

この記事では、簡単にEAが作れるということを意識して作っており

実際の運用用に作成する場合は、もっと複雑になっていきます。

例えばこのコード

OrdersTotal()==1

としていますが、こうするとMT4の全てのポジションをカウントしてしまいます。
別の稼働中のEAがポジションを持っていたらその数をカウントしてしまったり、手動でエントリーした時のポジションまでカウントしてしまうのです。

実用的には、マジックナンバーが一致したポジション数だけをカウントするようにコードを書くことになります。

ここで紹介するのは、あくまで入門者ようのサンプルコードなので難しいことは省いてます。そのこは、知っておかないと思わぬ損失が出てしまうことがありますので要注意です!

 

 

そして、エントリーロジックにきました。これで終わりですから頑張ってください。

 

//—エントリーロジック
   if(OrdersTotal()==0)
   {

   if(iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1)<Close[1] && iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0)>Bid){  
   OrderSend(Symbol(),OP_SELL, 0.1 /*Lots*/, Bid, 3 /*Slippage*/ , 0, 0, comment, MAGIC, 0, Blue);

   }
   } 

 

OrdersTotal は、覚えてますね。先ほど出てきたので、MT4のポジション数をカウントしてくれる命令です。

0だったら{}の中を実行するという命令です。こうすることで、常にポジションを1つしかとらないように制限してます。

 

iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1)<Close[1]

iMA という命令は、とっても便利なもので、移動平均線の値を返してくれます。

symbol       : 計算したい通貨名。NULLを指定すると現在の通貨。
timeframe   : 時間枠。時間枠列挙型のどれか。0は現在の時間枠。
period        : 計算で使用する足の数
ma_shift     : 移動平均シフト値
ma_method : 移動平均線計算法。これは計算法のどれかをとる
applied_price: 適用価格。これは価格定数のどれかをとる。
shift            : 現在の足から何本前の値を出したいか

一応MAの設定は、こんなんになってますが^^;スルーしても大丈夫です。
200って入っているのが期間を表しますので200期間移動平均線をもとにトレードするという設定になってます。

 

Closeは、ローソク足の終値のことです。[1]となっているのは、チャートに表示されてる最新のローソク足が[0]なので、その一本前の終値の値ということです。

 

ということで、1本前のローソク足が移動平均線200より上にあったら

という条件になっています。

 

&& iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0)>Bid

もう一つのこの一文が、Bid価格は、現在の売り価格となるのですが売りの価格が移動平均線200より小さくなったらという条件式をつくっております。

 

20130714133713

画像にするとこんな感じです。

 

OrderSend命令は、注文命令となりますので、ポジションを持つということになります(笑)

ここまで書いて丁寧に一つ一つ説明をいれると非常に大変ですね^^;

ちょっとハショッテきました。ただ、空白を埋める努力も大事です。

 

わからないときは、質問するとか、ググってみましょう。

簡単EA 全てのコード

 

//+——————————————————————+
//|                                                         tomo.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+——————————————————————+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int MAGIC=1;
string comment="tomo_ver1";

//+——————————————————————+
//| expert initialization function                                   |
//+——————————————————————+
int init()
  {
//—-
//—-
   return(0);
  }
//+——————————————————————+
//| expert deinitialization function                                 |
//+——————————————————————+
int deinit()
  {
//—-
//—-
   return(0);
  }
//+——————————————————————+
//| expert start function                                            |
//+——————————————————————+
int start()
  {
//—-
  //—決済ロジック
   //—オーダー状況の確認命令
   OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
   //—エントリーポジションの時間経緯か判断
   if(TimeCurrent() – OrderOpenTime() >60*60 && OrdersTotal()==1){  
   OrderClose(OrderTicket(), OrderLots(), Ask , 3 /*Slippage*/ , Violet);
   }
   //—エントリーロジック
   if(OrdersTotal()==0)
   {
   if(iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1)<Close[1] && iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0)>Bid){  
   OrderSend(Symbol(),OP_SELL, 0.1 /*Lots*/, Bid, 3 /*Slippage*/ , 0, 0, comment, MAGIC, 0, Blue);
   }
   } 
//—-
   return(0);
  }
//+——————————————————————+

 

これだけで簡単EAができあがりです。

 

この手法ってなんだよっていまさら

本来は、手法があってからプログラム組むのは最後なのでしょうが

 

テストした手法は、

チャート:1時間足

移動平均線200を前のローソク足の終値が上、現在値が、移動平均線をくぐってしたに移動した場合に、エントリー

 

決済ロジックは、エントリーから1時間経過したら。

 

これだけですが、この手法が使えるのかバックテストしてみます。

 

3月から今日までのユーロドル1時間足

20130714134721

 

2月から今日までのドル円1時間足

20130714134912

 

4月からのAUDUSD1時間です。

20130714135107

 

それぞれみて感じたのは、シンプルな手法なのにぼろ負けには、なっていないところがいいですね。

どうです、上のコードを張り付けるだけでももう一つのオリジナルEAが作れるということになります。

簡単でしょ?

 

そして、ちょっと調整してあげると

AUDUSDのバックテストが

20130714135358

こんな右肩あがりに、、、、、詐欺だな。

まぁ少しでもEA作りに興味を持ってくれた人がいたらいいなぁ~ってところです。

それでは、また

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

tomoよりのお願い

参考になったちょっと役に立ったお疲れさんって
少しでもおもったかた(*゜▽゜ノノ゛☆

 

ポッチっとお願いします。その1ポチ!ありがとう

にほんブログ村 為替ブログ FX初心者本人(1年目)へ
にほんブログ村

 

このエントリーをはてなブックマークに追加 はてなで広めてください。この記事が役に立つ人がいると思います。
←左のボタンをクリックして共有してください。

 

 

関連記事

タグ

2013年7月14日 | コメント/トラックバック(0) |

カテゴリー:MQL講座

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ