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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

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

新しくローソク足ができたかを確かめる

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

前回、上の記事で簡単な注文を出すための関数を実装したEAを作成しました。今回はそちらの完成コードを改良していく形で解説していくので、まだ読んでいない方はそちらを先に読まれることをお勧めしますが、以下に完成コードのみを張り付けておくので、時間がない方はそちらを見ていただければと思います。

test.mq4

//+------------------------------------------------------------------+
//|                                                         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で注文を出せるようにしていきたいと思います。

今回作成する関数

今回はチャート上に新しいローソク足ができたかどうかをtrue、またはfalseのBoolean値で返す関数を作成していきます。関数名をIsNewCandle()としましょう。

この関数はNewOrder()を呼び出す前にOnTick()の中でティック毎に呼び出し、ローソク足をできたかをチェックします。そのティックと同時にローソク足が作成されていればtrue同じローソク足のままならfalseを返すようにします。

コードは以下のようになっています。

bool IsNewCandle()
{
   static int BarsOnChart=0;  //①
   if(Bars==BarsOnChart){     //②
      BarsOnChart = Bars;     //③
      return(false);          //④
   }
   BarsOnChart = Bars;        //⑤
   return(true);              //⑥
}

戻り値の方はBooleanなので、関数名の前にboolと書きます。

①関数の初めにBarsOnChartという変数を用意し、初期値は0にします。これはチャート上のローソク足の数を記録するためのものです。この変数はstaticをつけて宣言しているため、static変数と呼ばれます。static変数にすることで、関数を何度呼び出しても前回までの値が保存されます。

例えば、通常の変数であればIsNewCandle()が呼び出されるたびにBarsOnChartには0が新しく代入されるため、前回までのローソク足の数を記録しておくことはできません。

しかしstatic変数はもし前回BarsOnChartに10という値が入っていた場合、次にIsNewCandle()を呼び出したときにも10が保存されているため、if文の中で値を正しく比較できるようになります。

②if文の中では前のティックまでのローソク足の数と今回のティック時のローソク足の数が等しいかをチェックしています。BarsはMQLにもともと定義されているもので、現在のバー(ローソク足)の数を表しています。

③④BarsとBarsOnChartの数の等しいということは新しくローソク足が作成されていないということになるため、BarsOnChartにBarsを代入した後で、falseを返します。

return文が実行されると、関数はそこで停止するため、if文の中身のreturn(false);が実行された場合、その後の処理は行われません。

つまりその後の処理はローソク足が新しく作成されていた場合のみに実行されます。

④ローソク足が新しく作成されていた場合にはBarsOnChartに現在のローソク足の数を新しく代入し、⑤trueを返して関数は終了します。

フローチャートで理解する

IsNewCandle()関数をフローチャートで表すと上のフローチャートになります。フローチャートにすると流れが一目でわかるので、便利ですね。

ではIsNewCandle()がOnTick()の中でどのように使われるのかもフローチャートで確認しておきましょう。

OnTick()が呼び出されると、まずはじめにIsNewCandleが呼び出されます。IsNewCandleは新しいローソク足が作成されていれば、trueを返すので、それをif文の中でチェックし、trueであれば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.0050;
extern double StopLoss=0.0025;
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()
  {
//---
if(IsNewCandle()){
   NewOrder();
}
   
  }
//+------------------------------------------------------------------+
void NewOrder()
{

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

bool IsNewCandle()
{
   static int BarsOnChart=0;
   if(Bars==BarsOnChart){
      BarsOnChart = Bars;
      return(false);
   }
   BarsOnChart = Bars;
   return(true);
}

まとめ

ティックごとに新しいバーが作成されたかを確かめてあげることで、ローソク足ごとに注文を出すことができるようになりました。

このEAを1時間足のチャート上で使っている場合は一時間ごとにNewOrder()が実行されるということになります。

合わせてif文の使い方とBarsの使い方も理解できたと思います。

[itemlink post_id=”2236″]

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

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

NewOrder()関数について

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

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

NewOrder()関数を作っていく

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

void NewOrder()
{
return;
}

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

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

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

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

変数の型名の前に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()を設置したので、テスターがストップされるまでティックが作成される度に注文が出される仕様になっています。本番でこんなことをしたら破産間違いなしなので、気を付けましょう。今後はどのような条件で注文を出すかなどのロジックについても考えていく必要があります。

[itemlink post_id=”2273″]

【FX自動売買】EA入門 Barsで新しいローソク足ができたかを判定する【MT4】

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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

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

アラートとは

Alert()関数を使ってアラートを表示してみましょう。Alert()関数はもともとmqlに定義されている関数の一つです。

アラートとは以下の画像のようにMT4の画面上に別ウィンドウと共に表示されるメッセージのことです。

書き方は非常にシンプルで引数に表示したいメッセージを与えるだけです。

Alert("Hello World");

文字列を表示したい場合は必ず文字列の前後をダブルクォーテーションで囲むことに注意してください。

また文末のセミコロンも忘れないようにしましょう。

またAlert()のようにもともと定義されている関数はたくさんありますが、その使い方がわからない時はその関数を呼び出してる場所にカーソルをもってきて、F1を押すことでリファレンスが表示されます。

上のリファレンスページにはそれぞれの関数がどのように定義されているか、使い方などが説明されています。ググってすぐにわかるものとそうでないものがあるので、真剣に学びたい方は必ず覚えておきましょう。

OnInit()でAlert()を呼び出す

int OnInit()
  {
   Alert("Hello World");
   return(INIT_SUCCEEDED);
  }

今回は上記のようにOnInit()の中でAlert()を呼び出しているので、EA起動時(チャートに設置したタイミングやストラテジーテスターを実行したタイミング)にアラートウィンドウが表示されます。

EAをチャートから削除する方法

EAをもう使わないのでチャートから削除したいという場合はチャート上で右クリックして、エキスパートアドバイザ > 削除を選択することで削除できます。

OnDeinit()内にAlert()を追加してみる

先ほどはOnInit()内にAlert()を追加しました。試しにこれをOnDeinit()の中に移してみましょう。
コードを変更したらコンパイルボタンを押して保存するのを忘れないようにしましょう。

もう一度作成したEAをチャート上に設置してみてください。
今度はすぐにはアラートは表示されません。

EAをチャートから削除してみてください。

するとそのタイミングでアラートが表示されますね。このタイミングでOnDeinit()関数が呼び出されているということが視覚的にわかるようになりました。

このようにAlert()を使うことで、プログラム内の処理がどのタイミングで行われているかをテストしたり、動作確認を行うこともできます。

EAが動作しない場合

EAは初期位置では画面左下にあるナビゲーターメニューの中のエキスパートアドバイザの中から使いたいEAをチャート上にドラッグ&ドロップすることで動作するようになります。

しかしチャート上にEAを置いたのに正常に動作しない場合、自動売買が無効になっている場合があります。

まずEAを設置したときに表示される下のウィンドウの「自動売買を許可する」にチェックが入っているかを確認しましょう。

EAを設置したらターミナルから自動売買をスタートする必要があります。

自動売買が停止されている状態

ターミナル内メニュー上部の自動売買ボタンが上の画像のようになっている場合はクリックすることでEAが実際に動き始めます。

自動売買が実行されている状態

またEAが正常に動作しているかどうかはチャート右上に表示されている顔のアイコンでも確認できます。

EAが停止しているときはのようなアイコンになります

正常に動作しているとのように笑顔になります。

まとめ

いかがでしたか?今回はAlert()を使ってアラートを表示する方法とともに、EAの基本的な使い方を解説しました。アラートはプログラムの処理の順番を確認したりするのに使うこともできます。

[itemlink post_id=”2273″]

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

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

mqlの基礎

【FX自動売買】EA入門 自動売買の仕組み なぜ自動売買を使うべきなのか 【MT4】

以前、上の記事でもお話しましたが、MT4でEAを作成するにはmqlというMT4専用の言語を使用します。

mqlはC++をベースに作成された言語であるため、文法はほとんどC++やC、Javaなどと一緒です。これらの言語を学んだことのある人であれば、さほど理解に苦しむことはないかと思います。

今回はプログラミング初学者でも理解できるようにmqlの超基礎的な部分について解説していきたいと思います。他の言語を学んだことがある人も簡単なリファレンスだと思ってみていただければ幸いです。

mqlでの変数の定義方法

mqlのプログラム中では文字列も数字も利用できますが、必ず変数の型、変数名を定義してから関数内で使いたい値を変数に代入します。

例えば4+1という計算をさせてその結果を取得する関数を作りたいとします。もし4+1=などと書いたら、これはエラーが発生しプログラムは動作しません。

必ず使いたい値用の変数の定義から始めましょう。

4や1といった整数はInteger(int)と呼ばれる型の変数になります。mqlで書く場合、以下のようになります。

int A=4;
int B=1;
int C=0;

これらは全てinteger型の変数なので、intというワードで型を宣言しています。その後に半角スペースを一つあけ、変数の名前を書きます。ここではそれぞれA, B, Cと名付けていますが、本当はあまりこのような名前は好ましくありません。

その変数が何のために使われる変数なのかが一目でわかるような名前にするのが良いでしょう。

変数A, B Cには数値が代入されているので、それらを使って計算させたいときにはC=A+Bのように書くことができます。

また変数の定義の終わりにはセミコロン(;)をつけることを忘れないようにしましょう。これによって一つの命令(ここでは変数を一つ作成すること)が終了することをコンピューターが理解できます。

mqlにおける他の変数型

上で紹介したinteger型の変数は具体的には以下のような感じで使われることが多いです。

int ShortMA=20;
int LongMa=80;

これは移動平均線(Moving Average = MA)を使う関数などで異なる期間のMAの期間を指定するための変数です。
MAを作成するための関数にこれらの値を使うことで、そのMAが短期間用なのか長期間用なのかがわかります。また、あとで期間を変更しようと思ったときにはこの変数宣言部分を変更するだけで、プログラム全体のMAの期間に反映されるので、変更が容易になります。

少数を表すDouble型

integer型は整数を表すための型ですが、数値を表す型は他にもDouble型などがあります。

Double型は少数を含む数値を表すための型です。

double StopLoss=0.0025;

上のように損切額の値を設定する際などに使われます。

文字列を表すString型

String型は文字列を表すための型で、”USDJPY”などのように文字列の両端をダブルクォーテーション(”)で囲みます。

string greeting="Hello";

真偽値を表すBool型

Bool型は真偽値とよばれるTRUEFALSEという値を表すための型です。

bool yes=TRUE;
bool no=FALSE;

TRUEとFALSEはそれ自体が真偽値という特殊な値で、文字列ではないのでダブルクォーテーションで囲まないように注意しましょう。

関数の型

関数を定義する際にも型の宣言が必要です。関数の型はその関数が返す戻り値の型を意味しています。

戻り値とは関数を実行した結果得られる値のことです。

関数は大きく分けて二種類あり、戻り値を返すものと返さないものがあります。

戻り値を返すタイプの関数であれば、最後に返される戻り値の型が関数の型になります。例えば4+1という計算をさせて、その結果である5を返す関数であれば、5はInteger型なので、関数のInteger型だと言えます。

一方で戻り値がない関数は戻り値がないことを表すvoidという型になります。上の例にならっていうなら、4+1を内部で計算させるだけで、その結果である5は取得できません。

関数の宣言方法

関数の宣言は

関数の型 関数名()
{
行わせたい処理;
return;
}

のように書きます。

例)4+1を計算させて結果を取得する

int GetCalculationResult()
{
    int A=4;
    int B=1;
    int C=0;
    C=A+B;
    return (C);
}

最終的に計算結果の5(C)が得られるので関数の型にはintを指定しています。名前は計算結果を取得することを意味するGetCalculationResultにしています。
return (C);は戻り値としてCを返すことを意味しています。同時にreturnはその関数がそこで終了することも意味しています。

次に戻り値がない場合を見てみましょう。

例)4+1を計算させた結果を出力する

void PrintCalculationResult()
{
    int A=4;
    int B=1;
    int C=0;
    C=A+B;
    Print(C);
}

こちらでは関数の型がvoidになっています。戻り値がないことを表しています。

またPrintという関数は()の中の値をコンソールに出力するための関数で、今回は計算結果のCを出力しています。

returnがないことも確認してください。

まとめ

今回はmqlで変数や関数を定義・宣言する方法を紹介しました。他のプログラミング言語と大差ないので、何かしらの言語を学んだことがある人であれば難しくないと思います。

プログラミングが完全に初めての方もこれを機にプログラミングの基礎を学習してみるのもいいでしょう。

[itemlink post_id=”2273″]

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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

フローチャートとは

EA開発に限らず、プログラミングをする際、普通はいくつかの関数から構成されたコードをコーディングすることになります。そしてそれらの関数が指定した順番に実行されるようにロジックを組んでいきます。

そのロジックを簡単に理解するために使われるのがフローチャートとよばれるものです。

フローチャートはプログラムのアルゴリズムを表すダイアグラムのことで、処理の一連のプロセスを表現するものです。処理の属性ごとに異なる形のボックスを矢印でつないで処理の流れを表します。

フローチャートはプログラムの分析や設計などに使われており、プログラムがどのような処理をどのように行っているのかを一目でわかるように描かれます。

EAの開発をするにあたって、まずはEAがどのように実行されるのかをフローチャートで確認しておきましょう。そうすることで今後のEAの開発にあたって設計やテストが容易になります。

フローチャートで使われる記号

画像引用元:https://www.haruyama-ce.com/2020/03/12/フローチャートの描き方その1-自動機の動き表現しよう/

上記表にある記号を組み合わせてフローチャートは作成されています。ボックスの形ごとに表す意味が変わってきます。

EAをフローチャートで表す

作成したばかりのEAのテンプレートコードをストラテジーテスターで実行した場合をフローチャートで表すと以下のようになります。

処理の流れを順に説明していきます。

  1. ストラテジーテスターをMT4上で起動します。
  2. OnInit()関数内に記された内容を全て実行します。(一度のみ)
  3. 2で初期化が終わったらOnTick()関数が呼び出されます。これはチャートにティックが作成される度に実行されます。この関数はストラテジーテスターによるテストが終了するまで(手動で終了するか、指定した期間のテストが全て終了するまで)実行され続けます。
  4. テスターは手動またはすべての期間のテストが完了すると終了しますが、テスター停止のフローチャートの形は手動による処理を意味していることを確認してください。この処理が発生するとスクリプトの動作が停止し、次の処理が実行されます。
  5. ストラテジーテスターが終了するとOnDeinit()関数内の処理が実行されます。これで一連のアルゴリズムが完了し、スクリプトが終了します。

まとめ

いかがでしたか?ここまででEA作成時に自動で作成されるテンプレートコードの流れが理解できたはずです。フローチャートでは一つの処理(ボックス)が完了すると次の処理に移ります。

フローチャートはプログラムの大まかな流れを一目でわかるように示したもので、テストや設計の際によく用いられます。自分でフローチャートを完璧に書けるようになる必要はありませんが、見て理解できるようになるとこれから先の学習に大いに役立つはずです。

[itemlink post_id=”2236″]

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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

MetaTrader4とは

MetaTrader4(MT4)とはFX取引を行うための無料で利用できるプラットフォームのことです。

取引を行うだけでなく、様々なチャートを表示させたり、自動売買プログラムを実行させたり、自分の売買戦略をテストしたりすることもできます。

基本的には他のFXプラットフォームでできることはMT4で全てできると言っても過言でないくらい万能です。

MT4の画面

MetaEditorとは

MT4が人気である理由の一つにチャート上に表示できるインジケータや自動売買プログラムを自分で作ることができるということがあります。

これらはコードで作成しますが、そのためのツールがMetaEditorになります。MetaEditorで書いたコードをMetaTraderで実行するという感じです。

MetaEditorの開き方

MetaEditorを開くには写真(下)の黄色いメモ帳のようなアイコンをクリックします。またはF4で開くこともできます。

以下がMetaEditorの基本画面になります。

多少初期設定によって表示が異なる場合がありますが、気にしないでください。

また初めて開く際には以下のようなウィンドウが表示されるかもしれません。

これはこれから何を作成するのかを確認しているものであり、自動売買プログラムを作りたい場合は一番上のエキスパートアドバイザを選択します。選んだものによって必要なテンプレートコードがあらかじめ用意されるようになっています。

自動売買プログラム EA(エキスパートアドバイザ)を作成する

上のウィンドウが表示されていない場合は画面上部にある新規作成ボタンをクリックしてください。
ファイル→新規作成でも可能です。

すると先程説明したウィンドウが表示されます。今回はEAを作成していくので、一番上のエキスパートアドバイザ(テンプレート)にチェックを入れ、「次へ」をクリックしてください。

すると上のような画面が表示されます。

今回はプログラムの名前をtestとします。基本的にここで書いたことがプログラムに影響することはないので、適当でも構いませんが、日本語で記述すると予期せぬエラーの原因になる可能性がありますので、英語で記述することをおすすめします。

入力が完了したら「次へ」をクリックしてください。すると以下の画像のように表示されます。

ここから先は基本的に何もチェックせずにデフォルトの状態のまま「次へ」を押していただいて大丈夫です。

最後に完了をクリックして設定を終えてください。

設定が終わると上のようなテンプレートコードが表示されます。

次のステップでコードの中身を確認していきましょう。

コードの意味を確認する

①には先程のステップで入力した「著作者」と「リンク」の情報が記載されています。「名前」はこのスクリプトのファイル名になっています(test.mq4)。このスクリプト(プログラム)の作者に関する情報が記載されている場所だと考えてください。

②プログラムはいくつかの関数から構成されており、このスクリプトをリアル口座かストラテジーテスター(EAの実行結果を確認するためのツール)で実行した際に全ての関数が実行されます。
関数は自分で作成したりもしますが、全てのスクリプトは最初から3つの関数が事前に用意されています。そして基本的にこれら3つの関数のみが他の関数を呼び出すために使われます。つまり、自分で作成した関数はこれから説明する3つの関数のいずれかの中で呼び出して使うということです。

そしてそれら三つの中で一番最初に呼び出されるのが②のint OnInit()という関数になります。この関数はスクリプトを起動したタイミングで実行されます。スクリプトの起動はチャート上にこのEAを設置した際や、ストラテジーテスターでEAのテストを開始するタイミングと同じです。

int OnInit()はスクリプトの起動時に一回だけ呼び出されるものです。自動売買の初期化を行うための関数だと考えてください。

Void OnDeinit()は作成したプログラムをチャートから外して動作を終了させたときや、ストラテジーテスターでのテストを停止した際、つまりプログラムを終了させる際に呼び出される関数です。

④もとから設定されている3つの関数の最後はvoid OnTick()です。この関数が自動売買実行中にずっと実行されるメインの関数になります。

名前の通り、ティック(チャートが動く最小単位)毎に実行されます。言い換えると、市場で誰かしらによって取引が行われるたびにこの関数が呼び出されます。1ティックは1トレードと考えることができます。

⑤コードは行ごとに数字が記載されているので、エラーなどを確認する際に便利です。コーディングする際にはコードは上から順に実行されていくということを意識することが大切です。

コンパイルボタン

画像(上)のコンパイルボタンをクリックするとスクリプトの中身が実行され、エラーをチェックしてくれます。

エラーがある場合はそこでスクリプトが停止し、エラー箇所を知らせてくれます。コンパイルボタンを押しても実際にEAが起動して取引が開始されるわけではないので、安心してください。コードを書き足したら、エラーがないかこまめにコンパイルボタンを押してチェックすることが大切です。

試しに最初の状態のままコンパイルボタンを押してみてください。

エラーがある場合は画面下部のツールボックスのエラータブ内にエラーが表示されます。今回はエラーが何もないので0 errorsと表示されているのが確認できます。

また143 msecなどのように表示されている部分がありますが、これはスクリプトの実行にかかった時間を表示しています。この場合は143ミリ秒かかったという意味です。

もし高頻度でトレードを行わせるようなプログラムを作成する場合、効率的なコードを書いてスクリプトの実行時間を減らす努力も重要になってきます。

まとめ

いかがでしたか。今回はMT4でEAを作成するための超基本であるMetaTraderとMetaEditorについて、初期コードの仕組みについて解説しました。

今後実際にプログラムを書いていく上で今回の基礎的な知識が重要になってきますので、あらかじめざっくりでもいいので理解しておくことが大切です。

[itemlink post_id=”2236″]

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

【FX自動売買】EA入門 初めてのEA開発 EAの教科書【MT4】

MT4とは

はじめに、MT4とはMeta Trader 4の略称で、世界中のトレーダーから支持されているオープンソースのFXプラットフォームソフトウェアです。またMT4の中で用いられている自動売買システムのことをEA(Expert Adviser)といいます。

MT4が無料で利用できるので、当然自動売買の作成・テスト・利用も無料でできます。世界中で使われているため、MT4に関するリソースもネット上に豊富にあり、わからないことがあればすぐにGoogleで調べることができるのも強みの一つともいえるでしょう。

MT4のダウンロード

MT4のダウンロードはMT4に対応しているFX業者からしかダウンロードできませんので、今回は日本国内で無料で利用でき、信頼できる業者であるOANDAを使ったダウンロード方法を解説していきます。

OANDA公式サイトに飛んでいただき、下のほうにスクロールしていくと「取引可能なプラットフォーム」という部分があります。

こちらでMetaTrader4のタブをクリックすると以下のようなページが表示されますので、「MT4について詳しく見る」をクリックしてください。

するとOANDAのMT4ページに飛びますので、少し下にスクロールして「OANDAが提供するMT4」を確認してください。

以下のように様々な端末に対応したMT4のダウンロードができるようになっているので、ご自身の環境にあったMT4をダウンロードしてください。

なお、MT4をダウンロードするためにはOANDAのアカウントが必要なので、OANDA会員登録ページから事前に登録しておいてください。(無料です。EAも実際にリアル口座で売買させない限りは一切お金は発生しません。)

自動売買を使うべき理由とは 自動売買のメリット

最も有名なFXトレーディングプラットフォームであるMT4には自動売買のアルゴリズムを自分でプログラミングする仕組みが準備されています。自動売買はその名の通り、自動でトレードをしてくれるため、四六時中パソコンの画面に目を向けていなくてもいいというメリットがありますが、それ以外にも多くのメリットがあります。

トレードに不要な感情を排除できる

人間という生物はどうしても気分・感情というものが切り離せません。特にお金の損得が関わると、それは時には正しいトレードの妨げになり得ます。誰でも負けるときは小さく、勝つときは大きく勝ちたいというのが当たり前ですよね。

しかし想像してみてください。ポジションを持っているとき、含み損があるときに割り切って損切することはなかなか難しいと思います。負けたくないという一心から、利益が出るまで待ち続けてしまうという人は多いのではないでしょうか?

でも逆に、含み益がある状態の時は利益が小さくてもとりあえず利益を確定しておきたいという保身の気持ちが働いて、早急に取引をクローズしてしまうというのが人間の心理です。

以上のことからわかるように、あらかじめ取引ルールを自分で決めていたとしても、「負けを小さく、勝ちを大きく」というのはいざトレードが始まると以外と実践するのが難しく、むしろ真逆の行為を行ってしまいがちなのです。

ですが、その取引ルールをプログラム化してコンピューターに自動売買させることによって、不要な感情を切り離し、確実にルールにしたがって取引することが可能になります。

タイミングを逃さず、時間を節約できる

常にマーケットの動向をパソコンの前で監視し、エントリーするタイミングを待ち続けるのは時間も労力もそれなりにかかります。

しかし自動売買を活用することによって、時間の節約もできますし、あらかじめ設定したアルゴリズムが確実にエントリーサインを捉えてくれるので、取引数が増え、利益の増加が見込めます。

自動売買を利用すればいつでも自分が取引したいマーケットで、パソコンの前で時間を浪費することなく取引することができるのです。

自分の取引戦略が適正かどうか簡単にテストできる

いざトレードを始めようと思ったとき、まずはどんな取引戦略でこれから取引していくかを考える必要があります。

そして思いついた戦略が実際のマーケットで利益を上げられるかどうかは基本的に過去のデータから推測する(バックテストと言います)ことができます。

自分の思いついた戦略と過去のチャートなどを照らし合わせて、手動で計算していては果てしない時間がかかります。2-3か月分であればできないこともないですが、一般的にそれでは十分ではなく、基本的にバックテストは過去数年分のデータを使って、複数の時間軸で行うため、手動では大変です

しかし自動売買プログラムをつくることができれば、そのアルゴリズムをバックテストするための機能がMT4には備わっているので、過去データを取得するだけで数分で簡単に確かめることができるのです。

利益の上げられない戦略を早々に見極め、排除し、利益の出る戦略を洗練していくことで、結果的に利益の増収が見込めます。

自動売買のプログラミング言語は?

世の中の自動売買プログラムでは多くの種類の言語が用いられています。しかし基本的に言語間の違いというものは大した問題ではなく、ほとんど同じ仕組みが用いられているというのが事実です。

自動売買に限った話ではないですが、プログラミングの世界では一つの言語を習得していれば、次に新しい言語を習得するのは容易です。ですのでプログラミング未経験者で何から学べばいいか迷っている方はあまり深く考えすぎる必要はありません。

このブログで解説している自動売買プログラムはMT4というFXプラットフォーム上で動作するもので、MT4自動売買ツール(EA)専用の言語であるmqlという言語を使って作成しています。
mqlはjavaやC、C#、C++といった言語に非常に似ている(mqlがC++をベースに作成されているため)ので、この辺の言語を少し学習したことがある人であればmqlでEAを作成するのは難しいことではありません。

[itemlink post_id=”2236″]