English Русский 中文 Español Deutsch Português
非標準自動取引

非標準自動取引

MetaTrader 4トレーディングシステム | 15 3月 2016, 17:12
842 0
Leonid Borsky
Leonid Borsky

はじめに

詳しく市場分析をせず MT4 のプラットフォームで行う首尾よく快適な取引。そんなこと、できるのでしょうか?そのような取引を実際に実装することはできますか?

私はできると思います。

特に自動取引では!MQL4 がそれを可能にしてくれるのです。のちに説明する自動取引システムは多くのリピートがあることが特徴となっています。そして、それは、Expert Advisor のプログラミングの基礎を知り始めたばかりの初心者でも簡単に実装することができます。

システム自体は実際に外界の反映です。調和をとって発展する生命はその法則に影響を与えます。子供のころ、われわれは全員次の場面を見ました。蟻が別の側から藁を持って、蟻塚に引っ張って入れるのです。そしてそれぞれの蟻が自分のやり方で藁を引っ張ります。それでも、最後には藁は蟻塚の方角へ運ばれるのです!自然の秘密でしょうか?トレーディングプラットフォームで状況をシミュレーションしてみます。



非標準自動システム

利益の種類の自動取引システムがいくつかあるとします。このシステムは以下の要件を満たしています。

  1. エントリーシグナルは実質的にランダムである。
  2. このシステムは常に市場にある。すなわち、ストップの代わりに逆方向ポジションを処理する。これは重要です。
  3. エントランスに設定された複数の静的パラメータにより、合理的なドローダウンで最大利益を得るために、システムを最適化します。

実質上、このシステムは「資金管理」ブロックなしで年間利益+3000 ポイントを提供します。その後、このシステムを逆モードで有効にします。別の言い方をすれば、このシステムは、次のような方法で動作するのです。

  1. ダイレクトモードで買いを行っていたら、ここからは売りをする、またはその逆です。そして、もう一度静的パラメータによりこのシステムを最適化します。リバースバージョンを出るとき、合理的なドローダウンで最大利益を得るのです。それは何の問題も起こしません。というのも、われわれの自動取引システムはもともとランダムなエントリーで構築されているためです。
  2. その後、同時に直接とリバースの両バージョンをスタートします。両バージョンの同時動作はひじょうに重要で、述べている取引システムの主要な点です。

何を取得するか確認します。

直接、リバースの両システムを同時にスタートするとき、二倍の利益を出します。ただ、システムはやみくもにではなく意識的に逆モード、すなわちお互いに逆方向で動作します。また、総損失-現在の損失現相対ドローダウン、を減らしました。では、システムがやみくもにではなく意識的に動作するのはなぜでしょうか?

理由は、リバースシステム開始後すでに3~4件のトレードで、別の静的パラメータが、直接システムに比べて、時刻と価格をいくらか移動してトレードを行うためです。それでもなお、リバースモードのエントランス アルゴリズムは同じです。

しかし総利益は徐々に増加するのです。直接、リバースの両システムが利益操作のために最適化されるのは明らかだと思います。そのうえ、一方のバージョンの現在損失はほとんどつねにもう一方の現在利益で補われるのです。結果的に、最大利益と最小ドローダウンを出すのです。

デメリットはマージン要求の増加です。ですがこれをデメリットと呼ぶことができるでしょうか?実際、ここには直接、リバースの2件動作している個別のトレーディングシステムがあります。そして当然マージン要求は2倍になります。また、リスクに関しては、大幅に減ります。これが主な考え方です。利益を増やすのではなく、ドローダウンを最大限減らすのです。1つの事柄は別の1つを与えます。再び、そのようは取引の総利益は徐々に増えるのです。結果、ここで「資金管理」ブロックを有効にすることができます。

サイト MQL4.community には、上に挙げた要件を満たすものを含め、異なる Expert Advisor の幅広い選択肢があります。市場自体はわれわれに新しいタスクを課し、異なる非標準的なソリューションを見つけるよう仕向けます。また、さらなる検索機能も見つけ出すことができます。

考えを実現し、さらなる実験を行うのに、基礎として Yury Reshetovの "Artificial Intelligence" を使用しました。これは同じ部分で以前に説明されているものです(Y. Reshetov 著の記事 "利益のある取引戦略を見つける方法" を参照)。それには一部修正と追加があり、特に、パーセプトロンの処理にもう一つ別の基本的インディケータを呼び出すオプションを含んでいます。また、ポジションオープンとのちの追跡のために追加条件がいくつか入っています。

ここに実験結果があります。タイムフレーム H1 でペア GBPUSD の検証で取得したものです。開始時のデポジットは 10000 ユニットです。2005 年 1 月から 2007 年 5 月までの2.5年間の履歴です。

直接バージョンにはこの期間中の250件のトレードがあります。リバースバージョンには同じく360件です。トレード数が異なるのは、最適化中のストップレベルがそれぞれのバージョンで違っていたためです。どちらのケースも分利益は最大 +10000 です。0.1 ロットでの動作中、「資金管理」ブロックは有効にせず、どちらのバージョンでも利益と損失のトレード比率は 3:2 です。

以下は履歴上の直接およびリバースバージョンの残高/資本グラフ例です。

ほとんどの場合、直接バージョンの損失トレードはリバースバージョンの利益トレードでヘッジされているのがわかります。そして逆もしかり。リバースバージョンのの損失は直接バージョンの利益でヘッジされています。

そのうえ、一方のチャートが横這いのとき、もう一方は上昇トレンドとなっているのです。最終的に、最小リスク、すなわち最小ドローダウン、で最大総利益を得るのです。全トレードの履歴を Excel で収集し、説明した考えを可視化して結果チャートを描くのに何の問題もありません。

次のステップは「資金管理」ブロックを有効にすることです。そのようは取引中にこのブロックを有効化することは、利益、ドローダウン、取引の都合良さの面で最終結果を大幅に改善するだろうと期待できます。直接、リバースバージョンに、私は I. Kim に習いロット計算のライブラリ呼び出し"b-lots" をインクルードしました。ソースコードに簡単にインクルードでき、ひじょうによく動作しています。:https://www.mql5.com/ja/code/8048

検証中、私はロット計算の比例法(LotsWayChoice=2)を用いました。それは比較的良い利益を伴う合理的な最小ドローダウンを提供してくれます(Ryan Jones 著 "The Trading Game: Playing by the Numbers to Make Millions")。ひじょうに頻繁に大きなドローダウンを伴う大きな利益を示すロット計算のその他の手法と比較しても、結果はきわめて良好です。

2005 年 1 月から 2007 年 5 月までの同じ履歴を見てみます。同一パラメータでの検証結果は前のとおりです。

リバースバージョン:

  • 純利益 +79864
  • 最大ドローダウン 16969 (24%)
  • 相対ドローダウン 33% (3511)

直接バージョン:

  • 純利益 +196520
  • 最大ドローダウン 25801 (12.3%)
  • 相対ドローダウン 18.14% (6972)

以下は残高チャートです。

これらチャートも、現在の損失がリバースバージョンの利益でいかに補われているか、ひじょうに明確に表示しています。そのようは取引の利便性は明らかだと私は思います。

実用

これは、例としてまた今後の第一の実験としてのリバースバージョンのコードで、それはY. Reshetov による Expert Advisor "AI" の私のバリアントの直接バージョンの逆向けに動作するものです。直接バージョンとその説明は以下にあります。:https://www.mql5.com/ja/code/10289

これ以外に、添付ファイルには Expert Advisor の現在の動作(直接、リバース)を視覚的に制御し、どの方向で新規ポジションがオープンするか事前に知ることができるようにするインディケータ パーセプトロン(著者-ウクライナ、クレメンチュグ出身NoName )も入っています。ここでインディケータパーセプトロンの加重係数値 X1~X4 は対応する EA の値に等しく設定します。以下はリバースバージョンの例です。

で作業を始めたばかりの方のために、EA 操作についてできる限りコメントを入れました。このリバースバージョン操作のパーセプトロン出力は左上角のチャートに表示されています。

//+------------------------------------------------------------------+
//|                                 ArtificialIntelligenceRevers.mq4 |
//|                               Copyright й 2006, Yury V. Reshetov |
//|                                Modifed by   Leonid553            |
//|                                  http://www.tradersforum.net.ru/ | 
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499"
#property link      "http://reshetov.xnet.uz/"
//---- input parameters
extern int    x1 = 88;
extern int    x2 = 172;
extern int    x3 = 39;
extern int    x4 = 172;
// StopLoss level
extern double sl = 50;
extern double lots = 0.1;
extern int    MagicNumber = 808;
static int prevtime = 0;
static int spread = 3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
     Comment(perceptron());   
// Wait for the formation of a new candlestick
// If a new candlestick appears, check for the possibility of a trade 
   if(Time[0] == prevtime) return(0);
   prevtime = Time[0];
//----
   if(IsTradeAllowed())
     {
       spread = MarketInfo(Symbol(), MODE_SPREAD);
     }
   else
     {
       prevtime = Time[1];
       return(0);
     }
   int ticket = -1;
   // check for opened position
   int total = OrdersTotal();
   for(int i = 0; i < total; i++)
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       // check for symbol & magic number
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
           int prevticket = OrderTicket();
           // long position is opened
           if(OrderType() == OP_BUY)
              // if a long position is opened and ...
             {
               // check profit 
               // the current profit is larger than the value of =(stoploss + spread) and ...
               if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point))
                 {
                   if(perceptron() > 0)
                     {
                       // perceptron is more than zero, then turn to Sell
                       // reverse
                       ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3,
                         Ask + sl * Point, 0, "AI", MagicNumber,
                                          0, Red);
                       Sleep(30000);
                       if(ticket < 0)
                         {
                           prevtime = Time[1];
                         }
                       else
                         {
                           OrderCloseBy(ticket, prevticket, Blue);
                         }
                     }
                   else 
//if perceptron is less than zero, trail the stoploss to the distance =sl 
//from the current price                 
  {
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(),
                          Bid - sl * Point, 0, 0, Blue))
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }
                     }
                 }
               // short position is opened
             }
           else
             {
               // if a short position is opened and ...
               // check profit 
              if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point))
                 {
                  // the current profit is larger than the value of =(stoploss + spread) and ...
                   if(perceptron() < 0)
                     {
                       // perceptron is less than zero, then turn to Buy
                       // reverse
                       ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3,
                           Bid - sl * Point, 0, "AI", MagicNumber,
                                          0, Blue);
                       Sleep(30000);
                       if(ticket < 0)
                         {
                           prevtime = Time[1];
                         }
                       else
                         {
                           OrderCloseBy(ticket, prevticket, Blue);
                         }
                     }
                   else 
//if perceptron is more than zero, trail the stoploss to the distance =sl 
//from the current price
                   {
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(),
                          Ask + sl * Point, 0, 0, Blue))
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }
                     }
                 }
             }
           // exit
           return(0);
         }
     }
//********************************************************************
   // check for long or short position possibility
   // initial entrance to the market:
 
   if(perceptron() < 0)
     {
       // if the perceptron is less than zero, open a long position :
       // long
       ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0,
                      "AI", MagicNumber, 0, Blue);
       if(ticket < 0)
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
   else
     // if the perceptron is more than zero, open a short position:
     {
       // short
       ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0,
                      "AI", MagicNumber, 0, Red);
       if(ticket < 0)
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
//--- exit
   return(0);
  }
//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron()
  {
   double w1 = x1 - 100.0;
   double w2 = x2 - 100.0;
   double w3 = x3 - 100.0;
   double w4 = x4 - 100.0;
   double a1 = iAC(Symbol(), 0, 0);
   double a2 = iAC(Symbol(), 0, 7);
   double a3 = iAC(Symbol(), 0, 14);
   double a4 = iAC(Symbol(), 0, 21);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }
//+------------------------------------------------------------------+}

しかしながら、説明されている取引戦術の主要な意味はこの特定の Expert Advisor にはないことに注意が必要です。ただ逆に、それは本稿冒頭で説明されているように、すべての適切な Expert Advisor の直接、リバースバージョンの協力にあるのです。そしてここには可能な異なるバリアントがあります。:直接バージョンの初期アルゴリズムに従い、異なる基準で作成され最適化されている、複数のリバースバージョンを手に入れることができます。ここでの選択は極めて広いものです。

この考え方にさらに取り組み、描画サポートとレジスタンスラインを加えようと思います。または、MA インディケータかその他あらゆる適切なインディケータを残高チャートにアタッチします。この場合、インディケータシグナル上である程度、各バージョンにおいてトレードの禁止を行います。それをプログラムすることは可能であると、私は思います。

ですがそれは予想です。



おわりに

懐疑論者の異議を前提とすることは可能です。どちらのバージョンも損失で動作を始めたらどうなるのでしょうか?

まあ、これはめったに起こりません。起こるとすれば例外的なケースです。ただ、それ以上ではありません。『世の中に理想的なものは何もないのです。』とはいうものの、実質的に偶発的なエントリーにおいて、両バージョンがあるインディケータのシグナルについて動作し、逆方向であれば、お互いに逆向けになるのです。

両バージョンを1件の Expert Advisor にコンバインすることで、ポートフォリオ取引のさらなる管理のための効率的なツールを手に入れるのです。そしてさらなる実験のために。

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

添付されたファイル |
AI_REVERS.mq4 (6.98 KB)
MT4TerminalSync - MetaTrader 4 ターミナルの同期のためのシステム MT4TerminalSync - MetaTrader 4 ターミナルの同期のためのシステム
本稿は『オペレーションシステム関数やその他プログラム作成手法を使用してMQL4 プログラムの機能を広げる』がテーマです。1つのソーステンプレートを基に複数のターミナルコピーを同期するタスクを実装するプログラムシステム例について説明します。
効率的な Expert Advisor 操作のための仲介会社の自動選択 効率的な Expert Advisor 操作のための仲介会社の自動選択
効率的な Expert Advisor 操作のために適切な仲介会社を見つける必要がある、ということは秘密ではありません。本稿ではこの検索のシステム的アプローチを説明します。みなさんは異なるターミナルで作業しながら dll によってプログラムを作成する手順に詳しくなることでしょう。
CSV ファイルを介した MetaTrader 4 と Matlab 間の連携 CSV ファイルを介した MetaTrader 4 と Matlab 間の連携
CSV ファイルを介した MetaTrader 4 と Matlab 間のデータ配列交換作成法の段階的手順。
文字列:ASCII シンボルのテーブルとその使用 文字列:ASCII シンボルのテーブルとその使用
本稿では、ASCII シンボルのテーブルとその利用方法を分析します。また、その動作原理が ASCII テーブルの特殊性に基づく新しい関数をいくつか取り上げ、それらをインクルードする新しいライブラリを作成します。それらは別のプログラム言語ではきわめて一般的ですが、埋め込み関数には含まれていないものです。そのほかに、文字列を処理する基本を詳しく考察します。よって、みなさんはこの便利なデータタイプについて、確かに何か新しいことを学ぶこととなるのです。