読者です 読者をやめる 読者になる 読者になる

プログラミングでアイデアを具現化したい

あらゆるものを具現化するためにプログラミングを始めました。主にC#

MT4 EA(エキスパートアドバイザ)の作成方法

新MT4対応 FXメタトレーダープログラミング入門より

EAを作成してみます。
f:id:tos5511:20160214043436p:plain

testEAと名付けます。
f:id:tos5511:20160214044813p:plain
イベントは追加せずウィザードを完了する。
f:id:tos5511:20160214044917p:plain
f:id:tos5511:20160214044945p:plain

出力されるソースコード

//+------------------------------------------------------------------+
//|                                                       testEA.mq4 |
//|                                                          tos5511 |
//|                                   http://tos5511.hatenablog.com/ |
//+------------------------------------------------------------------+
#property copyright "tos5511"
#property link      "http://tos5511.hatenablog.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()
  {
//---
   
  }
//+------------------------------------------------------------------+

OnInit()
EAをチャートに挿入した直後に動作する処理

OnDeinit(const int reason)
EAをチャートから削除する際の処理

void OnTick()
価格が更新されるタイミング(ティック)
メイン処理はこちらに書いていく。


以下の売買ルールでEAを書いてみます。
Momentumが100より大きければ価格が上昇しているとみなし、買う
Momentumが100より小さければ価格が下落しているとみなし、売る
ドテンして常にポジションを取るイメージです。

//+------------------------------------------------------------------+
//|                                                       testEA.mq4 |
//|                                                          tos5511 |
//|                                   http://tos5511.hatenablog.com/ |
//+------------------------------------------------------------------+
#property copyright "tos5511"
#property link      "http://tos5511.hatenablog.com/"
#property version   "1.00"
#property strict

input int MomPeriod = 14; //モメンタムの期間
input double Lots = 0.1; //売買ロット数
int Ticket = 0; //チケット番号
//ポジションの状態 pos=0(ポジション無し),pos=1(買いポジション),pos=-1(売りポジション)
int pos = 0;
bool ret; //決済状況
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //1本前のモメンタム(通貨,現在の時間足,期間,モメンタムの計算に終値を使う,shift)
   double mom1 = iMomentum(_Symbol, 0, MomPeriod, PRICE_CLOSE, 1);

   //未決済ポジションの有無
   if(OrderSelect(Ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0){
      if(OrderType() == OP_BUY) pos = 1; //買いポジション
      if(OrderType() == OP_SELL) pos = -1; //売りポジション
   }
   
   //買いシグナル
   if(mom1 > 100){
      //売りポジションがあれば決済注文
      if(pos < 0){
         ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
         if(ret) pos = 0; //決済成功すればポジションなしに
      }
      //ポジションがなければ買い注文
      if(pos == 0) Ticket = OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0); 
   }
   //売りシグナル
   if(mom1 < 100){
      //買いポジションがあれば決済注文
      if(pos > 0){
         ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
         if(ret) pos = 0; //決済成功すればポジションなしに
      }
      //ポジションがなければ売り注文
      if(pos == 0) Ticket = OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0); 
   }
  }
//+------------------------------------------------------------------+

こんな感じでEAが出来ました。
f:id:tos5511:20160214151728p:plain
f:id:tos5511:20160214151850p:plain
f:id:tos5511:20160214151913p:plain