取引ロボットコードの取引戦略の頭または尾の分析。(Heads or Tails)

取引ロボットコードの取引戦略の頭または尾の分析。(Heads or Tails)

21 1月 2026, 12:05
Vladimir Pastushak
0
3

取引戦略「ヘッドまたはテール」は、主に株式市場とフォレックス市場で使用される高リスクの短期取引アプローチのカテゴリーに属します。その名前は、決定のランダム性に由来し、コインを投げることに似ています(「ヘッド」は資産を購入し、「テール」は売却します)。この戦略は、直感的な決定またはランダムなシグナルに基づいており、市場分析の基本的な要素を無視しています。


コードベースに取引戦略のソースコードが追加されました:

MetaTrader 5: https://www.mql5.com/ja/code/11637


#property copyright "Copyright 2025, Trading-Go." // Setting copyright property
#property link      "https://www.mql5.com/en/channels/tradingo-go-en"  // Setting developer resource link
#property version   "26.010" // Program version

上記のコードは、MQL4/MQL5言語で記述されたMetaTrader Expert Advisor (EA)またはインディケーターのプログラムのコンパイラー指令です。

各行を個別に説明します:

1. #property copyright "Copyright 2025, Trading-Go."

この行は、EAまたはインディケーターのソースコードの法的な所有権を設定します。著作権者を定義し、製品の所有権を特定の組織または個人(「Trading-Go」)に割り当てます。この情報は、MetaTraderのクライアント端末のEA/インディケーターのプロパティウィンドウに表示されます。

2. #property link " "

この行は、開発者のWebリソースへのリンクを設定します。トレーダーがこのEAまたはインディケーターを使用すると、このリンクはツールのプロパティで利用可能になります。これは、開発者にとって便利です。これにより、ユーザーを製品に関連するサポート、ドキュメント、コミュニティのページにリダイレクトすることができます。

3. #property version "26.010"

ここで、ソフトウェア製品のバージョンが設定されます。通常、開発者は「XX.Trade\Trade.mqh> // Including Trade.mqh library CTrade        trade; // Object of class CTrade to manage trades #include // Including PositionInfo.mqh library CPositionInfo posit; // Object of class CPositionInfo to process positions

このコードブロックは、MetaTraderの取引プラットフォームで取引操作とポジションを管理するためのクラスオブジェクトを作成し、ライブラリを含みます。

各行を詳細に説明します:

1. #include

これは、Trade.mqhファイルを含むインクルード指令です。このファイルは/Tradeディレクトリにあり、MetaTraderが提供する標準の取引操作ライブラリに属しています。CTradeクラスは、取引との相互作用を簡単にするために使用されます。ポジションの開設、取引の終了、注文の変更、取引状態の情報の取得などを含みます。

2. CTrade trade;

CTradeクラスのオブジェクトがtradeという名前で作成されます。このオブジェクトは、新しいポジションの開設、ストップロスやテイクプロフィットの設定、既存のポジションの終了、取引プロセスに関連する多くの操作を含む取引のすべての側面を管理することができます。

3. #include

これは、PositionInfo.mqhファイルを含む2番目のインクルード指令です。このファイルは、/Tradeディレクトリにあり、CPositionInfoクラスの定義を含みます。このクラスは、アカウントの現在の開いたポジションに関する情報を処理するために使用されます。このクラスを通じて、各開いた取引の詳細な情報、取引量、オープン価格、利益/損失などを抽出することができます。

4. CPositionInfo posit;

CPositionInfoクラスのオブジェクトがpositという名前で作成されます。このオブジェクトを使用すると、トレーディングアカウントのすべてのアクティブなポジションに関する詳細な情報をリクエストすることができます。これは、ポートフォリオの現在の状態を分析し、取得した情報に基づいて決定を下すのに役立ちます。

ブロックの一般的な目的:

このブロックは、高レベルAPI(アプリケーションプログラミングインターフェイス)を提供することにより、取引プロセスの自動化の基礎を提供します。作成されたtradeとpositオブジェクトを使用して、取引決定の自動化、ポジションの監視、ルーティン操作の自動化を実装することができます。

これらの2つのライブラリは、ブローカーサーバーとの低レベルの相互作用に集中するのではなく、直接戦略の論理に集中することができる複雑な自動取引アルゴリズムの開発を簡単にすることができます。

input double  iLots         = 0.10; // Input parameter for lot size (trade volume)
input int     iTakeProfit   = 450;  // Input parameter for profit fixing level (Take Profit)
input int     iStopLoss     = 390;  // Input parameter for loss limitation level (Stop Loss)
input int     iMagicNumber  = 227; // Input parameter for unique deal number (Magic Number)
input int     iSlippage     = 30; // Input parameter for maximum price slippage

string sy = ""; // Variable to store instrument symbol
double pt = 0; // Variable for point calculation step
int    dt = 0; // Variable for decimal places count

MetaTraderの取引プラットフォームで自動エキスパート(Expert Advisor)を設定するための上記のコードブロックの各要素を個別に説明し、その目的と役割を説明します。


入力パラメータ(Input Parameters):

1. iLots = 0.10;

これは、double型の入力パラメータで、ロットサイズ(取引量)を定義します。デフォルト値は0.10に設定されています。ロットサイズは、1つの取引で購入または売却される資産の量を調整します。例えば、インストゥルメントがEURUSDの場合、0.1ロットは10,000単位の基本通貨(例えば、ユーロ)に相当します。

2. iTakeProfit = 450;

int型のパラメータで、利益確定レベル(Take Profit)を指定します。デフォルト値は450です。Take Profitは、市場価格が取引のエントリー価格に対して指定された利益レベルに達した場合に自動的にポジションを閉じます。レベルはポイント(pips)で指定されます。

3. iStopLoss = 390;

int型のパラメータで、損失制限レベル(Stop Loss)を設定します。デフォルト値は390です。Stop Lossは、市場がポジションに対して不利益に動いて損失が指定されたレベルに達した場合に自動的にポジションを閉じます。損失はポイントで固定されます。

4. iMagicNumber = 227;

int型のパラメータで、取引の固有の識別番号(Magic Number)を提供します。各イベント(ポジションの開設、終了など)は、この番号を使用して取引をフィルタリングすることができます。デフォルト値は227です。

5. sy = "";

string型の変数で、取引に使用される金融商品のシンボル(例えば、"EURUSD")を格納します。最初は空の文字列("")です。

2. pt = 0;

double型の変数で、特定のインストゥルメントのポイントサイズを計算するために使用されます。ポイント数に基づいてTake ProfitとStop Lossのレベルを計算するために使用されます。デフォルトは0です。

3. dt = 0;

int型の変数で、選択されたインストゥルメントの価格の小数点以下の桁数をカウントします。小数点以下の桁数は、利益とストップロスの計算、および他のメトリックを正しく計算するために重要です。初期値は0です。

このコードブロックは、MetaTraderで自動エキスパートを設定するための初期設定を行い、取引を開始する直前にEAの振る舞いを柔軟に設定するために使用されます。

   sy = _Symbol; // Getting current trading instrument
   pt = _Point; // Getting minimum unit change size
   dt = _Digits; // Getting number of decimal digits in price

   trade.SetExpertMagicNumber(iMagicNumber); // Setting unique deal number for trade operations

   trade.SetDeviationInPoints(iSlippage); // Setting maximum price deviation points

   trade.SetTypeFillingBySymbol(sy); // Setting order execution type according to instrument settings

   trade.SetMarginMode(); // Setting margin mode


このコードブロックは、MetaTraderの自動エキスパート(Expert Advisor)での取引操作の初期化と設定を示しています。EAの正常な動作のための条件を準備するために、各演算子が重要な役割を果たします。

各式を詳細に説明します。

環境変数:

1. sy = _Symbol;

EAが取引している現在の金融商品の名前を、グローバル変数syに割り当てます。_Symbolは、端末で選択されたアセットの名前を返す組み込み定数です。これにより、後の計算と処理に必要なインストゥルメントの名前にアクセスできます。

2. pt = _Point;

変数ptに、インストゥルメントの価格の最小変化単位(_Point)を割り当てます。これは、システムの信号を正しく解釈し、注文を調整するために必要な価格変化の基本単位です。

3. dt = _Digits;

変数dtに、現在のインストゥルメントの価格の小数点以下の桁数を割り当てます。USDJPYは2桁、EURUSDは4桁など、異なるインストゥルメントには異なる小数点以下の桁数があります。この変数は、数値の正しい丸めと計算に重要です。


取引オブジェクトの設定:

4. trade.SetExpertMagicNumber(iMagicNumber);

このEAによって開始されたすべての取引に固有のマジックナンバー(Magic Number)を設定します。マジックナンバーは、特定のEAによって実行された取引を識別し、この基準によってポジションをフィルタリングすることができます。ナンバーの一意性は、異なるロボット戦略間の混乱を防ぎます。

5. trade.SetDeviationInPoints(iSlippage);

注文の実行価格と期待される価格との最大のズレをポイントで設定します。これにより、市場の大きな変動から保護されます。ポイントでの値を設定することで、価格が大きく変動した場合に取引が実行されないようにします。値が小さいほど、リクエストの実行が正確になります。

6. trade.SetTypeFillingBySymbol(sy);

インストゥルメントの特性に応じて、注文の執行タイプを設定します(_Symbol)。一部のインストゥルメントは即時執行(「Market Execution」)を必要とし、他のインストゥルメントは即時執行(「Instant Execution」)を許容します。このコマンドは、シンボルの仕様に従って、正しいモードを自動的に選択します。

7. trade.SetMarginMode();

EAのマージンモードを設定します。マージンの管理方法は、インストゥルメントと取引モードによって異なります。マージンの正しい設定は、ポジションを維持するために必要な資金の量に影響し、資金不足による強制的なポジションの終了を最小限に抑えます。

   double stepvol = SymbolInfoDouble(sy, SYMBOL_VOLUME_STEP); // Get the lot size change step for the selected symbol
   if(stepvol > 0.0) // If the lot size step is positive, apply calculation of adjusted lot size
      lt = stepvol * (MathFloor(iLots / stepvol) - 1); // Round down the lot size to the nearest step value and decrease by one step
//---
   double minvol = SymbolInfoDouble(sy, SYMBOL_VOLUME_MIN); // Get minimum allowed lot size for the specified symbol
   if(lt < minvol) // If the adjusted lot size is less than the minimum possible value, reset it to zero
      lt = 0.0;

   ::MathSrand(GetTickCount()); // Generating initial number for random generator

上記のコードブロックは、特定のインストゥルメント(通貨、株式、契約など)の取引量(ロット)を動的に調整します。主な目的は、取引所が許可する範囲内でロットサイズを設定し、ポジションの開設時のエラーを防ぎ、取引の安全性を確保することです。

各ステップを詳細に説明します:

1. 体積の変化ステップの決定:

double stepvol = SymbolInfoDouble(sy, SYMBOL_VOLUME_STEP);

SymbolInfoDouble()関数は、選択されたシンボルのロットサイズの変化ステップ(SYMBOL_VOLUME_STEP)を取得します。ステップは、ロットサイズを変更できる最小の間隔を定義します。例えば、一部の金融商品では、ステップが0.01であり、取引はロットの100分の1単位でのみ可能です。

2. ステップのポジティブ性の確認:

if(stepvol > 0.0)

ロットサイズのステップが実際にポジティブであるかどうかを確認します。ステップがゼロまたは負の場合、後続の計算は意味を持ちません。

3. 1ステップの減少とロットの丸め込み:

lt = stepvol * (MathFloor(iLots / stepvol) - 1);

トレーダーが指定した取引量(iLots)を1つの最小ステップ減少します。

式内で次のような処理が行われます:

iLots / stepvol:指定されたロットに収まるステップの整数の数を計算します。

MathFloor():小数値を最も近い整数に丸めます。

1を引きます:ステップの数を1つ減らします。

ステップを再度乗算します:新しい調整されたロットサイズを取得します。

4. 最小可能なロットの取得:

double minvol = SymbolInfoDouble(sy, SYMBOL_VOLUME_MIN);

SYMBOL_VOLUME_MINを使用して、指定されたシンボルの最小許可ロットサイズを取得します。取引所は、この以下の取引を許可しません。

5. 最小限の境界の確認:

if(lt < minvol)

   lt = 0.0;

減少後のロットサイズが取引所によって設定された最小値よりも小さい場合、値をゼロにリセットします。これにより、ロボットが最小許容ロットサイズよりも小さい注文を送信しようとすることを防ぎます。

6. 乱数ジェネレータの初期値の生成:

::MathSrand(GetTickCount());

乱数関数を後で使用するための初期値を生成します。GetTickCount()関数は、現在のティックカウンターの値を取得し、それを後続の乱数シーケンスの種として使用します。これにより、乱数プロセスの結果の予測不能性が高まります。

   int total = ::PositionsTotal(), b = 0, s = 0; // Total open positions and purchase/sale counters

   double Bid = ::SymbolInfoDouble(sy, SYMBOL_BID); // Current bid price (selling price)
   double Ask = ::SymbolInfoDouble(sy, SYMBOL_ASK); // Current ask price (buying price)

   double new_sl = 0, new_tp = 0, old_sl = 0, old_tp = 0; // New and old stop loss and take profit levels

   if(Bid <= 0 || Ask <= 0) // If prices are incorrect
      return; // Exit function

上記のコードブロックは、MetaTraderの自動エキスパート(Expert Advisor)での取引の追加のロジックを実行する前に、一連の重要な準備操作を実行します。各段階を詳細に説明します。

変数の初期化:

1. 開いたポジションの総数の取得:

int total = ::PositionsTotal();

PositionsTotal()関数は、アカウントの開いたポジションの総数を返します。これらのデータは、後の分析とポジションの最適化に重要です。

2. 購入と売却のカウンターの初期化:

b = 0, s = 0;

変数bとsは、それぞれロング(buy)とショート(sell)の開いたポジションの数をカウントするために使用されます。最初は0にリセットされ、後でポジションを分析する際に増加します。


現在の市場価格の取得:

3. BID価格(売却価格)のリクエスト:

Bid = ::SymbolInfoDouble(sy, SYMBOL_BID);

SymbolInfoDouble()関数は、現在のインストゥルメント(sy)の最新の購入価格(BID)を取得します。BID価格は、トレーダーがインストゥルメントを即座に売却できる最高の市場価格を反映します。

4. ASK価格(購入価格)のリクエスト:

Ask = ::SymbolInfoDouble(sy, SYMBOL_ASK);

同様に、インストゥルメントの最新の売却価格(ASK)を取得します。ASK価格は、インストゥルメントを即座に購入できる最低の価格を示します。

ストップロスとテイクプロフィットのレベルの準備:

5. 新しいと古いストップロスとテイクプロフィットのレベルの宣言:

new_sl = 0, new_tp = 0, old_sl = 0, old_tp = 0;

将来の計算とストップロスとテイクプロフィットのレベルの比較のための変数の事前初期化です。ゼロの値は、プログラム内で後のロジックが実行されるまでレベルが設定されていないことを示します。

価格の正しさの確認:

6. 取得した価格の正しさの確認:

if(Bid <= 0 || Ask <= 0)

   return;

不正な価格が存在するかどうかを確認する単純なチェックが行われます。BIDまたはASK価格がゼロまたは負の場合、プログラムは現在のルーチンを終了(return)し、誤った操作を防ぎます。これは、不正なデータによる不都合を防ぐための保護です。

 for(int i = 0; i < total; i++) // Loop through open positions
      if(posit.SelectByIndex(i)) // Select position by index
         if(posit.Symbol() == sy) // Check instrument of position
            if(posit.Magic() == iMagicNumber) // Check unique number of position
 StopLoss(),   dt); // Converting old stop loss to required decimal places
               old_tp = ::NormalizeDouble(posit.TakeProfit(), dt); // Converting old take profit to required decimal places

               if(posit.PositionType() == POSITION_TYPE_BUY) // If position is BUY (purchase)
                 {
                  new_sl = ::NormalizeDouble(Ask - iStopLoss   * pt, dt); // New stop loss below current ask