【FX自動売買】EA入門 関数の作り方 OrderSend()を使ってNewOrder()関数を作ってみる【MT4】

FX 自動売買(EA)

この記事は【EAの教科書シリーズ】の一部です。全記事は以下から確認できます。

MT4をまだダウンロードしていない方はこちらのページでダウンロード方法を案内しているので、事前にMT4を用意しておいてください。

NewOrder()関数について

今回はmqlで関数を作る方法の解説の意味も込めて、NewOrder()という関数を作っていくことにします。名前の通り、新規注文をするための関数です。

void型のため、戻り値はありません。mqlではvoidはすべて小文字で書くことに注意してください。

NewOrder()関数を作っていく

まずは関数の雛形から作成していきましょう。NewOrder()という名前でvoid型で、とりあえずreturn文だけの関数を作成します。以下のコードをそのままコピペしていただいても構いません。

void NewOrder()
{
return;
}

戻り値の型+半角スペース+関数名のように書きます。このへんはJavaなどと一緒ですね。

基本的には自分で作成する関数はテンプレートコードにもともと定義されている関数などよりも下に記述していきます。

グローバル変数を定義する

次は以下のグローバル変数を使うように書き加えていきます。グローバル変数とはどの関数の中にも入っていない場所(グローバルエリア)に定義された関数のことで、どの関数内でも使うことができる変数のことです。逆にある関数の中で定義されている変数のことをローカル変数といい、その関数の中でしか使用できません。

  • extern double TakeProfit=0.010
  • extern double StopLoss=0.005
  • extern double LotSize=0.01

変数の型名の前にexternという接頭辞がついていますが、これを書くことで、ストラテジーテスターでこのEAのテストを行うときに後から値を変更できるようになります。自由に値を変更できるので、どの値のときに利益が最大化されるかなど、EAの最適化を行うことができるようになります。

これらの変数はあとで注文を出すときに利食いや損切りの額を設定するために使うものです。LotSizeは一回当たりの注文量です。

OrderSend()関数を使って注文を出す

ここからはOrderSend()関数というmqlにもともと定義されている関数を使用して、注文処理を書いていきます。

OrderSend()は戻り値がint型の関数です。正常に注文が通れば「1」を、注文が通らなかった場合は負の値を返します。

今回はOrderSend()によって返される値をint型のResultという変数に保存しておきましょう。

int Result = OrderSend();

OrderSend()の引数は以下のようになっていますが、難しいものではないので一つずつ説明していきます。

int  OrderSend( 
   string   symbol,              
   int      cmd,                 
   double   volume,              
   double   price,                
   int      slippage,          
   double   stoploss,           
   double   takeprofit,          
   string   comment=NULL,       
   int      magic=0,            
   datetime expiration=0,       
   color    arrow_color=clrNONE
   );
  1. symbol:symbolは取引する通貨ペアを表す値です。Symbol()とすることで、EAが動作中のチャートの通貨ペアを指定できるので、今回はSymbol()を使っていきます。
  2. cmd:これは注文方法を指示するために使います。以下の表中のもともと用意された値のいずれかを使って指定します。
ID意味
OP_BUY0成行買い注文
OP_SELL1成行売り注文
OP_BUYLIMIT2指値買い注文
OP_SELLLIMIT3指値売り注文
OP_BUYSTOP4逆指値買い注文
OP_SELLSTOP5逆指値売り注文
  1. volue:注文量を指示するために使います。今回は先ほど用意した変数LotSizeをここに渡します。
  2. price:AskかBidという値が入ります。Askはマーケットの現在の買い価格でBidは売り価格を表す変数です。今回は買い注文を入れたいのでAskを使用します。
  3. slippage:許容スリッページ額を指定するために使います。今回は3pipsを許容することにします。
  4. stoploss:損切値を指定するために使います。0にすると損切設定がされません。直接値を設定することもできますが、今回は事前に用意した変数StopLossを使います。今回は買い注文なので、現在の買い価格(Ask)からStopLoss分を引いた値が実際の損切値になります。
  5. takeprofit:利食い値を指定するために使います。損切と同じなので説明は省略します。
  6. comment:コメントを指定できます。注文の際に何かコメントを記録したい場合はここに指定できますが、特にいらない場合はNULLにします。
  7. magic:マジックナンバーのことです。マジックナンバーとは注文ごとに保有する値のことで、もし同じ通貨ペア上で別のプログラムを同時に実行する場合などはそれぞれ別のマジックナンバーを保有している必要があります。今回は特に考えなくてもいいので、適当に0123とします。
  8. expiration:注文がキャンセルされるまでの有効期限を指定するために使います。0を設定すると有効期限なしを意味するので、今回は0にします。指定する場合は秒数で指定します。
  9. arrow_color:注文が執行された際にチャート上に記録される矢印に特定の色を付けたい場合はここで指定します。今回は特にいらないので、clrNONEとします。

ここまでの内容をコードにすると以下のようになります。

Ordervoid NewOrder()
{
int Result=OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-StopLoss,Ask+TakeProfit,NULL,0123,0,clrNONE);return;
}

これでNewOrder()関数は完成です!

あとはこれをOnTick()の中で呼び出してみましょう。

void OnTick()
  {
//---
NewOrder();
   
  }

こうすることで、ティックが作成される度にNewOrder()が呼び出されます。

最終的な全体コードは以下になります。

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                                                         Kanrinin |
//|                                           https://codelabsjp.net |
//+------------------------------------------------------------------+
#property copyright "Kanrinin"
#property link      "https://codelabsjp.net"
#property version   "1.00"
#property strict

extern double TakeProfit=0.010;
extern double StopLoss=0.005;
extern double LotSize=0.01;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
NewOrder();
   
  }
//+------------------------------------------------------------------+
void NewOrder()
{

int Result=OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-StopLoss,Ask+TakeProfit,NULL,0123,0,clrNONE);
return;
}

ストラテジーテスターでテストする

以上でひとまず簡単な注文を出すEAが完成したので、コンパイルしてストラテジーテスターで試してみましょう!

F4を押して、MT4を開いてください。

MT4でCtrl+Rを押すとストラテジーテスターが開きます。

エキスパートアドバイザの欄に今回作成したEAを選択してください。

通貨ペアや期間などは自由に設定して問題ありません。

最後にスタートを押すとテストが始まります。

今回は何の条件もない状態でOnTick()内にNewOrder()を設置したので、テスターがストップされるまでティックが作成される度に注文が出される仕様になっています。本番でこんなことをしたら破産間違いなしなので、気を付けましょう。今後はどのような条件で注文を出すかなどのロジックについても考えていく必要があります。

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました