またろうのシストレブログ

マネックス証券が提供しているトレードステーションと、MT4などシストレ関連について色々書きます。株と自動売買、EasyLanguageについても。

とりあえずEA(エキスパートアドバイザー)を作ってみる


MT4はMQL4という言語を使う

f:id:tsukinowaapp:20180917200540p:plain

MT4で自動売買のロジックを組むにはMetaEditor4を使いますが、使用感を知りたいので
祝日の休みを利用してEAを組んでみました。

ロジックですが、
3本の移動平均線(短期、中期、長期)の位置と向きを比較して

上から短期、中期、長期と並んで全てが上向きならロング
上から長期、中期、短期と並んで全てが下向きならショート

ロングポジションの時に短期が中期の下を抜けたら決済
ショートポジションの時に短期が中期の上を抜けたら決済

という割とありがちなロジックにしてみました。
(普通の移動平均なら増田足、加重移動平均ならいわゆる移動平均大循環分析って奴です)

//+------------------------------------------------------------------+
//|                                                       Heikin.mq4 |
//|                                   Copyright 2018, Tsukinowa App. |
//|                             https://tsukinowakabu.hatenablog.jp/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Tsukinowa App."
#property link      "https://tsukinowakabu.hatenablog.jp/"
#property version   "1.00"
#property strict

input int ShortMA = 5;
input int MidMA = 15;
input int LongMA = 35;
input int BuyVolume = 1;
input double Geta = 0.01;
input double Loss = 0.1;

double ShortValue;
double MidValue;
double LongValue;
double TempShortValue;
double TempMidValue;
double TempLongValue;
int Ticket;
int Position;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   bool Closed;
   
   ShortValue = iStdDev(NULL, PERIOD_M1, ShortMA, 0, MODE_SMA, PRICE_OPEN, 0);
   MidValue = iStdDev(NULL, PERIOD_M1, MidMA, 0, MODE_SMA, PRICE_OPEN, 0);
   LongValue = iStdDev(NULL, PERIOD_M1, LongMA, 0, MODE_SMA, PRICE_OPEN, 0);
   
   if (OrdersTotal() == 0) {
   
      if (LongValue < MidValue && (MidValue + Geta) < ShortValue && TempShortValue < ShortValue && TempMidValue < MidValue && TempLongValue < LongValue) {
         Ticket = OrderSend(Symbol(), OP_BUY, BuyVolume, Ask, 10, (Ask - Loss), 0, NULL, 777, 0, clrMagenta);
         Position = 1;
      }
      
      if (LongValue > MidValue && (MidValue - Geta) > ShortValue && TempShortValue > ShortValue && TempMidValue > MidValue && TempLongValue > LongValue) {
         Ticket = OrderSend(Symbol(), OP_SELL, BuyVolume, Bid, 10, (Bid + Loss), 0, NULL, 777, 0, clrCyan);
         Position = -1;
      }
   
   } else {

      if (Position == 1 && MidValue > ShortValue && TempShortValue > ShortValue) {
         Closed = OrderClose(Ticket, BuyVolume, Bid, 10, clrMagenta);
      }
      
      if (Position == -1 && MidValue < ShortValue && TempShortValue < ShortValue) {
         Closed = OrderClose(Ticket, BuyVolume, Ask, 10, clrCyan);
      }
   
   }
   
   TempShortValue = ShortValue;
   TempMidValue = MidValue;
   TempLongValue = LongValue;
   
  }
//+------------------------------------------------------------------+

MT4にもバックテストと最適化がありまして、
条件網羅で適切な値を見つけるとかできます。

f:id:tsukinowaapp:20180917201933p:plain

引数多すぎなMQL4

特定タイミングで呼ばれるメソッドを実装していくという作りなので
トレステのストラテジーよりやるべき事が明確な印象があります。
何よりベース言語はC++だそうで、Webやゲーム開発やったことがある人ならすぐ入っていけそうですね。

発注を掛けるOrderSendですが、同時に損切や利確の値を設定できるという面白さはありますが、
それゆえに設定すべき引数が多すぎな印象を受けますね。
また、リアル取引の場合は発注エラーが出やすいそうで、考慮が必要なんだとか。
(今回は考えてないです)

MQL4とMQL5

MT4ではMQL4を使いますが、MT5ではMQL5を使います。
ざっと見で既にOrderSendとか仕様が変わっていて、「どう変わっているのか」の解説が必要ではと思いました。
自分でやるにせよ、両方触ってみてからですね。