トレード備忘録 & MT4/MT5インディケータ及びEAの開発

日々のトレード備忘録及びMT4/MT5に関する事項

新MT4対応FXメタトレーダー入門(Kindle版)

2017-05-28 16:45:16 | 投資

  前述の同書に対するブログに続いて、本日は同本でサンプルプログラムとして取り上げられたテクニカル指標を取り上げてみたい。 

 同本は電子本として2015年11月に刊行され、昨年12月に更新がなされ、当時最新のBuild 1031に準拠するとともに、内容の修正や増補が行われている。また、本年3月には「新MT4 EA実践プログラミング」が発刊され、そこでは新規開発されたライブラリ-を使ってのEA作成術が紹介されている。 

 上記2教本は、パンローリング社出版の紙本「FXメタトレーダー入門」及び「FXメタトレーダー実践プログラミング」の後継書でもある。われわれトレーダーにとってはバイブルであった二書であるだけに、電子本も同じような存在になるよう切に願うばかりである。 

 「新MT4 EA実践プログラミング」発刊に当たっての、著者のコメントがブログで述べられているが、その中で少し気がかりな表現があった。そのまま引用すると、「いくら詳しく説明しても、MQL4のプログラムは初心者にとっては難しいと思います。そこで、本書の独自ライブラリを使うことを前提として、できるだけ簡単にプログラミングできる方法を紹介しました」という一文である。 

 なるほど、トレード関数は極度に簡略化されたものになっている。半面、簡略化された関数は、いわばブラックボックス化していて、利用者が自由な発想のもと、MT4の持つ汎用性・拡張性を生かした独自のプログラミングを作成するという意欲を削ぐのではないかという懸念が残る。 

 このことを念頭にKindle版「FX メタトレーダー入門」のカスタム指標、ex7_ind.mq4を取り上げてみたい。

//ex7_ind.mq4

 #property strict

#property indicator_separate_window //別ウィンドウに表示

#property indicator_buffers 1 //指標バッファの数

#property indicator_color1 clrRed //ラインの色

#property indicator_width1 2 //ラインの太さ

#property indicator_style1 STYLE_SOLID //ラインの種類

#property indicator_level1 100 //指標のレベル

#property indicator_levelcolor clrBlue //レベルの色

#property indicator_levelwidth 1 //レベルの太さ

#property indicator_levelstyle STYLE_DASH //レベルの種類

 

double Buf[]; //指標バッファ用の配列の宣言

 

input int MomPeriod = 10; //モメンタムの期間

 

//初期化関数

int OnInit()

{

   SetIndexBuffer(0, Buf); //配列を指標バッファに関連付ける

   return(INIT_SUCCEEDED);

}

 

//指標計算関数

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

{

   int limit = rates_total - prev_calculated; //プロットするバーの数

   for(int i=0; i

   {

      Buf[i] = iMomentum(_Symbol, 0, MomPeriod, PRICE_CLOSE, i);

   }

   return(rates_total-1);

}

 

このカスタム指標は紙本「メタトレーダー入門」では、次のようになっていた。

//Ex5.mq4 |

#property indicator_separate_window //<---サブウインドウに表示

#property indicator_buffers 1

#property indicator_color1 Red

 

//指標バッファ

double Buf[];

 

//モメンタムの期間

extern int Mom_Period = 14;

 

//+------------------------------------------------------------------+

int init()

{

   //指標バッファの割り当て

   SetIndexBuffer(0,Buf);

 

   return(0);

}

 //+------------------------------------------------------------------+

int start()

{

   //指標の計算範囲

   int limit = Bars-IndicatorCounted();

   if(limit == Bars) limit -= Mom_Period;

 

   //指標の計算

   for(int i=limit-1; i>=0; i--)

   {

      Buf[i] = Close[i]*100/Close[i+Mom_Period];

   }

    return(0);

}

//+------------------------------------------------------------------+

 新MT4では旧MT4のint init()やint start()に代ってint OnInit()やint OnCalculate()が採用されているから、見てくれは変わっているが、それとは別にプログラムの内容が大きく変わっているのである。紙本入門編では、先ず、指標の計算式から始めてそれを配列に反映させ、チャートに描画させるという労を惜しまない内容になっている。便利な組み込み指標関数iMomentum()は上記課程を勉強した後に紹介されている。最初からiMomentum()等の組み込み指標関数を使ってしまうと、トレーダー独自の指標関数を作成するという発想や意欲が湧いてこないのではないかという危惧が残る。 

 ひょっとして、著者にはパンローリング社に対する版権上のオブリゲーションがあるのだろうか。EAでも旧著で開発されたライブラリーMyLib.mqhやMyLib.mq4は、新MT4でもマイナーチェンジは加えるにしても、ほぼそのまま使えると思うのだが。

注)旧著のMomentumの計算式は、著書中の注意書きに従ってMT4の計算式に合わせている。


MT4 GetTickCount()関数の危うさ

2017-05-21 11:27:22 | 投資

 最近知ったことであるが、MT4 EAプログラミングで多用されているGetTickCount()関数の利用には躊躇すべき点があるようだ。豊嶋久道著「FXメタトレーダー実践プログラミング」のライブラリーで多用されていた同関数がその後の同氏著書では見当たらないこともその辺りの事情を物語っているようである。 

 この関数は豊嶋氏のライブラリーのMyOrderSend()に代表されるトレード関数に使われていて、例えば何かのトラブルで発注に失敗した場合に、致命的なものでなければそのままエラーとしてしまうのではなく、10秒間は何回も発注を繰り返すという際の時間差を測るツールであった。 

 GetTickCount()のデータ型は新MT4では、uint型で定義されており従来のint型より利用可能整数域が制限されていることに加えて、関数の返す戻り値がミリ秒単位であるため、50日足らずでオーバーフローをきたしてしまうことにある。そうとなれば、同関数を使ったEAをVPSで数ヶ月も運用することには、躊躇せざるを得ないという結論になる。 

 筆者は、豊嶋氏開発のMyLib.mqh 及びMyLib.mq4を参考に、私製のヘッダーファイルを作成しているが、その中でもGetTickCount()をそのまま使用しているので、これを次のように修正した。修正は、豊嶋氏著「メタトレーダー4&5」で新たに作成されたMyPosition.mqhを参考にした。本稿での修正は、MyOrderSend()の例であるが、MyOrderModify()やMyOrderClose()も同様の修正を加えることになる。 

「実践プログラミング」でのMyOrderSend()

 // 注文を送信する

bool MyOrderSend(int type, double lots, double price, int slippage, double sl, double tp, string comment, int magic)

{

   price = NormalizeDouble(price, Digits);

   sl = NormalizeDouble(sl, Digits);

   tp = NormalizeDouble(tp, Digits);

 

   int starttime = GetTickCount();

   while(true)

   {

      if(GetTickCount() - starttime > MyOrderWaitingTime*1000)

      {

         Alert("OrderSend timeout. Check the experts log.");

         return(false);

      }

      if(IsTradeAllowed() == true)

      {

         RefreshRates();

         if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true);

         int err = GetLastError();

         Print("[OrderSendError] : ", err, " ", ErrorDescription(err));

         if(err == ERR_INVALID_PRICE) break;

         if(err == ERR_INVALID_STOPS) break;

      }

      Sleep(100);

   }

   return(false);

}

 

変更後のMyOrderSend()

 // 注文を送信する

bool MyOrderSend(int type, double lots, double price, int slippage, double sl, double tp, string comment, int magic)

{

   price = NormalizeDouble(price, Digits);

   sl = NormalizeDouble(sl, Digits);

   tp = NormalizeDouble(tp, Digits);

 

      if(IsTradeAllowed() == true)

      {

         RefreshRates();

         if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true);

         int err = GetLastError();

         Print("[OrderSendError] : ", err, " ", ErrorDescription(err));

      }

   return(false);

}


だれでも使えるMT4の機能 【メール機能続】

2017-05-16 11:42:42 | 投資

 トレードは別のFX会社を使っているが、チャート分析はMT4に頼っているというトレーダーはとても多いのが現実です。先に説明したMT4のメール機能を使えば、自分が市場参入したい相場領域に入ってきた場合、簡単な操作で携帯にメールで教えてもくれる仕組みもトレーダーから頼られる機能の一つです。 

 レートの連絡を受けるのなら、MT4のチャート画面から簡単に設定できます。もう少し複雑な情報を得られないものでしょうか? 例えば、RSIが70を超えたとか、30を割ってきたとか、あるいはボリンジャーバンドの2σに達したらメールで知らせてくれればありがたいとか・・・  実は、筆者が属するFX趣味の会の方々からそのような声が届いておりまして、中でもリクエストの多かったのが、RSI、StochasticそれにBollinger Bands(BB)でした。 

 方法としては、例えばRSIのインディケータの中にAlert()やSendMail()関数を組み込むことが考えられます。でも、これだと既存のインジをいちいち修正しなければならないし、複数の情報が欲しい場合には、それらのインジをチャートに表示させておく必要があります。 

 そこで、リクエストの多かった上記3種の情報をまとめて一つのプログラム(EA)とすることにしました。EAは自動売買のみに限定されているわけではありません。EAのプログラムの中でトレード関数を使った際には、自動売買してくれるという機能に過ぎません。OrderSend( )やOrderClose( )といった自動売買特有のトレード関数は全く使用しないで、チャートポイントでAlert( )やSendMail( )でシグナルを発生及び送信する機能に特化させることも可能です。

 USDJPYのチャートに、完成したEAを挿入すると、次のようなダイアログボックスが開きます。EAはMT4標準搭載の組込関数を使用していますので、チャートには3個のインディケータの表示は不要です。(ここでは参考のため表示しています) 

 特にチャートにインディケータを表示させる必要はありませんが、チャートのマル印のところでアラート発生and/orメール発信することになります。 

 ダイアログボックスでは、RSIのみがデフォルトでtrueになっていますが、BBまたはStochasticのアラート/メールを使用するときは、それぞれをtrueとします。複数のインディケータをtrueとすることもできます。また、アラートとメールは各インディケータの中でどちらかあるいは両方を選択できます。

 このプログラムは、MT4非採用FX会社にてデイトレードされる方をも対象にしたものです。PCまたはスマホでEAを稼働させておくが、画面から離れて別に仕事をする場合、テレビで野球観戦する場合、または散歩に出かける場合等にメールやアラートを受け取ることができます。既にMT4をVPS上で利用されている場合は、当然のことながら、24時間常時EAを稼働させ続けることができます。

 間違ってMQL4ファイルのIndicatorsファイルに保存する人がいますが、それでは作動しません。必ずExpertsファイルに保存する必要があります。 

このEAご希望の方は、下記まで。

https://metagenicfx.thebase.in/


MT4 メール機能の利用の勧め

2017-05-15 13:11:02 | 投資

 デイトレを行っている場合にはマーケットから目を離すことは、トレードチャンスを失うことになるし、思わぬ不利益を被ることにもつながりかねない。しかし、四六時中PCの前に座り続けることはこれまた難しい。 

 家事の最中や食事の際その他ちょっとした散歩の途中にも、相場の変わり目や売買注文がヒットしたことを携帯にメールに知らせてくれることができればうれしい。実はこの機能、MT4に標準装備されているのを知らない人が存外多い。MT4をチャート分析のみに利用されている方も多いが、それらの方々にとってもこのメール機能は重宝されるに違いない。MT4メール機能の使い方を架空のメールアドレスを使って説明してみよう。

 

MT4トレード画面での準備

画面上段のツールバーから

ツール → オプション → E-メールと開く 

E‐メールのダイアログボックスの上から順に

SMTPサーバー、SMTPログインID、SMTPパスワード、発信元、送信先とあり、ここに必要事項を記入する。利用のプロバイダーによって記入方法が異なる。YahooのフリーメールとOCNメールでの記入方法は次のようになる。MT4との相性はYahooがよさそうなので、フリーメールを取得しておくのがお勧めだ。 

Yahooメールの場合

ヤフーメールアドレス:metatrader4@yahoo.co.jpとする。

パスワード:abc123とする

送信先携帯:fxtrader@docomo.ne.jpとする。

ダイアログボックスを次のように埋めることになる。 

一番上の「有効にする」に✓を入れる

SMTPサーバー:smtp.mail.yahoo.co.jp:465、またはsmtp.mail.yahoo.co.jp:587 最後の番号の違いは、ヤフーの暗号化を利用しているかどうかの違い。分からなければ、両方入れてみて試してみるとよい。(SSL利用時:465 SSLを利用しない場合:587)

SMTPログインID:metatrader4(@マークの左の部分)

SMTPパスワード:abc123

発信元:metatrader4@yahoo.co.jp

送信先:fxtrader@docomo.ne.jp

 

最後に「テスト」をクリックすると、携帯にテストメールが届くようになっている。無事に届いていたら、「OK」をクリックしてダイアログボックスを閉じる。

 

OCNメールの場合

 

OCNメールアドレス:metatrader4@cosmos.ocn.ne.jpとする。

パスワード:def456とする。

送信先携帯:fxtrader@docomo.ne.jpとする。

 

ダイアログボックスへの記入方法は下記となる。

 

まず、「□有効にする」に✓を入れる

SMTPサーバー:smtp.vccosmos.ocn.ne.jp(cosmosの前にvcを加える)

SMTPログインID:metatrader4(@マークの左の部分)

SMTPパスワード:def456

発信元:metatrader4@cosmos.ocn.ne.jp

送信先:fxtrader@docomo.ne.jp

「テスト」をクリックして携帯にテストメールが届けば成功。「OK」でダイアログボックスを閉じれば終わり。

単にレートを知らせるだけなら、ターミナルのアラートを右クリックしてレートを指定しておけば、相場がそのレートに達すれば携帯にメールが入る。インディケータやEAにメールアラートを付加しておけば、一段と使い勝手が高まるが、こちらはプログラム知識が少し必要になる。

ここでは、筆者の使っているyahooとOCNを例に挙げたが、その他メールご利用の方は、コメントにて追加いただければ幸甚。

 


押し目買いに押し目なし、戻り待ちに戻りなし

2017-05-13 19:47:32 | 投資

 FXに限らないが、相場の大きなトレンドに乗っていくことこそが大きな利益を残す基本だということはよく耳にする。一方、「押し目待ちに押し目なしとか戻り待ちに戻りなし」の格言もあるように、実際の取引でうまく相場の流れに乗ることは、なかなか困難なことでもある。 

 ダウ理論で知られる杉田勝氏のお弟子さんで、斎藤さんという女性講師がForex.com社の主催するセミナーで「押し目買いと戻り売り」についてのテクニカルの提案があった。 

使用するインディケーター

 ① 20EMA及び75EMA(MT4のメインチャート部分)

 ② RSI(14) MT4の下段(セパレートチャートウインドウ)

 ③ 上記RSIにBollinger Bands(50)をオーバーレイさせる 

売りのエントリー

 ① 20EMAが75EMAの下にあり、且つ

 ②  RSIが70に達していない、且つ

 ③ RSIがBBの中心ライン(BBのMid Line)を上に抜け、その後直ぐに下に戻ったとき、抜け  なくてタッチしていてもよい。

この時には、ローソク足が陽線から陰線に変わっているのが典型。画像のピンク四角で囲んでいる部分。RSIがボリンジャーバンド(BB)の中心を楔形でチクチクと往復するのであろうか、講師はこの形を「チク」名付けられている。語感がよくないので、筆者としてはウエッジとでも呼びたいところ。買いの戦略は、上記の真逆になるが、説明は省略。

チャート画像1

 さて、このチクであるが、確かに戻り売りの場面としては有効に機能しているように見えるが、BBとの関係では他にもっと的確な使い方があるのではないかと思えてくる。せっかくBB(50)という長い期間で判断するのであるから、BBのσ2ラインがRSIの30/70に達すれば、相当な売られ過ぎや買われ過ぎで、逆張りのチャンスともなっているではないか。 

 そこで、EMAはそのまま残すが、ローソク足に替えて平均足を描画してみたのが、次の画像である チャート画像2

 筆者には、こちらの方がしっくりくるのだが、このブログをお読みいただいている諸氏のご意見はいかが。

EMA(20)は、講師に倣って上昇時には赤く、下降時には青く色を変えている。また、本セミナーは今日でもForex.com社の下記サイトで公開されているので、視聴の上、研究されたい。

http://www.jikiden.co.jp/ond/forex_140318/