【MT4】今更、MT4でリピート売買プログラムを書く(2/4、プログラミング最初の定数、変数編)
さてロジックや考え方、特に価格の急変動で爆死しないためのリスク管理、資金管理の考え方については、前回説明しました。
今回はグローバルなFX投資では非常にポピュラーな取引ツールMeta Trader 4、通称MT4(以下、略称で呼びます)のプログラムの作成について具体的に見ていきます。
MT4の開発については、Windowsパソコンが必要なのでまずは用意してください。
低スペックのパソコンでもWindowsが動けばいいですが、Mac上で仮想環境を作るとか、VPS(クラウド環境のレンタルサーバ)のWindowsサーバを借りるという手もあります。
なおMT4の環境設定やプログラミングの基礎については、世の中にたくさん資料がありますので、ここでは触れません。環境設定やプログラミングの知識が足枷になることも多いのですが、ここをクリアできるかが最初の関門かと思います。
ただしMT4環境の最初のインストールやセットアップについては、各証券会社が提供するMT4のマニュアルを読むとか、それでも分からなければサポートに教えてもらうとかで何とかなるかと思います。
ちなみに筆者は月1千円程度のWindowsのクラウドサーバをレンタルして、そこで作業したり、プログラムを走らせてたりしています。
MT4のプログラムの考え方
まずはPC版(Windows版)のMT4を起動します。上のアイコンをクリックして、メタエディタと呼ばれる自動売買プログラムの開発ツールを起動します。
ここで「ファイル」メニューから「新規作成」を選びます。ところがMT4で開発できるプログラムには、自動売買だけでなく条件が揃うと知らせるインディケーター、何かのプログラムの基本構造だけを提供するスケルトンなど、複数の種類があります。
ここでは、指定した外貨の値動きを取得して、売買するかしないかの判断やその処理の実行を決めるEA(エキスパート・アドバイザー)と呼ばれるプログラムを作成します。
EAのひな型(テンプレート)を見てみましょう。MT4の自動売買のプログラムであるEAは、大きく分けて4つのパートに分かれています。
1. 変数や定数の宣言
2. プログラムの開始時に1度だけ実行される処理
3. プログラムの終了時に1度だけ実行される処理
4. 価格が動くたびに繰り返し実行される処理
通常は、あまり2. や3. を意識することはないかもしれませんが、たとえば2. については、価格の動きでなく10秒毎とか一定間隔で相場をチェックしたい場合に、その間隔となる時間を最初に設定しておく、とかプログラムの動作前に何か準備をしておく必要がある場合に使います。
通常は、1. の冒頭で変数や定数をどのように使って、目的に沿って自動売買プログラムを動作させるのかを設定したら、あとは4.で「ずっと値動きを見張る」→「必要な条件に合致したかチェック」→「合致したら売買の指示(または決済の指示)」という処理をすることになります。
ここでは対象となる通貨の値動きを見ながら、あらかじめ決めておいたレンジの範囲内であれば買う、そこから、やはりあらかじめ設定しておいた間隔だけ上がれば利確、逆にさらにその間隔分下がるようであればさらに下で次のポジションを建てる、というシンプルな買いベースのループ型プログラムを作成していきます。
プログラムで使う数値や指標の設定
プログラムの先頭には、まずは注釈文(プログラムで何をしているか分かるよう、プログラマーがメモを残すための文でコンピュータ上の処理では無視されるところ)でプログラムの機能やバージョン、作成日や変更日を書くことが多いです。
冒頭の「//」で始まる行はプログラマーのメモとみなされ、コンピュータが処理する際には無視されます。
後で見直すとき、自分がどういう意図でそのコードを書いたのか、何をやらせたかったか思い出せないことも多いので、こまめにメモを残すようにするといいでしょう。
//+------------------------------------------------------------------+
//| Repeat-Ifdone-Buy.mq4 |
//| R. Watanabe, LP Japan |
//| https://ai-life.info |
//| 2021/12/04 |
//+------------------------------------------------------------------+
#property copyright "R. Watanabe, LP Japan"
#property link "https://ai-life.info"
#property version "1.00"
#property strict
// 定数
input string MyCurrency = "ZARJPY" ; // 取引する通貨
input int MaxPosition = 40 ; // 保有するポジションの最大枚数
input double UpperPrice = 7.6 ; // 売買するレンジの上限
input double PriceInterval = 0.033 ; // 売買、利確の幅
input double Lots = 0.01 ; // 1回の売買の数量
input int Slpg = 10 ; // 許容するスリッページ
input double LossCutRatio = 0.7 ; // 損切りする割合(百分率)
int MagicNumber = 0126004 ; // マジックナンバー
double ticket ; // チケット番号を入れる変数
int total ; // 現在の枚数を入れる変数
double posLowestPrice ; // 複数オープンポジションの一番安い価格を調べる
double latestPrice = 7.6 ; // 買いの基準値
次に定数や変数という、プログラム中で扱うデータの置き場や基準となる数値を書き込んでおきます。
定数というのは、文字通り、途中で変わることのない、あらかじめ決まった数値です。
最初の#propertyというところで、自動売買プログラムの制作者やバージョン、もしあればWebサイトのアドレスを記載しています。
#property copyright "R. Watanabe, LP Japan"
#property link "https://ai-life.info"
#property version "1.00"
#property strict
私の場合は、https://ai-life.infoというサイトと、投資についてはhttps://money.ai-life.infoというサイトを持っているので、記載しています。全然更新していないのですが(汗)。
定数というのは、文字通り、途中で変わることのない、あらかじめ決まった数値です。
冒頭の8行の先頭には、「input」という語句から始まっています。
ここは、プログラムの起動時に入力画面が出てきて、自分で毎回設定値を調整できるところです。
いちいちソースコードを書き直してコンパイル(コードをシステム上で動作する=コンピュータが実行できる形式に変換する処理)し直さなくても、プログラムの設定値をいじれるので、いろいろ調整したい変数は、ここであらかじめ宣言しておきます。
ここの数値も、プログラムの起動時に設定してしまえば、あとはずっとその数値や文字のままなので、「定数」です。
input string MyCurrency = "ZARJPY" ; // 取引する通貨
input int MaxPosition = 40 ; // 保有するポジションの最大枚数
input double UpperPrice = 7.6 ; // 売買するレンジの上限
input double PriceInterval = 0.033 ; // 売買、利確の幅
input double Lots = 0.01 ; // 1回の売買の数量
input int Slpg = 10 ; // 許容するスリッページ
input double LossCutRatio = 0.7 ; // 損切りする割合(百分率)
int MagicNumber = 0126004 ; // マジックナンバー
まず最初の記号「MyCurrency」で、どの通貨を扱うか設定します。
リピート型自動売買に適した通貨の選び方
このリピート型アルゴリズムの場合、上がったり下がったり暴れてくれる通貨の方がいいので、おそらくドルやユーロより、ボラタリティの高い英ポンドや豪ドル、NZドル、南アランド等の方が良いかと思います。
ボラタリティというのは値動きの大きさを表します。値動きが大きい方がどーんと儲かる可能性がある反面、同じくらいの確率でどーんと下がって含み損で胃が痛くなる可能性もあるということです。
ここでは、「ZARJPY」、すなわち南アランド円を選んでいますが、その背景を説明します。
自動売買では、比較的値動きが大きい、言い換えれば動きが荒っぽいと言われる英ポンドを選ぶ人をよく見ています。
統計を取ったわけではないので、印象ではありますが(汗)。
ただし英ポンドは1単位130-160円で前回ご説明したレバレッジは3倍程度まで、という考え方でいうと、証拠金が40〜50万円ほど必要になります。
ということで、60〜90万円くらいで動いているオセアニアや南アランド辺りを使うのが良いと考えています。
その中でも南アフリカは、やや政治的なリスクの高いところですが、買い持ちの場合のスワップポイントがそこそこ良いので、値動きがない日でもスワップポイント(利息のようなもの)を日々受け取れるのが大きいです。
ただし、トルコリラだけはマジでお勧めできません。以前は50円で今や10円を割るほど、激しく価値が下落しています。持っているだけで価値が下がっていく通貨なので、かなり危険だと思います。
また可能性としては安値圏で買う選択肢も、高値圏で売る選択肢もありますが、多くの会社で売り(ショート)の場合は買いの倍くらいのスワップを日々取られます。
これはこれで日々じわじわ資金が減っていくのを見るのは精神的につらく、待つ身には堪えるので、自分は基本は買い中心でやっています。
ポジションの最大数を決める
次の変数「MaxPosiotion」で、保持するポジションの最大数を決めています。
プログラム中でこの定数を毎回チェックして、ポジション数がこの数値になったら、買いを止めます。
たとえば平均70円でNZドル円を1千ドル分、買い持ちした場合、証拠金は70÷3で2万3千円程度になります。
もし証拠金100万円でポジションを建てた場合、100÷2.3=43.4で最大43枚、できれば少し余裕を持って40枚くらいを最大にしておくといいかと思います。
いずれは、証拠金をチェックして自動的にあと何枚まで買えるかとか計算するように改良してもよいかと思いますが、今回はシンプルにここで計算した結果で上限枚数だけ決めておく動作にします。
その次の「UpperPrice」では、それ以上は深追いしないという上限の数値を設定します。
アベノミクスが開始されたタイミングとかまさにそうでしたが、景気の悪い状態から強力な経済政策などが発動される時に、通貨も急激に円安に触れることがあります。
そこで喜んで、過去の値動きから見て高値圏に突入していても、まだ上がるような気がしてついつい買ってしまうと、その後にまた値が戻った時に、含み損に苦しむことになります。
そこで、自分のやり方では、高値掴みを避けるため、これ以上は買わない、という通貨の価格の上限を定めておきます。
たとえば、過去2年くらいの動きで米ドルは103〜115円の間を動いていますが、112円以上は明らかにドル高で、あとでまた103円とかのドル安に触れると、10円分、1千ドル保持で1,000 x 10で1万円、1万ドル保持で10,000 x 10で10万円の含み損を抱えることになります。
前回も説明したように、十分な証拠金があり、あまりレバレッジを掛けなければ損切りしないで戻るのを待ってもいいですが、精神的に大きな含み損を見るのは辛いのと、あまりに高値圏だとまたその金額になるのに何ヶ月も、あまりに高過ぎると数年掛かってしまうこともあり、その間、売買が発生せずに投資効率が落ちるのを避けたいという意図もあります。
MT4のロットの考え方
次の定数「Lots」は1回当たりの買う量を定めています。
たとえば通常、MT4の売買単位は10万通貨単位ですが、10万ドルだと米ドルを例に取ると約110円×10万で1,100万円になり、なかなか一般人には敷居の高い数値です。
そこで1万ドルくらいで売買するか(それでも110万円相当ですが)、あるいは最初はリスクを取らず1千ドル(11万円くらい)から始めるのがいいかと思います。
実際、日本の証券会社の多くは、1単位が1万通貨、手軽にできるミニの場合で1単位が1千通貨になっています。
ところが、MT4では多くの通貨で10万単位を1としているので、1万ドル買う場合は0.1、1千ドルの場合はLots = 0.01(10万ドルの0.01倍で1千ドルになる)となります(注意)。
注意:証券会社、また通貨やCFD等の対象資産によって変わることもあるので、あくまで「多くの場合」と理解してください。
どのくらいの間隔で売買するのか
さて次はこのプログラムの重要な要素である、どのくらいの値動きで買いを入れ、また利益を確定するのか間隔を決める定数「PriceInterval」です。
短い間隔で運用した方が小刻みに利確するので1日の利益は増えますが、その分、証拠金が多く必要になります。
たとえば、米ドル円が105~112円の間でリピート売買をする場合、7万円分の値幅があり、そこを0.2円(1千単位で買う場合は2千円相当)間隔で動かすと、最大35本のポジションが立つことになります。これを0.5円(同じく5千円相当)間隔にすると、14本分の証拠金があればカバーできることになります。
1日に0.2円くらいの値動きは1度や2度は発生しますが、さすがに0.5円もの値幅になると、よほど何か値動きを左右するような事件がない限りは数日とか1週間以上、時間が掛かります。
結論としては、前述の考え方などで試算して、自分の用意できる証拠金とそこから算出される最大ポジション数の範囲で、できる限り短い間隔が設定できればいいのだと思います。
今は少なくても(チャンスが限定的でも)、この口座で日々資産が増えてくるので、その上である程度証拠金が増えたら、最大ポジション数を増やしたり、売買間隔を狭くしたりすればいいのです。
過大なリスクを追わず、長い目でじっくり利益を増やしていただければと思います。
最後に設定するのが、スリッページとロスカットの割合です。
input int Slpg = 10 ; // 許容するスリッページ
input double LossCutRatio = 0.7 ; // 損切りする割合(百分率)
int MagicNumber = 0126004 ; // マジックナンバー
スリッページというのは、売買する場合に発生する、意図した価格と実際の約定価格とのズレをどこまで許容するか、という数値です。
小さければ不利な価格で約定するリスクは下げられますが、あまり小さいと思ったところで注文が処理されなく(約定されにくく)なるので、ある程度は止むなし、と考えています。
これまでの運用で1桁台だと上手く約定しないケースが散見されたので、だいたい10~15pipsくらいの間で設定するのが現実的かと思います。
MT4の発注の機能で、あらかじめどの程度のズレまで許容して売買するかを設定できるので、ここで指定しています。
次のロスカットポイント(元の価格の何割になったら損切りするか)についても、MT4の発注の機能で設定できるところです。
基本的に、あまり高値で買わない限りに、十分に余裕を持たせた証拠金で運用することでロスカットしないで価格が戻るのを待つ、という前提で考えています。
それでも、バブル崩壊時の日本市場のように、予想外の展開で値段が大幅に下がるリスクもゼロとはいえないため、元の価格の7割になったら損切りするという設定も噛ませています。
もちろん、資金が十分であれば、ここは0にして、損切りはしない運用とすることもできるかと思います。
あるいは将来的には、ここの値が順調に上がっているときは、ここのロスカット値を少しずつ上方修正していって、通常より多めに利益を得るという手法=トレーリングストップとかを実装してもいいかもしれません。
最後にある「MagicNumber」は、このEAの識別番号です。
同じサーバ上で別々の考え方で作った複数のEAを走らせる場合、プログラムAが建てたポジションをプログラムBが勝手に売ってしまうとかあると、混乱してしまいます。
この混乱を避けるため、各EAに一意の識別番号を割り振り、値段をチェックする際に、プログラムからポジションを順番に見ていき、自分の番号でなければスキップする、なんて使い方ができます。
いずれにせよ、これでプログラムを動作させる準備はできました。
次回は、実際に対象となる外貨の値動きをチェックして、条件を満たせば買いを入れる処理、いわゆるメインとなるロジックを解説します。
※言うまでもありませんが、投資はご自身の判断と責任で行ってください。本稿は参考情報として提供するものであり、特定の銘柄や市場全般の今後の動きを予測するものではありません。ここで提供する情報やソフトウェアを元に読者の方が行ったいかなる結果についても、筆者は責任は負えません。
この記事が気に入ったらサポートをしてみませんか?