English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
MetaTrader 5 から MetaTrader 4へトレードをコピーする方法

MetaTrader 5 から MetaTrader 4へトレードをコピーする方法

MetaTrader 5トレーディング | 19 11月 2015, 15:53
1 148 0
Mykola Demko
Mykola Demko

はじめに

少し前トレーダーの多くは MetaTrader 5 は粗削りなプラットフォームで実トレーディングには不向きであると考えていました。しかしその後短期間で今や世論は実トレーディングはいつできるようになるのだろう、と思っています。すでに数多くのトレーダーがMetaTrader 5に実装されているメリットを高く評価しています。その上MetaQuotes Software Corp.が主催したチャンピオンシップが MQL5 言語に対する開発者の興味を高めました。今この興味をトレーディングから収益という形で実現したいと望んでいるのです。当の疑問『いつ現実のトレーディングができるようになるのか?』は見当違いなものです。その解決策は特定のブローカーに依存します。新プラットフォームに移行する時期を最終的に決めるのブローカーなのです。

この状況で孤独なトレーダーには何ができるのでしょうか?答えは明白です。 MetaTrader 5への移行としてMetaTrader 4によって提供される現実のトレーディングチャンスを活かすのです。すなわち模倣物を書くのです。ウェブでは2台の MetaTrader 4 間でバインドすることは革新ではありません。これからはそのようなバインドを MetaTrader 5と行うのです。


はじめに

本テーマとして述べられる考えを実装するために必要なことは疑問を解消することです。『収益はどこからやってくるのか?』また『トレーダーはどうやって収益を管理し増やすことができるのか?』一見すると答えは明らかです。安く買い高く売るのです。ですが収益の構成成分を考察します。収益は買値と売値の差で、入札数でかけ算されたものです。収益には構成要素が2つあるということです。クオートとドレードポジションのボリュームです。

トレーダーは何を管理することができるのでしょうか?この2つの構成要素のどちらがトレーディングの行く先を決めるのでしょうか?もちろんドレードポジションのボリュームの方です。クオートはブローカーから受け取られるもので、トレーダーには変更することができません。ここに最初の結論があります。トレーディングのコピーを作成するにはトレーディングポジションのボリュームの同期を保持する必要があるとこうことです。


1. 2種類のプラットフォーム比較


1.1会計システムにおける違い

比較されるプラットフォームは異なるトレード会計システムを持ちます。そしてこれがコピーを複雑にするゆえんです。ただこのバインドの主体は MetaTrader 5であることを忘れないようにします。これが意味するところは MetaTrader 4 で同じ会計システムを実質上繰り返す必要があるということです。

MetaTrader 5 でのトレードポジションは個別のトレードオーダーからの結果で、それは MetaTrader 4で適用される注文会計に反するものではありません。ポジションに対する共通のストップロスとテイクプロフィットはオープンしているオーダーに対する同じストップロスとテイクプロフィットを出すことで採り入れられます。両プラットフォームの大きな違いは、MetaTrader 4でどのオーダーをクローズするのかという質問に関するものだけのようです。MetaTrader 5 はトレードポジションに個別の注文会計を持たないため、この問題はつまづきとなる可能性があります。


1.2トレードポジションのボリューム

どの注文をクローズするかで何か違いがあるのかどうか細かく考察します。それは収益に影響を与えるのでしょうか?たとえば、異なる時刻に2つの注文をオープンしました。そして同じように異なる時刻にクローズしました。ただししばらくの間一緒にトレードを抜けたとします。つまり注文会計システムでトレードポジションをエミュレートしようとしたのです。

注文それぞれのクローズレベルのレベルを変更する場合、収益を得るために起こる異なるバリアントを計算します。

タイプ ボリューム オープンレベル クローズレベル
売り 0.1 1.39388 1.38438
売り 0.1 1.38868 1.38149

計算機能のコードを書きます。

void OnStart()
  {
   double open1=1.39388,close1=1.38438,
         open2=1.38868,close2=1.38149;
   Print("total  ",n1(profit((open1-close1),0.1)+profit((open2-close2),0.1)));
   Print("order2  pp=",ns(open2-close2),"  profit=",n1(profit((open2-close2),0.1)));
   Print("order1  pp=",ns(open1-close1),"  profit=",n1(profit((open1-close1),0.1)));
  }
string ns(double v){return(DoubleToString(v,_Digits));}
string n1(double v){return(DoubleToString(v,1));}
double profit(double v,double lot){return(v/_Point*lot);}
以下が計算です。
order1  pp=0.00950  profit=95.0
order2  pp=0.00719  profit=71.9
total  166.9


close1 および close2の値を取り替えます。

order1  pp=0.01239  profit=123.9
order2  pp=0.00430  profit=43.0
total  166.9

図1 オーダークローズのバリアント

図1は領域F AB および CD が両方のバージョンのボリュームが0.1であることを示しています。一方 BC のボリュームは 0.2でそれはオーダーがクローズされるボリュームに依存しません。

個別の注文の収益では異なりますが、ポジションのトータル収益は変わりません。この例は注文の等しいボリュームに対して計算されているということに注意を払っていただきたいと思います。つまり同じレベルでオーダーではなく同じボリュームのクローズを実装したということです。そしてボリュームをクローズする原則に忠実に従うとしたら、オーダーのボリュームがどうかというのは問題ではないということです。クローズボリュームがオーダーボリュームより大きければ、そこには部分的なクローズがあるということになります。

そこで主な結論です。トータルポジションに対しては、どのオーダーがクローズされたかは問題ではありません。重要なことはクローズされたボリュームが既定レベルに等しい必要があるということです。


1.3トレードのコピー

上記例から同じ収益を得るために MQL5で書かれる Expert Advisor によって作成されるシグナルを変換する必要はないのです。トレードポジションのボリュームを繰り返せばよいだけです。あとでお話するなんらかの理由により、それは完全に同一のトレードとはなりませんが。ただこういった理由はMQL5で書かれる収益性ある EAを用いて現実の収益を得るのに障害とはなりえません。

収益を減少させる最初の理由はクオート間の違いです。ブローカーによってはスプレッドを超えることもあります。何かというとクオートがリアルタイムで移動されるということです。そして EA が MetaTrader 5 でanポジションをオープンする判断をすると、MetaTrader 4 に接続しているブローカーはただ異なる価格を取得する可能性があります。この場合、価格は可能性として悪くもよくもあります。

収益減少の二番目の理由は時間的要因です。ポジションはすでに MetaTrader 5に表示されてからコピーされるため遅延は避けられません。

上記2つの理由がすべてのスキャルピング戦略に影を投げかけるのです。そのため MetaTrader 5で実際のトレーディングが可能になるまでそのような戦略は使えません。

収益(トレードからの)があがるように思われるシステムはスプレッドをはるかにしのぎ、特定ブローカーのクオートに敏感でなければ、ポジションの模倣を使って本当に資金を稼ぐことができるのです。


2. 課題設定

  1. MetaTrader 5 - MetaTrader 4間でシグナルを渡すためのバインディング
  2. MetaTrader 5からのポジション移動
  3. MetaTrader 4でのシグナル受け取り
  4. MetaTrader 4でのトレードポジションの繰り返し


2.1. MetaTrader 5 - MetaTrader 4間でシグナルを渡すためのバインディング

最初のバリアントは共通ファイルを用いてのシグナル伝達です。疑問は「ファイルへの頻繁なレコード書き込みはハードウェアに悪影響を与えることはないのか?」というものです。ポジションが変更したときだけ新規データを書き込めば、そのようなレコードはあまり頻繁ではありません。Windows の開発者がぺージファイルに変更を加える頻度を越えないことです。これ自体はハードウェアに悪影響はないことが証明されたプロシージャです。共通ファイルへの書き込みはあまり頻繁なリクエストに対してでなければ許容できる実装です。最初の制約ほど重大でないにしてもこれはスキャルプ戦略のもう一つ別の制約です。

バインディングについては、あらゆる深さに対してもサブディレクトリ―を書くというMetaTrader 5 のの機能を利用します。私はこの『あらゆる』という部分を確認していませんが、確実にサブディレクトリを10個までは書きます。そしてそれ以上は必要ありません。確かにアクセスできるように DLL を使用することはできますが、そうしなくても問題が解決可能であれば DLLは使用しない、というのが私のスタンスです。この問題 DLLなしで解決するに MetaTrader 5 ターミナルのディレクトリ \Files\ に MetaTrader 4 をインストールするだけです(ファイルとの連携を参照ください)。

以下が共通ファイルへのパスです。

C:\Program Files\MetaTrader 5\MQL5\Files\MetaTrader 4\experts\files\xxx      
//where xxx is the name of the shared file.

この場所でファイルは MetaTrader 4、MetaTrader 5両方で利用可能で、共有の機能は MQL5の関数によって提供されます。


2.2. MetaTrader 5からのポジション移動

ポジション移動とリソースの経済的利用には、すべてのインスツルメントについで表示/変更/トレードポジションのクローズを監視する関数が必要です。その上トレードを転送するにはトレードポジションのボリュームを知る必要があるだけです。ボリュームにインスツルメントのシンボル、 SL レベルおよび TP レベルを追加します。

変更を追跡するにはポジションの前回状態を知る必要があります。前回の状態と今回の状態が一致しなければ(それゆえポジションが変更されていれば)、それをファイルに表示する必要があります。またこの情報をファイルに書き込む関数も必要です。ファイルは複数プログラムで同時に利用可能なようにオープンする必要があります。

ポジションが変更される瞬間を見逃すことの内容に追跡システムを OnTimer() 関数に実装する必要があります。これは同時にすべてのインスツルメントを追跡する必要があり、ティックは異なるシンボルに対して異なる時刻にやってくるためです。またファイルの内容に関する変化についてのシグナルを送信する必要もあります。


2.3. MetaTrader 4でのシグナル受け取り

ファイル更新のシグナルを追跡することも必要です。これはポジション変更のゾーン立ち入りについての状態が監視される変数によって手配されます。ポジション状態を持つファイルを読む関数が必要です。それは標準的関数です。

計算用配列へのファイル内容渡しここではパーサーが必要です。番号だkでなくシンボルも渡されるため、MetaTrader 5から転送される際すべてを文字列にコードしなおすのが便利です。その上、1件のテキスト文字列内に1シンボルに対しすべてのデータを書くことでデータの混乱を取り除きます。


2.4. MetaTrader 4でのトレードポジションの繰り返し

これはもっとも大きな関数セットです。よって複数のサブクラスに分割する必要があります。

  1. 仮想ポジションの比較
  2. オーダー選択関数
  3. オーダーオープン関数
  4. オーダークローズ関数
  5. オーダー変更関数


2.4.1. 仮想ポジションの比較

仮想ポジションの比較はポジションが一致していることを確認するのに必要です。この関数は各シンボルに対して個別にポジションを計算し、またトレードが禁じられているポジション(もしあれば)を除外します。

実践ではブローカーがシンボル、すなわちMetaTrader 5から渡されるシグナルを持たない場合ありえます。ただこれは警告が発されるだけで通常トレーディングを妨げません。ユーザーはそのような状況について知る権利があります。


2.4.2. オーダー選択関数

この関数はさらに連携するためにシンボルに応じてオーダーを選びます。この場合、われわれはオープンしているポジションのみ送信するため、オーダーは指値注文をもたないようにフィルターにかけられる必要があります。


2.4.3. オーダーオープン関数

計算の最大数を持ちます。よってボリュームとタイプを渡すと十分です。


2.4.4. オーダークローズ関数

前の関数とちょうど同じようにクローズ命令を出す前にすべてを計算します。


2.4.5. オーダー変更関数

この関数はマーケットへの近さを確認します。またオーダーとストップレベル出しのオーバータイムを解除するのが望ましいと言えます。それはストップレベルをオープン中に出すことはすべてのブローカーが許可しないためです。その上、オーダーのオープンやストップレベルの設定を複数行うことはクオートし直しの可能性を高めます。

このためポジションは迅速に繰り返されることとなります。またストップレベルを出すことは重要ではありますがささいなものです。


3. 実装

コードはほとんど毎行詳細にコメントされています。そのためコードを説明する際はもっとも難しい箇所のみにこだわりたいと思います。


MetaTrader 5 - MetaTrader 4間でシグナルを渡すためのバインディング

MetaTrader 5 におけるバインディングは関数によって実装されます。

void WriteFile(string folder="Translator positions") // by default it is the name of the shared file

最初のフラグは以下を意味します。

FILE_WRITE|FILE_SHARE_READ|FILE_ANSI

ファイルは書き込みのため開いています。 | 読み出しのため異なるプログラムによる共有使用が許可されています | ANSIエンコード

MetaTrader 4 ではバインディングは関数によって実装されます。

int READS(string files,string &s[],bool resize)


resize パラメータは受け取られたデータの配列メモリを再配布することは禁じています。コードではこの配列へのメモリは各反復を伴って割り当てられています。それは開発者が行数を予測できないためです。それは MetaTrader 5で選択されるシンボル数に依存します。よって MetaTraderで事前に計算することはできないのです。

そのため配列は各ステップで1ずつ増えます。ただこの処理は2番目の関数呼び出しでブロックされます。というのも配列の長さはすでに決められており変更ができないからです。このために変数 bool resizeを使用します。


MetaTrader 5からのポジション移動

1秒の周波数を持つデータを OnTimer関数で移動を行うには、すべてのポジションに関するデータが関数で受け取られます。

void get_positions()

そしてポジションの前回値を関数の現在値と比較します。

bool compare_positions()

最低セルが1個一致しないと return(true)での終了が起こります。return(true) での終了とはポジションが等しくなくファイルが再度書かれる必要があることを意味します。ファイルを再度書くときカウンタ cnt_command は1増えます。


MetaTrader 4でのシグナル受け取り

READS() 関数を用いてファイルを読んだら文字列 s[]の書き込み済みの配列を取得します。

これら文字列が有用な情報に変換されるにはパーサーが必要です。

関数

int parser(int Size)

は行識別関数を呼ぶためのラッパーです。

void parser_string(int x)

関数はシンボル以外のセルをすべて認識します。

シンボルは一度以下の関数を用いてアルゴリズムの開始時、サイクルで認識されます。

void parser_string_Symbols(int x)

次にMQL5のコードは適用せず、 特別に述べられない限りMQL4のコードについてのみ話します。


仮想ポジションの比較

ポジション比較は2つのパートに分割されます。ボリュームおよびポジションタイプの比較は以下の関数に実装されます。

bool compare_positions()

このシェルではポジションの実状を取得するための呼び出しが以下の関数に実装されます。

void real_pos_volum()

そして前述の『オールオアナシング』の原則に従い関数比較も実装されます。それは少なくともセルが1個同じでなければすべてのポジションが異なっているとみなされるということです。real_pos_volum() では数多くのフィルターが実装されます。それはコードに詳細記述があります。また別の関数で繰り返し使用されます。

特に仮想ポジション内であるシンボルについてすべてのオーダーのボリューム合計を出すのに使用されます。ロックされているポジション(もしあれば)を正しく処理するために「買い」オーダーがマイナスのボリュームを持ち「買い」オーダーがプラスのボリュームを持ちます。

比較の第二の部分はストプレベル(ストプレベルはストップロスおよびテイクプロフィットです)を比較することです。それは上記の関数に似た関数に実装されます。

bool compare_sl_tp_levels()
ボリューム同様、シェル内部には関数内のストップレベルに関する情報を取得するための呼び出しがあります。
void real_pos_sl_tp_levels()


オーダー選択関数

オーダーはボリュームをクローズするためだけに選択されます。それが複雑な特殊化された選択関数だけがクローズするためだけに実装される理由です。

void close_market_order(string symbol,double lot)

上記はシンボルとボリュームのパラメータを持ち、それはクローズされるものです。できるだけ小さくオーダーを分割するため、関数の最初のサイクルでボリュームが許可を求めてパラメータに渡され失われるのと等しいオーダーを検索します。それはパラメータに渡されるクローズするボリュームに等しいものです。

そのようなオーダー(クローズフラグFlagLotの状態から知られている)がない場合、指定のボリュームが閉じられ、それがサイクルの最初となります(オーダーボリュームの超か確認はクローズする関数 Closes()に実装されます)。

ストップレベルの変更のためのオーダー選択は次の関数に実装されます。

void modification_sl_tp_levels()

オーダーはシンボルによってのみフィルターにかけられます。それは1シンボル内のすべてのストップレベルが等しいためです。


オーダーオープン関数

それは以下の関数に実装されます。

int open_market_order(string symbol,int cmd,double volume,
                     int stoploss=0,int takeprofit=0,int magic=0)

それには指定データを用いで快適にオーダーをオープンするのに必要な確認がすべて含まれています。


オーダークローズ関数

それは以下の関数に実装されます。

bool Closes(string symbol,int ticket,double lot)

コードは ロット パラメータが前回回選択されたオーダーの実ボリュームを超える場合の確認をします。


オーダー変更関数

それは以下の関数に実装されます。

bool OrderTradeModif(int ticket,string symbol,int cmd,double price,
                    double stoploss=0,double takeprofit=0,int magic=0)

このコードはストップレベルがオーダータイプに対応していない場合、値が交換されるかの確認があります。それはレベルがすでに依頼の値を持つかどうかも確認します。


4. 論理関数

前に計画した部分は終了しましたがコードにはまだ説明していない関数があります。それらは損理関数で、プロセスを起動する基本の関数と言うことができます。

void processing_signals()
void processing_sl_tp_levels()

双方の機能は条件付中断で終了する無限サイクルです。注意することは、スクリプト自体が無限ループとして実装されていることです。ユーザーが快適にプログラムを除外できるように、サイクルの主要な条件は内蔵関数 IsStopped() を持ちます。

コードはExpert Advisor からループ化されたスクリプトに以下のように転送されます。

// Init()
 while(!IsStopped())
    {
     // Start()
     Sleep(1000);
    }
 // Deinit()

スクリプトの全体ロジックは標準関数 start()の同じ無限ループに記述されます。

以下は start() にあるサイクルのコードです。

If the trade flow is not busy
          Read the file and save data in an array (not changing the array size);
          if there have been changes in the file
               write new comments;
               remember the time when cycles of compliance check start (located below);
               if the positions whose volumes are being compared are not equal
                    process the positions by volumes;
               if the positions whose stops are being compared are not equal
                    process the positions by stops;
               calculate the end time of checks;
          If time is not exceeded
               make a pause for the remaining time;

もっとも複雑な論理的コンストラクションは関数 processing_signals() および processing_sl_tp_levels()に入っています。

『シンプルから複雑へ』の原則にのっとって関数を記述し始めます。コード内の呼び出しは逆であってもです。

//+------------------------------------------------------------------+
//| processing stop levels                                           |
//+------------------------------------------------------------------+
void processing_sl_tp_levels()
  {
//--- remember the time of entering the cycle   
   int start=GetTickCount();
   while(!IsStopped())
     {
      //--- if the trade flow is not busy
      if(Busy_and_Connected())
        {
         //--- select the order and modify stop levels           
         modification_sl_tp_levels();
        }
      //--- if the delay time is over, update information from the file  
      if(GetTickCount()-start>delay_time)READS("Translator positions",s,false);
      //--- if the update counter has changed in the file, exit the cycle      
      if(cnt_command!=StrToInteger(s[0]))break;
      //--- micro-pause      
      Sleep(50);
      //--- if real stop levels and those in the file are equal, exit the cycle     
      if(!compare_sl_tp_levels())break;
     }
   return;
  }

前に述べたように関数は2件の条件で終了する無限ループです。

ループ終了の第一条件は cnt_command の値がファイル内の同じ値に等しい場合です。その前に、ループ処理の時刻がグローバル変数delay_timeに設定されたディレイを超えるとしてファイルに関する最新情報を受け取ります。

時刻が超過するのは変更がすべてフィルター Busy_and_Connected()によって保護されているためです。つまり、トレードの流れがフリーの場合だけエンターします。

MetaTrader 4 では( MetaTrader 5と逆で)サーバーが再度クオートを持たないと命令のシリーズを送信することはできないということをここで説明する必要があります。サーバーはただ最初の依頼を受け入れるだけで残りは失われます。そのためサーバーに命令を出す前にトレードの流れがフリーかどうか確認する必要があります。

第二のサイクル終了のための確認はストップレベルcompare_sl_tp_levels()による上述のポジション比較関数です。ポジションが等しければ、サイクルを終了します。

ここでややこしくなります。 processing_signals () 関数は同様の方法で作成されますが、機能性についての論理部分はひじょうに異なります。

この部分を詳しく分析します。

//--- convert the direction of the position stored in the file to the form -1,+1            
int TF=SymPosType[i]*2-1;
//--- convert the direction of the real position to the form -1,+1
int TR=realSymPosType[i]*2-1;
//--- save the volume of the position stored in the file                     
double VF=SymPosVol[i];
//--- save the volume of the real position 
double VR=realSymPosVol[i];
double lot;
//--- if the positions for the current symbol are nor equal
if(NormalizeDouble(VF*TF,8)!=NormalizeDouble(VR*TR,8))
  {
//--- if the real volume is not equal to zero and the directions are not equal or
//--- if the directions are equal and the real volume is larger than that in the file                              
   if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))
     {
      //--- if the directions are equal and the real volume is larger than that in the file 
      if(TF==TR && VF<VR)lot=realSymPosVol[i]-SymPosVol[i];
      //--- if the real volume is not equal to zero and the directions are not equal
      else lot=realSymPosVol[i];
      //--- close the calculated volume and exit the cycle                  
      close_market_order(Symbols[i],lot);
      break;
     }
   else
     {
      //--- if the directions are equal and the real volume is less than that in the file 
      if(TF==TR && VF>VR)lot=SymPosVol[i]-realSymPosVol[i];
      //--- if the directions are not the same and the volume is equal to zero                  
      else lot=SymPosVol[i];
      //--- open the calculated volume and exit the cycle 
      open_market_order(Symbols[i],SymPosType[i],lot);
      break;
     }
  }

変数 TF および TR は buy=-1、sell=1の形式でポジションタイプの値を格納します。したがって TF はファイルに格納される値で、 TR は仮想ポジションの実価です。同じことがボリューム VFVRにも言えます。

よって不均衡
if(VF*TF!=VR*TR)

はボリュームまたはポジションタイプが等しくない場合にです。

そして理論的結合がきます。

if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))

これは実ボリュームがゼロでなけく、タイプが等しくなければ、ポジションがすべて閉じるということです。

これにはファイル内のボリュームがゼロのとき、ポジションが逆方向のときのオプションが含まれます。バリアントでは、ポジションが逆方向のときはまずオープンするポジションを準備する必要があります。すなわち前回ボリュームをクローズするのです。それから次の反復で logic は別のブランチ、オープンに行きます。

論理的結合の二番目の複雑な条件はタイプが正しいが実ボリュームがファイルに格納されている以上であれば実ボリュームを減らす必要があります。このためにまずボリュームを減らす必要のある分量のロットサイズを計算しました。

この状況に合うクローズ条件がなく、ポジション(最初のフィルターで取り上げた)が等しくなければ、新しいオーダーがオープンします。ここにもバリアントが2つあります。ファイル内のポジションのすべてのサイズに対してオーダーをオープンするか、既存のオーダーに追加するか、です。制限ボリュームの超過を確認することはオープン関数でできることに注意したいと思います。よって不足のボリューム(それが確認できていなければ)はアルゴリズムの次の反復でオープンします。まずクローズの状況が処理されそのごオープンされるため、のロック状況はほとんど不可能です。

一つ微妙なコードの箇所に言及したいと思います。オーダーをオープン状況は、ストップによって MetaTrader 4 でくろーぷされたばかりです。前にクオートの不一致は5桁のうちの2~3ポイント内のことが多いとお話しました。15のスプレッド内ではその差は取るに足らないものです。がこの差で、 MetaTrader 5でより早く MetaTrader 4 でストップロスまたはテイクプロフィットが起こると、アルゴリズムがクローズしたばかりのポジションを再作成する状況が発生し、MetaTrader 5で発生するストップにより続いて排除が起こります

大きな損失にはなりませんでしたがスプレッドを1件失うこととなりました。よってアルゴリズムは作成し直し、ポジションの排除後 MetaTrader 4 がそれを回復せずファイル状態が変化するまで待つようにしました。そしてその後やっと再び処理をするのです。この状況ではトレーダーが誤りを見つけたらマニュアルでポジションを排除することができます。それは MetaTrader 5 がファイルに変更をするまで回復されません。

ゆいいつのデメリットは MetaTrader 4 が停止するとポジションを排除し、MetaTrader 5ではそのポジションがクローズしない稀な状況です。この場合はスクリプト Copyist positionsを再起動するとよいでしょう。最後の節でコードは週末の動作を確認しません。深刻なことはありません。ログが意味のないクオートでいっぱいになるだけです。


5. 実践における実装の確認

MetaTrader 4 をディレクトリ C:\Program Files\MetaTrader 5\MQL5\Files\ にインストールします。

MetaTrader 5の任意のチャート上でコンパイルした Expert Advisor のTranslator positions を実行します(Expert Advisor の動作は実行されているチャートに依存しません)。

図2 MetaTrader 5での移動機能ポジション

最初の行にはカウンターの状態を伴う複数行のコメントを、各行にすべてのポジションログを確認します。

MetaTrader 4の任意のチャート上でコンパイルしたスクリプトCopyist positions を実行します(ループ化されたスクリプトの動作は実行しているチャートに依存しません)。

図3 MetaTrader 4のCopyist positions

それから MetaTrader 5でどのようなExpert Advisor でも実行することができます。その処理結果は MetaTrader 4に素早くコピーされます。

図4 MetaTrader 4 (上)および MetaTrader 5 (下)のポジションとオーダー

ところで MetaTrader 5 のアカウント管理はマニュアルで行うことができます。またアカウントはインベスターパスワードを使用するとログインできます。

たとえばあらゆるチャンピオンシップアカウントで模倣を開始することができます。


おわりに

本稿はトレーダーの新しいプラットフォームへの移行を促し、MQL5の調査を奨励するよう意図されています。

結論として申し上げたいのは、このコードはMetaTrader 5の実アカウントでの直接トレードを完全に置き換えることはできないということです。理論に配慮せず任意のトレーディングシステムに対する汎用的なコードとして書かれており、そのため汎用的なものはなんでもそうですが、理想的なものではありません。しかしこれを基に、みなさんは指定の戦略についてのシグナルトランスレータを書くことができます。プログラムとはかけ離れている多くのトレーダーにとって、リリースを見越した移行期としての役割を果たす可能性があります。

プログラミングによく精通している方々に対しては、マジックナンバーでオーダーを認識するようにコードを修正し、転送や指値注文出しを実装されることをお薦めします。指し値注文を出すことは、サーバーと安定して接続しているなら収益に影響しません。接続が失われるようなことが頻繁に起こるなら、指し値注文を含めすべてのサーバーパスをコピーする必要があります。

新しい言語を学んで堅牢なシステムを開発するのに使用しましょう。みなさんのトレーディングの成功を祈って。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/189

添付されたファイル |
チャート上でトレーディングの考え方を時間をかけずに検証する方法 チャート上でトレーディングの考え方を時間をかけずに検証する方法
本稿はトレーディングの考え方を速く視覚的に検証する方法について述べます。その方法は価格チャート、シグナルインディケータ、残高計算インディケータの組合せを基にしています。そんなわけで、これからトレーディングの考え方を検索する方法やその考え方を時間をかけずに検証する方法をみなさんと共有したいと思います。
MetaTrader 5 ターミナルのストラテジーテスタ内でティック作成をするアルゴリズム MetaTrader 5 ターミナルのストラテジーテスタ内でティック作成をするアルゴリズム
MetaTrader 5 により内蔵ストラテジーテスタでExpert Advisors および MQL5を利用し自動トレーディングをシミュレートすることができます。このタイプのシミュレーションは Expert Advisorsの検証と呼ばれ、マルチスレッド最適化を用い、同時に数多くのインスツルメントについて実装することができます。完全な検証のために用可能な分履歴をもとにティック生成が行われる必要があります。本稿ではアルゴリズムの詳細記述を提供します。それによりティックはMetaTrader 5 クライアントターミナルで履歴検証に対して作成されます。
MetaTrader 5のトレードシグナル:PAMM アカウントへのよりよい代替手段 MetaTrader 5のトレードシグナル:PAMM アカウントへのよりよい代替手段
MetaTrader 5 が今トレードシグナルを備え、そのため投資家や幹事会社に力強いツールを提供できることをうれしく思います。成功しているトレーダーのトレードをフォローする間にも、ターミナルは自動でそれらをみなさんのアカウントに再生しているのです。
アンマネージドのエクスポートを使用した MQL5へのC#コードのエクスポーズ アンマネージドのエクスポートを使用した MQL5へのC#コードのエクスポーズ
本稿ではMQL5 コードとマネージドの C# 間の異なる連携手法を提供します。またC# に対してMQL5を整理する方法および MQL5 スクリプト内にてエクスポートされたDLL関数を呼びだす方法例も提供します。ここでお話する例がマネージドのコードで DLLを書くことに関する将来的な研究の基になると信じています。本稿はまたすでにC#で実装されている多くのライブラリを使用するために MetaTrader にドアを開けるものです。