プログラミング未経験者のMQL習得奮闘記④『簡単なEAを修正しよう』

こんにちは~。

MQLをマスターしたくて、花粉が怖くて外に出れないりょうです。

今回は、前回作成したEAをちょっと手直ししてみようという試みです。

TOC

決済の条件を付けよう

前回作成したEAは、初めてのEA作成なので「とりあえず動かせる」ことだけを考えて作りました。

その結果『エントリーだけをするEA』になってしまったのでちょっと修正してみます。

直してみた結果がこちらです↓。

//+------------------------------------------------------------------+
//|                                                  GoldenCloss.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//---

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
//1本前のローソク足の移動平均線の値を取得する(短期・長期)
   double MAShort0 = iMA( NULL, PERIOD_CURRENT, 7, 0, MODE_SMA, PRICE_CLOSE, 0 );
   double MALong0 = iMA( NULL, PERIOD_CURRENT, 21, 0, MODE_SMA, PRICE_CLOSE, 0 );
//2本前のローソク足の移動平均線の値を取得する(短期・長期)
   double MAShort1 = iMA( NULL, PERIOD_CURRENT, 7, 0, MODE_SMA, PRICE_CLOSE, 1 );
   double MALong1 = iMA( NULL, PERIOD_CURRENT, 21, 0, MODE_SMA, PRICE_CLOSE, 1 );

//決済条件 エントリーが1つでもあればforループを回す 1本前に陰線が出たら決済
   for( int i = OrdersTotal() - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) {
         if(Close[1] < Open[1]) {
            int result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 2 );
         }
      }
   }

//エントリー条件 ゴールデンクロスでエントリー
   if(MAShort1 < MALong1 && MAShort0 > MALong0) {
      int result = OrderSend( Symbol(), OP_BUY, 0.01, Ask, 20, 0, 0 );
   }
}
//+------------------------------------------------------------------+


テストをした結果がこちらです↓。



相変わらずエントリーはめちゃくちゃですが、エントリーしっぱなしではなくちゃんと決済してくれるようになりました!

決済条件がこちらです↓。

   for( int i = OrdersTotal() - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) {
         if(Close[1] < Open[1]) {
            int result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 2 );
         }
      }
   }

OrderSelect()関数・・・注文を選択する関数 trueかfalseを返す
SELECT_BY_POS・・・注文のインデックスによる選択
MODE_TRADES・・・現在の取引プールから選択

OrderClose()関数・・・ポジションを決済する関数
OrderTicket()・・・注文のチケット番号を返す
OrderLots()・・・注文のロット数を返す
OrderClosePrice()・・・現在の決済価格を返す
2・・・許容スリッページ 今回は2と設定しています


陰線が出たら決済という条件にしているのですぐ決済しますが、とにかく『エントリー → 決済』という一連の流れでEAを作ることができました!

りょう

これであとはいろんなテクニカル分析を勉強したらいい感じのEAをつくれるぞ!!

にゃんぽこ

それが大変なんだけどね

りょう

そうなんだよね・・・

『//』で作ったコードに注釈を付けよう

あと変更した点と言えば、

//1本前のローソク足の移動平均線の値を取得する(短期・長期)

//2本前のローソク足の移動平均線の値を取得する(短期・長期)

//決済条件 エントリーが1つでもあればforループを回す 1本前に陰線が出たら決済

//エントリー条件 ゴールデンクロスでエントリー


この部分となります。

『//』を入れると『//』より右からコメントを入れることができるようになります。

ソースコードとして意味は持たない文字になるので、メモや解説を入れるのに便利です。

ムゥ

長いソースコードはどこに何を書いたかわからなくなるにゃ

にゃんぽこ

ちゃんと「このコードは何をしているか」を書くようにした方が今後の自分の為になるね

りょう

かくして、りょうはMQLの基本中の基本を習得したのであった

TOC
閉じる