English Русский 中文 Español Deutsch Português Türkçe
グリッドとマルチンゲール - それらは何でありどのように使用するか

グリッドとマルチンゲール - それらは何でありどのように使用するか

MetaTrader 5トレーディングシステム | 18 1月 2021, 07:54
991 0
Evgeniy Ilin
Evgeniy Ilin

はじめに

本稿では、数学とプログラミングを使用して、これらの戦略を掘り下げ、その収益性を評価します。本稿には、数学セクションと実用セクションがあります。数学セクションでは、戦略のペイオフ期待値を計算するための方程式と多くのトレーダーが考慮していないその他の重要なパラメータのを提示します。実用セクションでは、単純なグリッドとマーチンゲールを開発し、方程式を現実と比較します。これらの戦略は通常最初に遭遇するものなので、本稿は初心者にとって特に役立ちます。これは私にも起こったのですが、それらへの盲目的な信仰は失望と時間の浪費につながる可能性があります。もし数学を知らなかったら、おそらく私はまだそれらを信じていたでしょう。ただし、正しく見れば、これらの戦略には論理的根拠があります。これが私が証明しようとしていることです。


これら2つの戦略の共通点

これら2つの戦略の人気を理解するには、すべての初心者の外国為替トレーダーが何を望んでいるかを見る必要があります。ほとんどの初心者トレーダーは数学者や夢想家であり、自分の知性をもって素早く簡単に金持ちになれると考えています。私もかつてはそんな夢想家でした。これらの戦略は両方とも、ストラテジーテスターでは絶えず上昇するグラフの形をとり、収益性の高い取引の外観を提供します。相場履歴の多くのセグメントで、テスターはフィルターがなくても聖杯のような結果を表示する場合があります。あらゆる活動分野およびあらゆる事業において、より多くの情報に通じた人々があなたを犠牲にして自分自身を豊かにすることができるという危険があります。外国為替取引も例外ではありません。外国為替にはそのような欺瞞的な慣行が多数あり、これらの2つの戦略はその最も例示的で一般的な証拠です。初めて使用すると、これらの戦略が信じられないほどの利益率とペイオフ期待値を備えてすべての通貨ペアで機能し、どのようなスプレッドにも対処できることがわかります。したがって、このアルゴリズムは市場を超えているように思えます。これは、それらが純粋数学に基づいており、論理に基づいていないためです。何年経っても、私は価格の方向性に関係なく常に利益を得ることができるアルゴリズムを見つけたいと思っています。数学者は一般的に興味深い人々です。彼らは、これが現実で本当であるかどうかに関係なく、正しい方程式で何でも証明することができます。一般に、これら2つの戦略は、損益分岐点の錯覚を利用して、それらを使用するように説得します。これらは両方、あらゆる通貨ペアと期間で動作します、むしろ動作するとの錯覚を生み出し、それらの単純さと効率についてあなたを説得します。これらの戦略を掘り下げてみると、遅かれ早かれ、自分が何もわかっていないことに気付くでしょう。ただし、この段階は、合理的に考え始め、市場の本質と実際に使用する必要のある戦略を理解するための唯一の方法であり、必要なものです。


グリッドとその基本方程式

注文グリッドは、あらゆる市場で利益を上げることを目的として作成されました。下降しているか上昇しているかに関わらず、市場にはっきりと見える動きがある場合、この概念によれば、グリッドは巧妙な注文開始システムを使用して注文を開始し、これらの注文はある時点で十分な利益を得て、一度に決済されます。以下の画像でこれを示します。

ここでは、上昇市場と下降市場の2つのオプションをそれぞれ表示しています。グリッド戦略によれば、どのオプションを選択しても勝つはずです。グリッドを使用するトレーダーは常に、最良の価格でトリガーされるため、未決済注文を使用すると言います。これは事実ですが、エントリ時にスプレッドとスリッページを制御できるという事実だけで、成行注文は劣らないと思います。また、エントリを少し延期することもできます。ただし、この戦略では指値注文の方が優れています。注文の基準となる出発点があります。このポイントより上では「s」のステップで買い注文を設定し、それより下では売り注文を設定します。価格がこれらに達すると、これらは成行注文に変わります。この画像は、特定の価格設定状況に基づいて開いている注文を示しています。指値注文は無期限に同じレベルのまま上下するなので、ここに表示しても意味がありません。実際に開いている注文のみが重要です。なぜなら、それらの利益または損失は、それぞれ合計の利益または損失になるからです。利益を確保するには、一部の注文が他の注文より「K」倍大きい必要があります。つまり、K=a/d(ここでK>=K0)を指定する必要があります。К0に達すると、すべてのグリッド注文の合計利益がゼロしきい値を超えます。MetaTrader 4の場合、同じ簡単な方法でポジションまたは注文の現在の利益を計算することもできます。そうしないと、価格がすぐに特定の方向に移動し、価格が「n」ポイント上下した後に利益を得るという状況になります。厳密に言えば、この比率は計算できますが、手動でも簡単に選択できます。可能な計算は次のようになります。

  • Nl=d/s - 1
  • NP=(a+d)/s -1
  • Pr=Sum(1,NP)(s*i)=(s+s*NP)*Np/2
  • Ls=Sum(1,Nl)(s*j+ s*NP)=(s+s*Nl)*Nl/2+s*NP^2

すべての注文の損失または利益を合計すると、これらの合計は等差数列であることがわかります。等差数列の合計を説明する方程式があり(最初と最後の項を使用)、ここで適用されます。

Pr-Ls = 0を考慮して、この方程式を解くと「a」が得られ、K0=a/dの計算が可能になります。さらに、これらの方程式を使用すると、買いポジションと売りポジションを特徴とする取引サイクルの利益率とペイオフ期待値を定義できます。

  • Prf=Pr/Ls 
  • M=(Pr-Ls)/(Np+Nl)

これらの方程式は、グラフ全体ではなく、特定の取引サイクルの利益率とペイオフ期待値を計算します。グラフがサイクルの終了点で終了した場合、利益率は正になります。サイクルは別のグリッドです。グリッドが構築され、可能な限り使用され、ポジションが決済され、新しいグリッドが構築されます。預金が無限の場合、これは無限のプロセスです。バランス曲線上ではおおよそ次のように見えます。


ここでは、履歴を処理するときのグリッドロボットバランスグラフの簡略化された表現を提供しました。預金が十分でグラフが上昇するサイクルがいくつかありますが、これは必然的に、預金が不十分で、目に見える利益がすべてブローカーに行くというサイクルで終わります。数学の観点から、これは未完成のサイクルと見なされます。未完成のサイクルは常に不採算であり、その損失は、最後まで機能したサイクル中に得られたすべての利益と重複します。グリッドを継続するために必要な注文量が得られず、サイクルが未完了になる場合もあります。すべてのブローカーは、ターミナルまたは特定のペアで同時に開かれる注文の数に制限を課します。グリッドを無期限に構築することはできません。できると仮定しても、最終的には上記の結果が得られます。記事の最後に、なぜこれが数学の観点から起こるのかを簡単に説明します。


マーチンゲールとその基本方程式

グリッド同様、マーチンゲールの背後にある考え方は、市場の方向性に関係なく勝つことです。それは同じ永遠の利益の幻想に基づいています。注文を開始して利益が出た場合は、さらに取引を行うだけです。負けが発生するとすぐに、次の注文のロットを負けたポジションに比べて「n」倍に増やします。注文に利益がある場合は決済して、ロットを初期値にリセットするだけです。注文が再び負けていることが判明した場合は、サイクル内のすべての負けポジションのロットの合計に対してロットを「n」倍増やして、前の手順を繰り返します。再び有益な取引ができるまで繰り返します。サイクルの最後の取引は常に収益性があり、その利益は常に取引の損失による損失をカバーします。これは、グラフがサイクルで構成され始める方法です。グラフが最後のサイクルで終了した場合、前向きな期待と利益率が得られます。これらの注文をどこでどのように開くかは重要ではありません。できれば、これらの注文は固定の損益を持つか、固定のストップレベルで終了する必要があります。マーチンゲールロボットのバランスグラフは次のようになります。


ご覧のとおり、マーチンゲールはグリッドと同じように周期的に機能するため、グリッドバランスグラフと非常によく似ています。唯一の違いは、常に1つの注文を開き、決済されるまで待って次の注文を開くことです。グリッドの場合と同様に、遅かれ早かれ、預金はサイクルを終了するのに不十分になり、すべての注文が閉じられ、預金は一掃されます。収益性の高いサイクルを確保するには、最後の取引の利益が前の取引の損失をカバーする必要があります。

  • Nl
  • Np=1
  • Pr=L[Nl+Np]*TP[Nl+Np]*TickSize
  • Ls=Sum(1,Nl)(L[i]*SL[i])*TickSize

ここでは、システムがロットサイズを処理するため、利益はポイントではなくアカウントの通貨単位で計算されます。特定の注文のロットは、再帰を使用して計算されます。

  • L[1]=StartLot
  • for(2,Nl) L[i]=(K*Sum(1,i-1)(L[j]*SL[j]))/TP[i]

ここで、「K」はサイクルに必要な利益係数です。スプレッド、手数料、スワップはここでは考慮されていませんが、これは重要ではないと思います。必要が生じた場合、方程式は簡単に修正できますが、意味がないと思いますマーチンゲール方程式はグリッド方程式に似ています。SLとTPは、注文の得られた損失と望ましい利益です。次の簡単な方程式を解くことで定義を得ることができます: K=(L[i]* TP[i])/Sum(1,i-1)(L[j]*SL[j]).


最も単純なグリッドEAの開発とテスト

上記の仮定をテストするために、MQL5言語で単純なグリッドEAと単純なマルチンゲールを記述してテストし、結果を確認しましょう。グリッドから始めます。まず、ポジションを操作するための便利なクラスをいくつかテンプレートに追加します。

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_position=CPositionInfo();// trade position object
CTrade         m_trade=CTrade();          // trading object

これらの2つのライブラリはデフォルトで常にMetaTrader5に存在するため、コンパイルの問題は発生しません。 

次に、必要なすべての入力について説明しましょう。

///grid variables
input int MaxChannelSizePoints=500;//Max Of a+d
input int MinMoveToClose=100;//Mininum Move
input int GridStepPoints=20;//Grid Step In Points
input int BarsI=999;//Bars To Start Calculate
input double KClose=3.5;//Asymmetry
///

////////minimum trading implementation
input int SlippageMaxOpen=15; //Slippage For Open In Points
input double Lot=0.01;//Lot
input int MagicC=679034;//Magic
/////////

最初のブロックは必要なすべてのグリッドパラメータを実装し、2番目のブロックは最も単純な形式で固定ロットを取引する機能を実装します。

EAを起動するときに、操作が誤って終了した場合に備えて、前のセッションからのグリッドパラメータの検証と回復が必要になります。この機能は任意ですが、事前に実装することをお勧めします。

void DimensionAllMQL5Values()//////////////////////////////
   {
   ArrayResize(Time,BarsI,0);
   ArrayResize(High,BarsI,0);
   ArrayResize(Low,BarsI,0);
   }

void CalcAllMQL5Values()///////////////////////////////////
   {
   ArraySetAsSeries(High,false);                        
   ArraySetAsSeries(Low,false);                              
   ArraySetAsSeries(Time,false);                                                            
   CopyHigh(_Symbol,_Period,0,BarsI,High);
   CopyLow(_Symbol,_Period,0,BarsI,Low);
   CopyTime(_Symbol,_Period,0,BarsI,Time);
   ArraySetAsSeries(High,true);                        
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Time,true);
   }

このコードは、初期分析を完了するために事前定義された配列を実装するために必要です。これらの配列は後では必要ありません。これらは初期計算時にのみ使用します。

回復は次の方法で実行されます。

void RestoreGrid()//recover the grid if the robot is restarted
   {
   DimensionAllMQL5Values();
   CalcAllMQL5Values(); 
   bool ord=PositionSelect(Symbol());
   if ( ord && int(PositionGetInteger(POSITION_MAGIC)) == MagicC )
      {
      GridStartTime=datetime(PositionGetInteger(POSITION_TIME));
      GridStartPrice=double(PositionGetDouble(POSITION_PRICE_OPEN));
      GridUpPrice=GridStartPrice;
      GridDownPrice=GridStartPrice;      
      
      for(int i=0;i<BarsI;i++)
         {
         if ( High[i] > GridUpPrice ) GridUpPrice=High[i];
         if ( Low[i] < GridDownPrice ) GridDownPrice=Low[i];
         if ( Time[i] < GridStartTime ) break;         
         }
      bCanUpdate=true;
      bTryedAlready=false;         
      }
   }

現在のグリッドステータスを追跡するには、グリッドが存在する間の上限価格と下限価格、開始グリッド価格と設定時刻を表示する変数を追加する必要があります。

datetime GridStartTime;//grid construction time
double GridStartPrice;//grid starting price
double GridUpPrice;//upper price within the corridor
double GridDownPrice;//lower price within the corridor

また、価格変動中にグリッド変数を追跡または更新するため、および最初の試行が失敗した場合にグリッドを閉じるための追加の試行のために、2つのブール変数が必要です。

bool bCanUpdate;//whether it is possible to update the grid
bool bTryedAlready;//whether there was an attempt to close a position

開発中のグリッドパラメータの作成と更新は次のようになります。

void CreateNewGrid()//create a new grid
   {
   SymbolInfoTick(Symbol(),LastTick);  
   GridStartTime=TimeCurrent();
   GridStartPrice=LastTick.bid;
   GridUpPrice=GridStartPrice;
   GridDownPrice=GridStartPrice;
    
   double SummUp=LastTick.ask+double(GridStepPoints)*_Point;
   double SummDown=LastTick.bid-double(GridStepPoints)*_Point;
   
   while ( SummUp <= LastTick.ask+double(MaxChannelSizePoints)*_Point )
      {
      m_trade.BuyStop(Lot,SummUp,Symbol());
      SummUp+=double(GridStepPoints)*_Point;
      }
     
   while ( SummDown >= LastTick.bid-double(MaxChannelSizePoints)*_Point )
      {
      m_trade.SellStop(Lot,SummDown,Symbol());
      SummDown-=double(GridStepPoints)*_Point;
      }
   }

void UpdateGrid()//update the grid parameters
   {
   SymbolInfoTick(Symbol(),LastTick);
   if ( LastTick.bid > GridUpPrice ) GridUpPrice=LastTick.bid;
   if ( LastTick.bid < GridDownPrice ) GridDownPrice=LastTick.bid;
   }

以下は、ポジションを決済し、残りの指値注文をクリアするための関数、およびグリッドを閉じるための条件を検出する述語関数です。

void ClosePosition()//close a position by a symbol
   {
   bool ord;
   ord=PositionSelect(Symbol());
   if ( ord && int(PositionGetInteger(POSITION_MAGIC)) == MagicC  )
      {
      if(m_position.SelectByIndex(0)) m_trade.PositionClose(m_position.Ticket());          
      }
   }

void CleanLimitOrders()//clear limit orders
   {
   int orders=OrdersTotal();
   for(int i=0;i<orders;i++)
      {
      ulong ticket=OrderGetTicket(i);
      if(ticket!=0)
         {
         m_trade.OrderDelete(ticket);
         }
      }
   }

bool bCanClose()//closure condition
   {
   if ( GridStartPrice == GridUpPrice && (GridStartPrice-GridDownPrice)/_Point >= MinMoveToClose ) return true;
   if ( GridStartPrice == GridDownPrice && (GridUpPrice-GridStartPrice)/_Point >= MinMoveToClose ) return true;
   
   if ( GridStartPrice != GridUpPrice && GridStartPrice != GridDownPrice 
   && (GridStartPrice-GridDownPrice)/(GridUpPrice-GridStartPrice) >= KClose 
   && (GridStartPrice-GridDownPrice)/_Point >= MinMoveToClose ) return true;
   if ( GridStartPrice != GridDownPrice && GridStartPrice != GridUpPrice 
   && (GridUpPrice-GridStartPrice)/(GridStartPrice-GridDownPrice) >= KClose
   && (GridUpPrice-GridStartPrice)/_Point >= MinMoveToClose ) return true;
   
   /*
   if ( GridUpPrice >= GridStartPrice+MaxChannelSizePoints*_Point 
   //|| GridDownPrice <= GridStartPrice-MaxChannelSizePoints*_Point ) return true;
   */
   return false;
   }

述語関数で最後の条件をコメントアウトしました。価格がグリッドの外に移動した場合にグリッドを閉じます。自由にお使いください。他には何も変わりません。これで、メインの取引関数を作成するだけで済みます。

void Trade()//the main function where all actions are performed
   {
   bool ord=PositionSelect(Symbol());
   
   if ( bCanUpdate ) UpdateGrid();
   
   if ( ord && bCanClose() )//if there is a position and the closing condition is met
       {
       ClosePosition();
       CleanLimitOrders();
       bCanUpdate=false;
       bTryedAlready=true;
       }
   if ( bTryedAlready ) ClosePosition();
          
   if ( !bCanUpdate && !ord )
       {
       CleanLimitOrders();
       CreateNewGrid();
       bCanUpdate=true;
       bTryedAlready=false;
       }
   }

 また、EAを初期化するときに、どこで何を呼び出すか、何をするかを定義しましょう。

int OnInit()
  {
  m_trade.SetExpertMagicNumber(MagicC);//set the magic number for positions
  RestoreGrid();//restore the grid if present
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
  Trade();
  }

グリッドEAを開発したので、テストして、どのように動作するかを見てみましょう。


ご覧のとおり、不採算サイクルに関する仮定が確認されています。最初はグリッドはかなりうまく機能しますが、グリッドが不十分な瞬間が来て、すべての利益を壊滅させる損失サイクルにつながります。トレンド市場セグメントは通常良好な結果を示しますが、損失は主にフラットセグメントで発生します。まだスプレッドがあるため、全体的な結果は常に損失になります。


最も単純なマルチンゲールEAの開発とテスト

グリッドを扱ったので、マーチンゲールEAに移りましょう。そのコードははるかに単純になります。ポジションを操作するには、グリッドEAに適用されているライブラリを使用します。コードを2回提示しても意味がないので、すぐに入力を考えてみることにします。

input int SLE=100;//Stop Loss Points
input int TPE=300;//Take Profit Points
input int SlippageMaxOpen=15; //Slippage For Open In Points
input double Lot=0.01;//Start Lot
input int MagicC=679034;//Magic
input int HistoryDaysLoadI=10;//History Deals Window Days

より簡単にするために、ポジションが決済逆指値または決済指値によって厳密に決済されるシステムを選択しました。最後の変数を使用すると、注文履歴全体を常に読み込むことを回避できますが、必要なウィンドウのみを読み込むことができます(単に最適化のため)。他の変数は自明だと思います。

EAにあるのは次の2つの関数のみです。

double CalcLot()//calculate the lot
   {
   bool ord;
   double TotalLot=0;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for ( int i=HistoryDealsTotal()-1; i>=0; i-- )
      {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if ( ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol 
      && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC 
      && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT )
         {
         if ( HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0 )
            {
            TotalLot+=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            }
         else
            {
            break;
            }
         }
      } 
   return TotalLot == 0 ? Lot: TotalLot;
   }


void Trade()//the main function where all actions are performed
   {
   bool ord=PositionSelect(Symbol());
   SymbolInfoTick(Symbol(),LastTick);
   if ( !ord )
      {
      if ( MathRand() > 32767.0/2.0 )
         {
         m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
         }
      else
         {
         m_trade.Sell(CalcLot(),_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
         }
      }
   }

最初のロットは、取引履歴を確認した後、ポジションを開くために使用される最終ロットを計算するために必要です。最後の取引が不採算である場合、次のロットは、最初の収益性のある取引までの以前の負けた取引のロットの合計に等しくなります。最後の取引が利益を生む場合は、ロットを開始値にリセットします。メインの関数では、ボリュームが最初の関数を使用して計算されている間、ランダムに固定されたストップレベルでさまざまな方向に注文を開きます。これらすべてが正しく機能するためには、初期化中にEAにマジックナンバーを割り当てる必要があります。メイン関数はグリッドと同様にOnTickハンドラで呼び出されます。

最も単純なマーチンゲールの開発はこれで終わりなので、テストして結果を見てみましょう。


ケースはグリッドに似ており、サイクルを見ることができます。マーチンゲールEAは、負けサイクルが始まる直前に機能します。証拠金が不足して次のポジションを開くことができなくなり、損失が発生します。グリッド同様、機能するところとしないところがありますが、常に損失に終わります。両方の戦略を検討したので、これら2つの戦略を理解するだけでなく、より重要な答えに導く数学的結論を導き出すときが来ました。


グリッドとマルチンゲールの背後にある一般的な数学

グリッドとマルチンゲールの背後にある一般的な数学が非常に重要であると私が信じるのはなぜでしょうか。それを完全に理解すれば、信じたいにもかかわらず、利益をもたらすことは決してない一連のアイデア全体についに別れを告げることができます。少なくとも、これらの戦略のパフォーマンスにどのような条件が寄与するかを理解できます。また、純粋なマーチンゲールとグリッドが戦略を失っている理由も理解できます。

どの戦略も、無数の最も単純な戦略で構成されていると想像してみましょう。注文が開かれると、そのうちの1つがアクティブになります。これらの注文が固定の損失または利益で決済されたと想定します。サイズが等しく無限大になる傾向があるC[i]およびLot[i]配列に対応してそれらを配置しましょう。各戦略によって適用されるロットが常に異なると仮定します。また、これらの戦略のいずれかがトリガーされる確率を紹介しましょう。PC [i]です。もちろんこれらのイベントは完全なグループを形成するため、Sum(0,n)(PC[i]) = 1となります。これらのイベントのすべての結果は、新しいイベントスペース S[i]とT[i]を形成します。これらはそれぞれ損失と利益によるアクティブ化を表します。これらのイベントには、独自の条件付き確率PS[i]とPT[i]があり、もちろん、これらも完全なグループを形成します。グラフ表示を以下に示します。

次に、このリストから任意の1つの戦略を検討し、そのペイオフ期待値を計算しましょう。

  • M[i]=(PT[i]*TP-PS[i]*SL)*Lot[i]*TickSize.

ポジション開始ポイントの価格方向がわからない場合は、M[i] = 0とすることができます。ここで、M[i]は、特定の戦略のペイオフ期待値の配列です。言い換えれば、価格がどこに向かっているのかわからない場合、取引の数が無限になりがちであれば、取引方法に関係なく0になります。

一般的なペイオフ期待値の方程式は次のようになります。

  • M0=Sum(0,n)(PC[i]*M[i])

nが無限大になる傾向がある場合、すべてのM[i]はゼロになる傾向があります。つまり、戦略の数が有限の場合は合計のすべての項が0になる傾向があり、取引の数は無限大です。これは、一般的にペイオフ期待値M0がまだ0に等しいことを意味します。さらに考えてみると、無限の数のゼロを合計すると0になるため、このような有限の戦略セットの無限セットもゼロに等しいことがわかります。グリッドの場合、ロットサイズはどこでも同じですが、マーチンゲールの場合は異なりますが、この違いは最終的な期待値にはまったく影響しません。両方の戦略は、組み合わせ論を気にすることなく、この一般的な方程式を使用して説明できます。すべてが非常にシンプルで簡単です。

これらの戦略はこの方程式を使用して記述できるため、どの戦略でも機能します。これには、取引量の変動と操作を含むすべての戦略、および複雑な注文を出して決済するシステムは、取引の開始時と終了時の移動方向、または少なくともいくつかの時点でのおおよその補助的な市場パラメータがわからない場合は失敗する運命にあるという結論が伴います。正しい予測がなければ、ここでのすべての努力は時間とお金の無駄になります。


グリッドとマルチンゲールを正しく使用する方法

グリッドは、今後の市場の特定の方向への動きがわかる場合、またはそのようなイベントの可能性が高い場合に役立つ可能性がありますが、ギャップのリスクもあります。ギャップとグリッドはあまりうまく混ざりません。これは、注文が特定のステップで行われ、次のティックがすべての注文を超え、グリッドをはるかに超えて表示される場合があるためです。もちろん、これはまれなケースですが、必然的にシステムのパフォーマンスが低下します。グリッドサイズは、予測された動きと同じかわずかに小さく設定する必要がありますが、動きの方向を知る必要はなく、その概算値のみを知る必要があります。以下は、トレンド検出アルゴリズムが成功した場合のバランスグラフの外観です。


トレンドを事前に定義できるとは限りません。これはしばしばサイクルの損失につながり(上で赤でマーク)、ドローダウンも非常に大きくなります。グリッドは、大きな動きを検出する方法を持つ人には役立つかもしれません。この場合、グリッドはカスタムシグナルに基づくことができます。私はまだこの質問に答えていないので、どなたかが強い動きを検出するための優れたアルゴリズムをお持ちの場合は、経験を自由にご共有ください。

それでは、マーチンゲールについて考えてみましょう。ペイオフ期待値が「0」のシグナルがあるが、損失のシーケンスが、連続した特定の数の損失に対して収益性の高い取引の確率が1に近いことがわかっている場合、シグナルはマーチンゲールに使用されることができます。バランスグラフは次のようになります。

しかし、私は個人的にマーチンゲールはどんな場合でも危険だと信じています。説明したような条件を達成することはほとんど不可能だと思いますが、グリッドの場合はより簡単で、最も重要なことに、より明確に見えます。


終わりに

本稿では、これら2つの戦略をできるだけ明確に説明し、それらの類似点、長所、短所を強調しました。初心者にとっても説明はわかりやすいと思います。本稿は主に初心者のトレーダーを対象としていますが、導き出された結論は、戦略とその適用の限界を単純に評価するよりもはるかに重要です。ここで提供される一般的な数学的結論により、誰もが独自の取引システムを開発しながら時間を効率的に使用することができます。記事自体は市場の物理学を理解するのに新しいことは何ももたらしませんが、多くのトレーダーがこれらの原則を自分の利益のために無意識に悪用するのを防ぐことができると思います。

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

添付されたファイル |
Easy_Grid.mq5 (14.27 KB)
Uncle_Martin.mq5 (6.47 KB)
TDシーケンシャルと一連のMurray-Gannレベルを使用したチャートの分析 TDシーケンシャルと一連のMurray-Gannレベルを使用したチャートの分析
TDシーケンシャル(トーマス・デマークのシーケンシャル)は、価格変動のバランスの変化を示すのが得意です。これは、そのシグナルをレベル指標(Murreyレベルなど)と組み合わせると特に明白になります。本稿は、主に初心者や「聖杯」を見つけることができない人を対象としています。また、他のフォーラムでは見たことのないレベル構築の機能をいくつか提示するので、おそらく上級トレーダーにも役立つでしょう... 提案や合理的な批判は大歓迎です...
DoEasyライブラリの時系列(第57部): 指標バッファデータオブジェクト DoEasyライブラリの時系列(第57部): 指標バッファデータオブジェクト
本稿では、1つの指標に対して1つのバッファのすべてのデータを含むオブジェクトを開発します。このようなオブジェクトは、指標バッファのシリアルデータを格納するために必要になります。その助けを借りて、任意の指標のバッファデータ、および他の同様のデータを相互に並べ替えて比較できるようになります。
ニューラルネットワークが簡単に(第5回): OPENCLでのマルチスレッド計算 ニューラルネットワークが簡単に(第5回): OPENCLでのマルチスレッド計算
ニューラルネットワークの実装のいくつかのタイプについては、これまで説明してきました。 これまで考慮されたネットワークでは、各ニューロンに対して同じ操作が繰り返されます。 さらに論理的な進展としては、ニューラルネットワークの学習プロセスを高速化するために、現代の技術が提供するマルチスレッドコンピューティング機能を利用することです。 可能な実装の1つは、この記事で説明しています。
DoEasyライブラリの時系列(第56部):カスタム指標オブジェクト、コレクション内指標オブジェクトからのデータ取得 DoEasyライブラリの時系列(第56部):カスタム指標オブジェクト、コレクション内指標オブジェクトからのデータ取得
本稿では、EAで使用するためのカスタム指標オブジェクトの作成について検討します。ライブラリクラスを少し改善し、EAの指標オブジェクトからデータを取得するメソッドを追加しましょう。