見出し画像

【MT4】今更、MT4でリピート売買プログラムを書く(4/4、プログラミングのメイン処理後半と今後の展望編)

最終回まで読んでいただき、ありがとうございます。いよいよ4/4回目、最後の処理になります。

過去の分はこちらになります。

【MT4】今更、MT4でリピート売買プログラムを書く(1/4、基礎編)

【MT4】今更、MT4でリピート売買プログラムを書く(2/4、プログラミング最初の定数、変数編)

【MT4】今更、MT4でリピート売買プログラムを書く(3/4、プログラミングのメイン処理編)

ここができれば日々少しずつながら、さらに年に1~3回くらいある暴落デイに、高血圧の人は上に、低血圧の人は意識が薄れていくくらい下に血圧がブレますが、少なくても毎日のコーヒー代や昼食代くらい、少し多めに走らせれば、地方でつつましく暮らすくらいなら十分な収益を出すことができるかと思います。

絶対はないので、リスク管理はしっかりと守っていただきたいですが。

また血圧が大きく動きようなポジションの取り方は誤っているので、暴落デイでも枕を高くして眠れるよう、資金配分は余裕をもって設定してください。

しつこく言っていますが、レバレッジを最大限掛けるのはアホの所業です。

レバレッジは最大限に設定して証拠金を少なく抑え、資金に対する買いの量は多くても3倍、できれば十分な余力のため2倍以下に抑えておき、また過去の値動きのグラフをしっかり頭に叩き込んで、真ん中より上では買わない、もしくは買うにしても控えめにするのが死なないための鉄則です。

また少し慣れてきたらプログラムの設定値を変えたり、エントリーの条件を変えたり、利確や損切りの条件を変えたりして、もっと効率よく稼げるEAに拡張することもできます。

そのアイデアについても、後半で少し説明します。

オープンポジションを全部調べて、一番安い値を確認する

前回の説明までで、最初のポジションを建てるところまで処理ができます。

次の問題として確認したいところは、等しい並びで次のポジションが建てられるか、ということです。

だんだんポジションが増えてきて、それが利確したりして動いたときに、一番下(買値がもっとも安い)の買値はいくらかということです。

いったん買い注文が成立したところで、その買値を最新の最安値として変数latestPriceにセットしていますが、前述のように値段が上に動いてその買いポジションが利確されてしまうと、まだ利確されていないオープンポジションの一番下の値もその利確された値にシフトしてしまいます。

これをチェックするために、オープンポジションをいちいち順番に呼び出し、その買値を比較し、一番安い値を確定していきます。

if (total > 0)
{
  for(int i = 0; i < total; i++)
  {
  // オープンポジションをチェックし、現在の一番下の買値を取得する(初期値をi=0の時に与える)
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
     {
        if (i == 0) posLowestPrice = OrderOpenPrice() ;
        if (i > 0 && posLowestPrice > OrderOpenPrice() )
           posLowestPrice = OrderOpenPrice() ;
     }
  }
  // オープンポジションの一番下の価格を最新価格として設定する
     latestPrice = posLowestPrice ;
}

まず、この処理をする前提条件として、ポジション数が1つ以上ある必要があります。

ポジションがない場合は、if (total > 0)を満たせないので、この処理はスキップされることになります。

ここで重要な関数が2つありますが、1つ目はOrderSelect()関数です。

これは指定した順番のポジションを選択する機能があります。

OrderSelect()関数で選択したポジションは操作対象となり、他の関数で値を調べたり、発注した際の条件を別の値に置き換えるなどの処理ができるようになります。

「値を調べる」というときには、「捜査対象」と言えるかもしれません(ウソ)。

たとえば今、5本のポジションが建っている場合、3行目のfor文で、0、1、2、3、4とカウントされ、5になると「全体の本数(変数total)より小さい」というfor文の条件を満たせなくなるので、カウントが終わります。

コンピュータの中で数を数えるときは1からでなく0が起点になるので、5本分を見るということは1~5でなく、0~4ということに注意してください。

最初の行では、i==0、つまりカウントの初回分をposLowerPriceという最安値の価格を入れる変数に強制的に入れます。

これは初回だと比較対象がないから、まずは初回分の数値自身を比較対象にするためです。

それ以降は、OrderOpenPrice()関数でそのポジションをいくらで建てたかを調べて、posLowerPriceの値と比較します。

もしそのポジションのオープン時の買値の方が安ければ、王者交代、ということで、posLowerPriceの値が更新されます。

いわゆる複数の数値から最安値を求めるアルゴリズムです。

あとは前回と同じくOrderSend()で買い注文

これで正確な直近の基準値latestPriceが取得できました。

あとはまだ買い余力がある状態で、つまり事前に設定した最大ポジション保有数にまだ達しておらず(total < MaxPosition)、最新のAsk値(買値)がこの基準値latestPriceより、あらかじめ設定した値幅PriceIntervalの分より下がったら、次のポジションを建てるため、買い注文を出します。

if (total > 0 && total < MaxPosition && Ask < latestPrice - PriceInterval)

買い注文の()内で指定する条件は前回説明していますので繰り返しませんが、Ask値の比較をして条件が成立したら、「OP_BUY」で、つまり成行で買うという設定にしています。

ticket = OrderSend(MyCurrency, OP_BUY, Lots, Ask, Slpg, Ask * LossCutRatio, Ask + PriceInterval, "Repeat-If-done", MagicNumber,0, clrBlue) ;あ

お使いのPCまたはWindowsが動く外部のレンタルサーバ等にMT4をインストールして、このEAを走らせれば、リピート型売買ができるようになります。

シンプルではありますが、システムトレーダーの仲間入りです。

ソースコードを以下に貼り付けます。

とりあえず起動してみる

上記のソースコードをお使いのMT4の環境にアップロードし、または新規EAを起こしてコードをコピペし、コンパイルすれば使えるようになります。

MT4のメイン画面から、F4キーを押すか、画面上段のボタンの中にある黄色のノートのようなアイコンをクリックすると、以下のように開発ツールのメタエディタが起動します。

上のファイルを「Expert Advisors」フォルダに入れるか、新規作成でEAのテンプレートを起こし、そこに上記のファイルのコードをコピペして、メタエディタの上の中央にある「コンパイル」ボタンを押すと、MT4で実行可能なEA本体のファイルが生成されます。

ファイルの位置が分からない場合は、メタエディタ上段メニューの「ファイル」から「データフォルダーを開く」を選ぶと、このMT4の関連ファイルの入っているフォルダーに到達できます。「MQL4」→「Experts」にEAのソースファイルを入れます。

画像5

その後、取引対象とする通貨のウィンドウを開き、そこに左側のEA一覧から、このEAを選んでウィンドウのエリア内にドラッグすると、次のようなメニューが表示されます。

画像5

ここで起動前の初期設定ができます。このまま「OK」ボタンを押してしまいたくなるのを抑えて、1つずつチェックしていってください。

以下のように、「Common(共通)」タブを開き、まずポジションの種類は今回は買いしかしないので、「Only Long」にして、「Enable alerts」、「Allow live trading」、そして「Allow import of external experts」にチェックを入れます。

画像6

人によっては日本語になっているかもしれません。MT4はメニューの「View」から日本語も選べるはずなのですが、私の環境だとなぜか文字化けするので、諦めて英語モードで使っています。

もう1つ、「Inputs(入力)」タブの設定が必要です。

ここは、プログラムの冒頭で、先頭に「input」と付けた変数が表示されます。この接頭語を付けておくことで、起動前に値をいじれるわけです。

また変数の後ろに「// 〇〇」と注釈を入れていましたが、そこで記載した内容が説明として表示されています。これも環境によっては日本語が文字化けするので、その際は諦めて英語モードで使うしかありません。

もうMT4の開発は止まっており、開発元は次バージョンのMT5しかアップデイトしていないので、この問題が解決されることはなさそうです。

ちなみに現在のコードでは、以下のような項目が起動前に設定できるはずです。

input string MyCurrency = "ZARJPY" ;   // 取引する通貨
input int MaxPosition = 30 ;           // 保有するポジションの最大枚数
input double UpperPrice = 7.5 ;        // 売買するレンジの上限
input double PriceInterval = 0.03 ;    // 売買、利確の幅
input double Lots = 0.1 ;              // 1回の売買の数量
input int Slpg = 15 ;                  // 許容するスリッページ
input double LossCutRatio = 0.7 ;      // 損切りする割合(百分率)

すでに初期値として、穏当な値を入れております。

とはいえ、比較的値動きの大きい南アランド1万単位(1万ランド)を最大30本建てる設定になっていますので、平均7.2ランド円として、72,000円×30本で210万円程度が動くことが想定されます。

比較的穏当な設定とはいえ、レバレッジ3倍として少なくても70万円程度の証拠金を入れた上で運用するようにしてください。

今後の改良のポイント①パラメータをいじってみる

ということで、これだけでもどの通貨、または原資産を扱うかをよく考え、また投下金額のレバレッジが3倍を超えないよう注意して運用すれば、それなりに日々少しずつでも稼いでくれるはずです。

次のステップとして、自動売買のシミュレーションができるツールがMT4にはあるので、それでいろいろな通貨やあるいは通貨以外の商品(原油や金、銀、仮想通貨)や株価指数、米国株など(日々のスワップがじわじわと取られるので、私自身はやっていませんが)のような原資産の組み合わせを変えて、シミュレーションしてみるといいでしょう。

また資金の範囲内で無理なく、という条件がありますが、ポジションを建てるインターバルの幅を変えてみる、枚数を変えてみる、上値追いの上限を変えてみる、いくつか調整するポイントはあります。

必ずしも実際の売買ではその通りにならないことも多いのですが、以下のように、利益が伸びるのか、また思惑と逆に動いた際に、どこまで資金が耐えられるのかなどもグラフで分かります。

画像1

またグラフのベースにある統計的な数値も表示されます。

実際はシミュレーション通りにならず損した、なんて話も聞きますので、リアルワールドと実験場は必ずしも一致しないというリスクは気にしつつ、利用してみてください。

画像2

今後の改良のポイント②機能拡張にチャレンジ

もう1つは、このコードに留まらず、機能を追加していくという応用方法もあります。

たとえば以下のようアイデアが考えられます。

・スワップの高い通貨を使い、売買があまり発生しない時期も、日々のスワップポイントが受け取れるようにする

・上限を超えたら売買を止めるのでなく、今度は高値圏なんで、下げを狙って売りに転じる

・単純に値幅でのべつまくなく売買するのでなく、移動平均やボリンジャーバンド、MACD、RSI等のテクニカル指標を見て有利なエントリーのタイミングを絞る

・下値圏に来たら、ナンピン効果を狙って買う量を増やす。たとえば通常1,000ドル単位なのを安値圏に来たら2,000ドル単位にするなど

・ある程度利益が出たら、ロスカットの機能を使って最低限の利確ができるポイントを設定し、値がじわじわ上がるようであれば、ロスカットのポイントを値動きに追従させて上げていく(上昇時に利益を最大化できるトレーリングストップという手法)

何はともあれ、しつこく言っていますが、レバレッジさえ無理に掛けなければ即死の可能性は低くなるので、そこさえ注意すればシンプルなプログラム売買でもそれなりに利益にはなるし、そこから広がる世界もあり、何かのきっかけになればうれしいです。

不確定な時代ですが、きちんと資産を増やし、自分の選択肢の自由度を上げて、お互い楽しく納得の行く日々を送ろうではありませんか。

なおMT4のインストールやサーバでの実行方法、EAの利用方法はあちらこちらに資料があるのでググってみてください。もしご要望がそれなりにあるようであれば、あらためて説明したいと思います。

※言うまでもありませんが、投資はご自身の判断と責任で行ってください。本稿は参考情報として提供するものであり、特定の銘柄や市場全般の今後の動きを予測するものではありません。ここで提供する情報やソフトウェアを元に読者の方が行ったいかなる結果についても、筆者は責任は負えません。

この記事が気に入ったらサポートをしてみませんか?