*

MQL&PHP サーバーを経由するコピートレードシステムを作るやり方

目次/もくじ

Originally posted 2018-10-01 13:46:18.

この記事ではWEBサーバーを経由するMT5のコピートレードシステムの作り方について解説します。MT5のEAプログラムからサーバーの構築方法まで説明します。  

 

MQL5ですが、オーダーの送信部分以外はMQL4と変わらないので、MQL4でやりたい人はトレード関数の部分だけを入れ替えればいいと思います。  

 

以前、DLLなしで動くコピートレードシステムを連載しましたが、今回はサーバーを経由するコピートレードシステムを作ります。  

 

以前のコピーツールは、同一PC上で速度を優先したツールなので、業者間アービトラージやストップ狩り返しなどに特化しています。  

 

これから作るツールは、PCから一度サーバーにトレードデータを飛ばし、別のPCでトレードをコピーできるように作ります。  

 

開発目的

意図としては、

・自分のトレードを誰かに配布したいとき、

・EAを販売したいけどソースコードの流出が心配なとき、

・国内の業者で擬似的にPAMM,MAMをやりたいとき

・利用者をサーバー側から遠隔で管理したいとき

などを想定しています。 サーバーの構築からやると大変なので、今回はレンタルサーバーでできるように実装します。  

 

開発概要

概要なこんな感じです。

すごいトレーダー(もしくはEA)のトレード

サーバーにそのトレード情報を送る

一般トレーダーがサーバーからその情報を取得し、トレードをコピーする

 

FXONさんなどがやっている”シグナル”と基本的には同じです。ただし、今回はDLLなしでコーディングします。  

 

必要な言語は、MQLとPHP(ちょっとSQL,HTML)です。データベースを使うので、今回に限ってはPHPがベストだと思います。  

 

また、実際にトレードをコピーすると数秒の誤差が生まれるので、 秒速スキャルピングのコピーはできません。

 

サーバー経由のコピートレードができるようになると、いろいろとビジネスの可能性が広がるので、FX業界で動いている方には役に立つと思います。

 

必要なものは、

・サーバー

・トレードを送信するEA

・トレードを受信するEA

です。

それぞれ独自に開発する必要があります。

EAを作れる人はそこそこいますが、WEBとEAどちらも作れる人はそうはいないので、この際できるようになるとお得かもしれません。  

 

トレードデータをサーバーに送信するEAを作る

まず、データをサーバーに送信するEAを作ります。

飛ばすトレード情報のデータは、

・チケットナンバー

・通貨ペア名

・エントリーの向き です。

他にも情報を追加したい場合は、適宜追加してください。 基本的には上記だけでも何とかなります。

他に入れたい場合は、 ・注文時間 ・注文ロット ・SL ・TP ・注文方式 とかを入れると予約注文や部分決済などにも対応したシステムが作れます。

 

POSTとGET

これらの情報を何かしらの方法でサーバーに送らなければいけないのですが、MQLのWebRequest関数で送信できるWEBの通信には大きくPOSTとGETがあります。  

 

GETの方が簡単なのでデータ量が短い場合はGETでも大丈夫ですが、ポジションの量が増えたりするとものすごい長いURLになってしまうので、POSTで行きましょう。

 

データの整形

データの整形ですが、ポジションの数に応じてこの情報を連結させます。

例えば、 123456:USDJPY:BUY@123457:EURUSD:SELL@111111:EURJPY:BUY このような感じです。

 

それぞれの記号はデータを区切る意味しかないので、 カンマでもコロンでもなんでもOKです。

(ただし、データベースが誤認識しやすい記号があるので、それらは避けましょう) 今回はMQL4ではなく、MQL5で書いていますが、 基本的にはMQL4と同じです。 オーダー関数が構造体になるくらいの違いです。

 

関数化するとこんな感じです。

FX業者によって異なる通貨ペア名の統一

業者によっては、USDJPYmとかUSDJPY_xとか余計な文字列がついていることがあるので、 最初の6文字だけを取得するように一般化してください。

 

StringSubstrを使えば最初の6文字だけを切り取れます。 また、このEAにトレードをさせるわけではないので、for文の判定はPositionsTotal()そのままでOKです。

 

(以前EA開発講座でやりましたが、for文の中で決済処理をしてしまうとPositionsTotal()の数が変わってしまうことがあるのを回避する話です。)  

 

アカウント情報をサーバーに送る

順番が前後してしまったのですが、トレードを送信する側のアカウント情報を サーバーに送る準備をします。(一応ね)

トレード情報を送る機能 と アカウント情報を送る機能 を分けて処理します。

「口座の管理や認証処理はとりあえずいらないよ」っていう人はスルーしても大丈夫です。 サーバーに送る情報は、

・サーバーにアクセスする際のパスワード

・使っている業者

・アカウント名

・アカウント番号

・メールアドレス(パラメタ入力)

・デモ口座かどうか

・受信者用のパスワード(パラメタ入力) です。

 

必要に応じて適宜増やしたり減らしてください。

この二つの情報(アカウント情報とトレード情報)をサーバーに送信します。

 

トレード情報は頻繁にサーバーに送信する必要がありますが、アカウント情報はたまに送信すればOKです。 セキュリティ向上のため、SSL接続でPOSTでHTTPリクエストを行います。

 

ポート制限がかかっているVPS上でMT4を稼働させている場合、SSL接続だとうまく通信できない事例があるので、生HTTPが良いと思います。 平文でGETリクエストでも大丈夫だとは思いますが、一応暗号化はしておきます。

この関数は指定したURLに対して、指定した文字列をPOSTで送る関数です。このURLはあとでサーバーを構築した際に指定します。

 

中で何をしているかわからなくてもこの関数をコピペすれば大丈夫です。 ちなみに、MQLのWebRequestは少しクセがあり、リファレンスのサンプルも上手く動かないので、少し注意が必要です。  

 

サーバー側のプログラミングをする

サーバー側では、大きく分けて4つのプログラムと2つのデータベースが必要です。

・EAから送信されたアカウントデータを受け取るプログラム

・EAから送信されたトレードデータを受け取るプログラム

・EAに送信するアカウントデータ(許可・不許可)を送るプログラム

・EAに送信するトレードデータを送るプログラム 

・アカウント情報を記録するデータベース(テーブル)

・トレードデータを記録するデータベース(テーブル)    

EAから送信されたアカウントデータを受け取るプログラム

 

アカウント名や会社名に含まれている記号を除去する

FX業者によっては会社名などに;や,などが入っているため、サーバープログラムでそれが原因のバグが発生する可能性があります。(お前のことだFXTF) まずはそれを取り除く関数を作ります。

変数を引数ではなくグローバル変数で使っていますが、引数にした方がポピュラーかもしれません。

 

EAからのPOSTデータを受け取る

まずは、トレードを送信する親側の処理を行うPHPファイルを作ります。

これは一般的なホームページの問い合わせフォームやログインの処理と同じです。POSTで送られてきたデータを$_POST[‘変数名’]で受け取れます。

 

それぞれの情報はPOSTで送られてくるので、一般的なフォームと同じようにそれらを受け取ります。

 

ハッカーがスクリプトを仕込んでPOSTしてくると簡単にSQLインジェクションできてしまうので、htmlspecialchars()やstripslashes()は一応平文に直すための処理です。  

  後はこれを、新規ユーザーの場合と既存ユーザーの場合に分けてデータベースに入れるだけです。

データベースについて 初めての受信の場合

初回の場合はHOSTテーブルにINSERTします。

データベースに挿入している記述ですが、あらかじめ適当なデータベースとテーブルを作成し、データベースにアクセスしておく必要があります。

 

分からない方は、ここら辺の知識はここで説明するには少し冗長になってしまうので、「php sql データベース接続」、「データベース 作り方」などで調べてみてください。

 

この処理をした際に管理者のメールアドレスに通知するなどの処理を書いても良いと思います。

データベース 二回目以降の受信の場合

二回目以降の場合は、UPDATEするだけです。 <?php

以上がアカウント情報の処理です。  

EAから送信されたトレードデータを受け取るプログラム

こちらもPOSTでEAからデータを受け取る処理は一緒です。

あとはそのオーダーがリアルタイムのオーダーかそれともヒストリーのオーダーか、 また、新規登録されるオーダーかすでにデータベースに登録されているオーダーかで場合分けして処理すればOKです。

 

EAに送信するアカウントデータ(許可・不許可)を送るプログラム

これに関してはPHPで適当に文字列を出力すれば、その表示がWebRequestの返値としてEAに送信されるので、echo なり Print_fなりで出力すればOKです。

 

EAに送信するトレードデータを送るプログラム

こちらも同様で、echoなどで簡単な文字列を出力すればWebRequestを通じてEAにデータが渡ります。

  あとは、送られてきたオーダー情報が「初めて受信したもの」か「前にも受信したことがあるデータ」なのかでSQLに対するクエリを変えればOKです。    

 

基本的には、まずは初めてのセットか2回目以降かで分けます。 初めての場合はSQLにINSERTする必要があるので、

アカウントの情報をUSERテーブルに入れます。 2回目以降の場合はUPDATEするだけです。 テーブルの列にRunとかAuthとかの名前の列を作っておき、 そこが1の場合はトレードを許可し、 0の場合はトレードをさせないようにします。

  これでサーバー側でユーザーの管理ができるようになります。 

  受信する側は、親アカウントのアカウント番号と親が設定したパスワードがあれば、 トレードをコピーすることができます。  

 

トレードデータをサーバーから受信するEAを作る

次はトレードを受信する方のEAを作ります。 トレードデータを送信するEAと比較すると、トレード関数を実装しなければいけないので、少し厄介です。

 

まずトレードデータをサーバーから取得する関数を作ります。まだサーバー側を作っていないので詳しくは言及できませんが、データを送る側のEAが送ったものと似たようなものを似たような形式で受信すると考えておいてください。

関数名にGetが入っていますが、リクエストはPOSTです。 ここらへんのURLとかデータベースとかは後で扱うので、今は外枠だけ作っておけばOKです。 取得したデータは最初配列になっているので、CharArrayToStringで文字列に直す必要があります。

 

受信データをポジションを反転する

次に、 サーバーから取得したトレードポジションを現在持っているかどうかを判定する関数を作ります。

後で詳しく扱うのですが、 オーダーを送信をする際にトレードコメントに親のトレードのチケットナンバーを差し込み、 ポジションのコメントにそのチケットナンバーのものがあるかないかで判定を行います。

 

何を言っているかというと、受信側のEAではサーバーから受け取った情報と現在持っているポジションを照らし合わせる必要があります。

 

しかし、同じ通貨ペアで同じ方向に複数のポジションがあった場合に、それをどうやって区別するのか、という問題があります。

 

そこでオーダー毎に振り分けられるチケットナンバーをマジックナンバーかオーダーコメントに格納することで識別してやろう、という魂胆です。

(オーダーコメントの場合デバッグ作業はしやすいのですが、コメントを書き換えるFX業者があるので、 マジックナンバーを親のチケットナンバーにした方が良いかもしれません。)

 

これで親のトレードと同じポジションを今現在持っているかが判定できます。持っていなかったらエントリーし、持っていたらスルーします。  

 

受信データのオーダーを過去に持っていたかどうか調べる

次に、 同じように”過去に”親のトレードを保有し、決済したかどうかを判定する関数を作ります。

 

これは何のためにやるかというと、何らかのエラーによりポジションが決済された際に、再エントリーするのを防ぐ役割があります。

 

もしくは、親トレーダーがエントリーして、そのトレードをコピーしたは良いけど、気に食わないから手動で決済する、という要望に応えることもできます。

 

基本的には先ほどと同じ構造の関数です。サーバーから受け取ったオーダーのチケットナンバーと現在持っているポジションのオーダーコメントを比較します。

 

オーダーを送信する関数

いよいよ、オーダーを送信する関数を作ります。

MQL5の場合、オーダーの送信は構造体にして送信するので上記のようなちょっと見慣れない感じになります。

 

現在ではCTradeという標準ライブラリもあるので、MQL4ライクに記述したい方、あるいはネッティングアカウント・ヘッジングアカウントに汎用性を持たせた記述をしたい方はCTradeがおすすめです。  

 

FX業者ごとに異なる通貨ペア名を統一した文字列をトレードできる文字列に戻す

ちょっとした注意事項ですが、サーバーに格納されている通貨ペアの情報は6文字で構成されています。

 

しかし、受信側のMT4の通貨ペア名は6文字でない場合があります。 例えば、受信する側の業者の通貨ペア名がUSDJPY_mのようになっていることがあるので、あらかじめその余計な文字列だけを取得しておき(_m)、あとで連結します。

 

これもStringSubstrを使えば簡単です。 TheSymbol+Ex 上記ではオーダーコメントとマジックナンバー、両方に親のトレードチケット番号を挿入していますが、 どちらか片方でもOKです。

 

あとは、 「過去に親のポジションを持っていない」かつ「今も親のポジションを持っていない」場合に エントリーし、 「受信したデータに現在持っているポジションの情報が消えたら」決済というプログラミングを OnTickに書くだけです。

 

WEBサーバーに接続する際に、500エラーや503エラーが出ることがありますが、 そういった事例の対処はPHPのときにします。  

 

これまでの内容でサーバーを経由するコピートレードシステムは できると思います。

 

WEBサーバー特有の問題

さて、 サーバーを経由させる場合、これまでにないような問題に直面することがあります。

サーバーがMT4のアクセスをDos攻撃と勘違いする

一つ目は、 ・サーバーが高頻度のティック更新によるWEBアクセスをDosと勘違いしてしまい、アクセス拒否になる これはWEBアクセスの頻度を下げるか、サーバーを自分で構築して、 同一IPからの大量アクセスをOKにするか、複数のプロキシを経由するしかありません。

 

MT4からのアクセスにはセッション/クッキーが使えない

二つ目は、 ・MetaTraderからのWEBアクセスはセッションもクッキーも使えない ということです。 つまり「前回のアクセスから何秒以内は処理しない」といった処理はPHP側ではできないので、 データベースで処理するか、MQL側で処理させなければいけません。

 

サーバーダウンの可能性もなくはない

三つ目は、 ・ユーザーが増えるとサーバーがダウンする可能性がある 強固なサーバーを使うしかないですね。ただ、PHPの処理自体はシンプルなので、仮想通貨の自動売買のようにパンクするということはなく、比較的耐えると思います。

 

これまで100アカウント越えのシステムも見てきましたが、サーバー負荷によるダウンは一度も観測していません。

 

これだけ問題もありますが、 恩恵は余りあるくらい大きいので、十分やってみる価値はあると保証できます。

 

コピーツールだと実質MAMでもEAとして販売できる

特にシグナルやMAMだと、いろいろと国内では問題がありますが、 “EA”として売り切りで販売すれば問題はないので、そういったところもクリアできると思います。

MQLとPHPとSQLができるエンジニアがいないけど、サーバー型のコピートレードシステムが欲しいという方はご連絡ください。(連絡先は右メニュー上部にあります。)

 

コピートレードのデータは暗号化しないhttpの生通信で送るべき理由

今回は技術的な話です。WEB通信するコピートレードにおいては速度が重要なファクターになりますが、その最もベースとなるものにhttpプロトコルを生のまま送るかSSLにするかという問題があります。  

 

最近の潮流では、脳死でSSLが当たり前みたいな風潮がありますが、よくよく考えてみる必要があります。  

 

海外VPSに設置されたMT4ではSSL通信がエラーになることがある

これ、原因がまだよく分からないんですよね。VPS上のMT4から自前のサーバーに通信するとき、海外製のVPSだと通信がうまくできないことがあるんですよ。

 

VPSのiptableの設定が”SSLは許可しない”とかになっているとかいう初歩的な問題ではないことは、ブラウザでhttps接続しているウェブサイトを見れば明らかで、何か他の問題があるように思います。  

トレード並みに通信速度が要求される業界

現在においては通信規格そのものがどんどん高速になりつつあるので、超高速な通信環境を求められるものは限られてきています。

(ちなみに5Gっつうのは無線の規格なので、最初から有線しているわれわれの業界は関係ありません。)

 

仮想通貨が「決済として使えるんじゃないか」とまだ思われていた時代は決済機器の通信速度が求められようとしていましたが、そもそもブロックチェーンが混んでしまえば通信速度なんて無視できるくらいの誤差であるということが分かった後は問題にもならなくなりました。  

 

今、FX業界以外でどこの業界が通信速度・通信プロトコルにこだわっているかというと、実はオンラインゲームだったりします。特にシューティングや格闘ゲームが顕著なようです。当たり前っちゃー当たり前ですけどね。

 

動画コンテンツ業界もちょっと近いですが、あちらは速度というよりもいかに大きなデータを一度に多くの人に届けるか、という問題になるので、データの圧縮解凍技術やサーバーのロケーションなどに主軸が置かれています。    

SSLは暗号化する、ということは速度がごく僅かに遅くなる

結局何が言いたかったのかというと、中身が見られてもそれほど問題がないデータで、かつ、高速な通信が必要なデータであれば、暗号化せずにHTTPの生の通信でやり取りした方が”ほんの少しだけ”はなくなるんじゃないの?って話です。  

 

で、そのやり方はオンラインゲーム業界でも行われているので、アカウント認証の際だけ気を付ければええやん、って提案です。

 

 

 

この投稿は役に立ちましたか? 役に立った 役に立たなかった 1 人中 1 人がこの 投稿 は役に立ったと言っています。

Message

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

[MT5からMT4に]コピートレードツールEA 使い方、無料ダウンロード

まず、完成形をお見せします。 左がMT5で、右がMT4です。 ナビゲータの口座のとこ

記事を読む

[MT4からMT5へコピー]コピートレードツール(EA) 使い方、無料ダウンロード

今回はMT4からMT5にトレードをコピーするツールの紹介です。 まずは様子をご覧くださ

記事を読む

[MT4からMT4へ]コピートレードシステムを作る,使い方,ダウンロード

ツールの特徴 MT4で自動売買ソフトを稼働させるトレーダーには、ときとしてトレードを別のMT4にコ

記事を読む

汎用型MT4MT5間 コピートレードシステムEA 使い方 無料ダウンロード

これまで、MT4->MT4, MT4->MT5, MT5->MT4, MT5>

記事を読む

[MT5からMT5へ]コピートレードシステム(EA) 使い方、無料ダウンロード

今回はMT5からMT5にトレードをコピーするツールの紹介です。 まずは様子をご覧ください。

記事を読む

 
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

     


  • 横瀬兼元(ペンネーム)です。

    プロフィール
    商材を買わせようとする偽者がいるらしいのでご注意ください。
    ツイッター始めました(イマサラー)
    https://twitter.com/FxantennaC
    (埋め込みするとページ表示が極端に遅くなるので、リンクでご容赦を) 4000文字未満のトピックや話題はツイッターで発信しています。
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

Translate »
ページトップへ