English Русский 中文 Español Português
preview
FX裁定取引:合成マーケットメーカーボット入門

FX裁定取引:合成マーケットメーカーボット入門

MetaTrader 5トレーディングシステム |
19 17
Yevgeniy Koshtenko
Yevgeniy Koshtenko

はじめに:個人トレーダーから機関投資家思考へ

どのようにしてTrisWeb_Optimizedを開発するに至ったのかとよく聞かれます。話は2016年にさかのぼります。当時、私はFXの世界に飛び込み、初心者らしい無邪気さと、指標トレードへの信頼を胸に抱いていました。当時はまだ、1年で$1,000を$1,000,000に変える魔法の指標の組み合わせがあると信じていたのです。

私の考え方に革命が起きたのは2017年です。連続する痛い損失の後、私は大口投資家が実際にどのように取引しているのかを学び始めました。ここでいう大口投資家とは、YouTubeで「百万ドル稼いだ」と語る人々ではなく、銀行、ヘッジファンド、プロップファーム(自己勘定取引会社)などの本物の機関です。

そして気づいたのは、彼らは派手な指標戦略を使わないということです。彼らは数学的原理、リスク管理、裁定取引、マーケットメイク、その他市場メカニズムの根本的理解に基づくアプローチを実践しています。その時私は、大口投資家のように取引するか、取引をやめるかだと決心しました。

その後の3年間、私は機関投資家の手法を徹底的に学びました。インターマーケット相関、統計的裁定取引、アルゴリズム取引の世界に没頭し、PythonやMQLを駆使してプロトタイプシステムを作成しました。これらは大口投資家のアプローチを模倣しつつ、個人トレーダーの資金や技術的制約に適合させたものでした。

2020年1月、金融市場史上最も激動の時期の前夜に、Tris_Optimizedは誕生しました。これは、「個人トレーダーが機関投資家の戦略をどのように応用できるか」という問いへの私の答えです。

このEA(エキスパートアドバイザー)は、市場の動きを予測したり、テクニカル指標に依存したり、直感を必要とすることはありません。代わりに、3つの関連する通貨ペア間の潜在的な不均衡を数学的に計算し、その不均衡が発生した際に捉えられるように注文のグリッドを配置します。

5年間にわたる実際の市場での連続運用で、Tris_Optimizedはその有効性を証明しました。パンデミック、インフレの急騰、金利変動、地政学的危機を乗り越え、現在も安定した利益を生み出し続けています(コードのアイデアや実際のコードを夜通し見直すことの方が多く、実際に取引するのは稀ですが)。これは、途方もないリターンを約束するような奇跡的なシステムではなく、機関投資家の原則に基づく堅実なツールです。

今日、この機関投資家思考の基盤により、私はさまざまな市場での取引に成功できています。近年は機械学習戦略に注力していますが、裁定取引手法は常に私の取引の重要な一部です。ML統計手法と、機関投資家が用いる市場パターンを組み合わせることで、大きなアドバンテージを得られています。実際、私は小規模であまり知られていないヘッジファンドに招かれました。ファンドには私以外にリスクマネージャーと管理者がおり、MetaTrader 5ベースのヘッジファンドインフラの立ち上げ準備を進めているところです。

数週間前、クラウドストレージを整理していたところ、過去の自動売買ロボットのアーカイブを見つけました。その中にTris_Optimizedもありました。これは私の最初のプロジェクトのひとつで、現代の機械学習システムと比べると「シンプル」ではありますが、現在でも動作し、成果を上げ続けています。テスト口座で稼働させてみたところ、現状の市場条件に最適化されていなくても、プラスの結果を示して驚きました。

そこで、このコードをコミュニティと共有することに決めました。これが1か月で億万長者にしてくれるような革命的なシステムだからではなく、このコードが個人トレーダーとして機関投資家的アプローチを取引に応用する良い例だからです。これは2つの世界をつなぐ橋のようなもので、私がかつて経験したのと同じ移行を実現する手助けとなります。

この記事では、TrisWeb_Optimizedの仕組みを明らかにし、アーキテクチャを解説し、設定や最適化に関する私の経験を共有します。プロのアルゴリズム取引の世界に飛び込む準備はよろしいでしょうか。それでは始めましょう。


3通貨ペアのFX裁定取引:EURUSD-GBPUSD-EURJPYの三角形

まず、FXにおける三角裁定取引が実質的には幻を追うようなものであることを理解してください。次のような状況を想像してみてください。あなたは同時にEURUSD、GBPUSD、EURJPYを監視し、短時間の価格不均衡を捉えようとしています。EUR→USD→GBP→EURという閉じたループで、少なくとも数ピップスの純利益を得られる瞬間を狙うのです。しかし現実には、純粋な裁定取引の機会は、モスクワ市内のユニコーンほど珍しいものです。高頻度アルゴリズムと流動性への直接アクセスを持つ機関投資家は、瞬きする間もなくこうした機会を食い尽くしてしまいます。

だからこそ私はTrisWeb_Optimizedを作りました。理想的な条件を待つのではなく、自然な市場変動から利益を捕らえるために、3次元的な注文ネットワークを構築するEAです。これは学術的な意味での古典的裁定取引ではなく、3つの通貨ペア間の数学的関係を利用する、個人トレーダーのゲリラ戦略です。


MQL5における合成通貨ペア:裁定取引への秘密の扉

合成通貨ペアとは何でしょうか。それは幻のような存在であり、実際に取引される通貨ペアから構築する数学的な抽象概念です。例えば、EURUSDとGBPUSDのレートがあれば、理論上、正確に実際のEURGBPと一致するはずの合成EURGBPを計算することができます。しかし現実世界では常に誤差が存在し、それこそが私たちの日々の糧となります。

TrisWeb_Optimizedは合成通貨ペアを明示的に作成するわけではありませんが、その見えない糸を利用して取引をおこないます。以下は、各銘柄の現在価格を取得するコードの一部です。これは、不均衡を探す第一歩です。

// Get the current prices for each symbol
double priceSymbol1 = GetCurrentPrice(Symbol1);
double priceSymbol2 = GetCurrentPrice(Symbol2);
double priceSymbol3 = GetCurrentPrice(Symbol3);

これら3つの値は、多次元の可能性の空間への入り口です。わずかな価格のずれが、現実の利益に変わる瞬間がここにあります。


TrisWeb_Optimizedのアーキテクチャ:パンデミックを生き延びたマシン

2020年1月にTrisWeb_Optimizedの最初のコードを書いたとき、世界はパンデミック、相場の混乱、そして途方もないボラティリティの瀬戸際にありました。このシンプルなEAが、数十年に一度の極端な市場環境の洗礼を受けることになるとは、誰も予想できなかったでしょう。そしてご存じの通り、TrisWeb_Optimizedは生き延びました。さらに言えば、そこで成長さえしました。

システムの心臓部はOnTick()関数にあります。この関数は価格が変動するたびに呼び出され、3つの通貨ペアすべてを同時に分析します。

void OnTick()
{
   // Calculate orders and profits
   int ordersCount1 = 0, ordersCount2 = 0, ordersCount3 = 0;
   double profit1 = 0, profit2 = 0, profit3 = 0;
   
   // Count pending orders
   CountPendingOrders(ordersCount1, ordersCount2, ordersCount3);
   
   // Calculate open positions and their profit
   CountOpenPositions(ordersCount1, ordersCount2, ordersCount3, profit1, profit2, profit3);
   
   // ... rest of the code
}

一見すると普通のコードのように見えます。しかし、これらの行の背後には洗練されたモジュール型アーキテクチャがあります。システムの各要素は、よく調整された生物の臓器のように、別々の関数として独立しています。混乱もなく、無秩序もなく、責務が明確に分割されています。


グリッドパラメータの調整:ボラティリティとのダンス

FXは海のようなものです。EURUSDは深い海流のようにゆったりと流れ、EURJPYは突然の津波のように暴れます。同じパラメータでこれらの通貨ペアを取引しようとすることは、失望への確実な道です。だからこそ、TrisWeb_Optimizedでは、各通貨ペアごとにグリッドパラメータをカスタマイズできるようになっています。

input group "Step Settings"
input int Step01_Symbol1 = 40;      // Initial step for Symbol1 (in points)
input int Step02_Symbol1 = 60;      // Step between orders for Symbol1 (in points)
input int Step01_Symbol2 = 40;      // Initial step for Symbol2 (in points)
input int Step02_Symbol2 = 60;      // Step between orders for Symbol2 (in points)
input int Step01_Symbol3 = 40;      // Initial step for Symbol3 (in points)
input int Step02_Symbol3 = 60;      // Step between orders for Symbol3 (in points)

このシステムを使い始めてからの5年間で、私は独自の儀式を編み出しました。EURUSDのような穏やかな通貨ペアには、標準的なステップ40と60を使用し、対照的に激しいJPYクロスには50と80に増やします。まるで釣り竿の感度を魚の種類に応じて調整するようなものです。同じアプローチでは、すべてを釣り上げるか、何も釣れないかのどちらかになります。


ロットサイズの最適化:適応型システムのDNA

固定ロットは初心者のやり方です。プロフェッショナルは、取引量は口座残高とともに呼吸する必要があると知っています。TrisWeb_OptimizedはこれをCalculateOptimalLotSize()関数により実現します。私はこれを自分の小さな傑作だと考えています。

double CalculateOptimalLotSize(string symbol, double baseSize)
{
   if(!AutoLotOptimization)
      return baseSize;
      
   double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   // ... the rest of the calculation code
}
この機能はまさにスイスアーミーナイフのような存在です。現在の口座残高、設定されたリスク割合、特定銘柄のピップ価値、ブローカーの最小ロットサイズやステップの制限を考慮するだけでなく、エキゾチック通貨に対しても自動で計算を調整します。これが私の特別な誇りです。
// Adjustment for pairs with JPY and other exotic currencies
string quoteCurrency = StringSubstr(symbol, 3, 3);
if(quoteCurrency == "JPY" || quoteCurrency == "XAU" || quoteCurrency == "XAG")
   pointCost *= 100.0;

初心者向けの注意点として、JPYを含む通貨ペアのピップ価値は、主要通貨ペアの100分の1であることを覚えておいてください。この調整を忘れると、ロボットは極小の取引量でしか動作しないか、あるいは一回のセッションで口座を破壊してしまうことになります。


EAの稼働時間管理:時間帯制御アルゴリズム

FX市場は24時間稼働していますが、だからといってEAも同じように動くべきではありません。時には身を引くのが最適な時間帯があります。スプレッドが広く、非自然な値動きが起こりやすい夜間セッションは、チャンスよりも問題をもたらすことが多いのです。TrisWeb_Optimizedには、IsWorkTime()関数による組み込みの「時間帯」があります。

bool IsWorkTime()
{
   MqlDateTime currentTime;
   TimeToStruct(TimeLocal(), currentTime);
   
   datetime currentTimeSeconds = HoursMinutesToSeconds(currentTime.hour, currentTime.min);
   datetime startTimeSeconds = HoursMinutesToSeconds(StartTimeHour, StartTimeMin);
   datetime endTimeSeconds = HoursMinutesToSeconds(EndTimeHour, EndTimeMin);
   
   return (startTimeSeconds <= currentTimeSeconds && currentTimeSeconds <= endTimeSeconds);
}
CheckNewDayAndWorkTime()関数は、EAにもう1つ人間らしい特性を加えます。毎日、新たに白紙の状態でスタートする能力です。
void CheckNewDayAndWorkTime()
{
   if(IsNewDay && IsNewDayReset && IsWorkTime())
   {
      DeleteAllOrders();
      IsNewDay = false;
   }
   
   if(!IsWorkTime())
   {
      IsNewDay = true;
   }
}

これは長期的に特に価値があります。システムは古い注文のバックログを溜め込むことなく、常に現在の市場状況に応じてグリッドを更新し続けます。


ポジションの決済アルゴリズム:タイミングよく退場する技術

取引においても人生においても、重要なのはエントリーのタイミングだけでなく、適切なタイミングでエグジットすることです。TrisWeb_Optimizedは、シンプルながら効率的な基準を使用します。それは、設定された総利益の水準に到達したときです。

// Total number of orders
int totalOrders = ordersCount1 + ordersCount2 + ordersCount3;
double totalProfit = profit1 + profit2 + profit3;

// If there are no orders, create them; if there are, check for profit.
if(totalOrders == 0)
{
   if(IsWorkTime())
   {
      PlaceInitialOrders();
   }
}
else if(totalProfit > Profit)
{
   DeleteAllOrders();
}
しかし、悪魔は常に細部に潜んでいます。システムは「単純な」利益だけでなく、スワップや手数料を含めた総合的な結果を考慮します。
double swap = PositionGetDouble(POSITION_SWAP);
double profit = PositionGetDouble(POSITION_PROFIT);
double commission = PositionGetDouble(POSITION_COMMISSION);
double totalProfitForPosition = profit + swap + commission;

これは長期的なパフォーマンスにとって非常に重要です。特にポジションをオーバーナイトで保有する場合、スワップが発生するためです。これを無視すると、実際には利益をもたらさない組み合わせを利益ありと判断したり、逆に利益のある組み合わせを見逃す可能性があります。


注文執行の微調整:市場の悪魔との契約

高頻度取引の世界では、執行の質が利益と損失の差を生むことがあります。TrisWeb_Optimizedは、注文の発注・執行プロセスを最大限にコントロールするために、低レベルのMQL5構造体を使用しています。

bool OpenBuyStop(string symbol, double volume, double openPrice)
{
   MqlTradeRequest request = {};
   MqlTradeResult result = {};
   
   request.action = TRADE_ACTION_PENDING;
   request.symbol = symbol;
   request.volume = volume;
   request.type = ORDER_TYPE_BUY_STOP;
   request.price = openPrice;
   request.deviation = Deviation;
   request.magic = EXPERT_MAGIC;
   
   if(UseCommentsInOrders)
      request.comment = OrderComment;
   
   if(!OrderSend(request, result))
   {
      Print("OrderSend error ", GetLastError(), " retcode: ", result.retcode);
      return false;
   }
   
   return true;
}
特に注目すべきはDeviationパラメータです。これは、要求した価格からどれだけずれて注文が執行されても許容するかを決定します。
input int Deviation = 3;          // Acceptable price deviation

これは言わば市場の悪魔との契約です。「要求した価格から最大3ポイントまでなら、実行が悪くても受け入れる」という合意です。ボラティリティの高い期間には、これが注文成立と機会の損失の差を生むことがあります。値が小さすぎればリクオートで注文が拒否され、逆に大きすぎれば予期せぬ不利な価格で約定してしまうリスクがあります。


リアルタイム情報表示と分析:トレーダーの目と耳

TrisWeb_Optimizedの開発を始めたとき、私は多くのEAに共通する大きな問題に気付きました。「ブラックボックス」として動作し、トレーダーが何が起きているのか理解できないことです。そこで、DisplayInfo()関数を通じて詳細な情報出力を追加しました。

void DisplayInfo(int totalOrders, double totalProfit, 
                double profit1, double profit2, double profit3,
                int count1, int count2, int count3)
{
   string info = "";
   
   if(AutoLotOptimization)
   {
      double lot1 = CalculateOptimalLotSize(Symbol1, Lot_Symbol1);
      double lot2 = CalculateOptimalLotSize(Symbol2, Lot_Symbol2);
      double lot3 = CalculateOptimalLotSize(Symbol3, Lot_Symbol3);
      
      info += "Auto Lot: " + Symbol1 + "=" + DoubleToString(lot1, 2) + 
              ", " + Symbol2 + "=" + DoubleToString(lot2, 2) + 
              ", " + Symbol3 + "=" + DoubleToString(lot3, 2) + "\n";
   }
   
   // ... the rest of the information generation code
   
   Comment(info);
}
表示モードは、ミニマリズムを好む人向けの基本モードと、各通貨ペアごとの内訳を含む詳細分析モードの2種類から選べます。
input bool DisplayDetailedInfo = false;  // Show detailed information

これは、古い車の基本的なダッシュボード(速度計と燃料計だけ)と、数十個の計器やモニターを備えた現代的なコックピットの違いのようなものです。どちらを使うかは、あなたの運転スタイル次第です。

ここでは、かつてのセットの一例がどのように動作したかを示します。

 


システムのスケーリング:シンプルなボットから取引帝国へ

TrisWeb_Optimizedは単なる完成済みのEAではなく、自分自身の裁定取引帝国を築くための基盤です。5年間の進化の中で、私は繰り返し改良を加え、新機能を追加し、既存機能を最適化してきました。以下は、システムを発展させる方向性の一例です。

Pythonとの統合は、相関分析や機械学習手法の適用において非常に大きな可能性を開きます。単に現在のレートを分析するだけでなく、3つの通貨ペア間の過去の相互作用パターンを解析し、最も起こりやすい不均衡を予測することも可能です。

Telegram APIによる通知は、戦略に機動性を加えます。取引ターミナルから離れていても、重要なイベントを常に把握できます。これは特に、EAがリモートVPS上で稼働している場合に大きな利点となります。

さらに通貨ペアの拡張により、TrisWebを本格的な裁定取引プラットフォームに進化させることができます。なぜ3つの通貨ペアに限定する必要があるでしょうか。数十の相互接続されたペアのネットワークを作り、数百の潜在的な裁定取引機会を追跡することも可能です。

これらの改良はいずれも、既存コードの基本構造や動作ロジックを維持しながら、最小限の変更で実現できます。まるで既存の家に部屋を増築するようなもので、基礎はすでに整っており、あとは居住空間を拡張するだけです。


結論に代えて

5年前、TrisWeb_Optimizedの初版をリリースしたとき、このシステムが歩む道のりを想像することはできませんでした。市場の嵐や極端なボラティリティの期間、相対的に落ち着いた期間もすべて生き延び、シンプルなスクリプトから成熟した取引システムへと進化しました。しかし最も重要なのは、利益を生み続けてきたことです。

次回の記事では、TrisWeb_Optimizedの実践的な設定方法に踏み込み、システムの実際の稼働例を検証し、さまざまな市場環境に応じたパラメータ最適化の秘密も共有します。まだまだ面白い部分はこれからです。

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

添付されたファイル |
Triss_Optimized.mq5 (40.02 KB)
最後のコメント | ディスカッションに移動 (17)
Maxim Kuznetsov
Maxim Kuznetsov | 19 1月 2026 において 18:33
MrBrooklin #:
記事で公開されたり、CodeBaseに掲載されたExpert Advisorは、利益を生むものではありません。

儲かるか儲からないかは、トレーダー+テクニカル(を含むExpert Advisor)の組み合わせの結果です。

記事やコードベースには賢明なものもたくさんあったが、先に進めば進むほど、トレーダーにも開発者にも何の役にも立たない偽のものが多くなる。

MrBrooklin
MrBrooklin | 20 1月 2026 において 05:30
Maxim Kuznetsov #:

儲かるか儲からないかは、トレーダー+技術的手段(を含むアドバイザー)の組み合わせの結果である。

記事やコードベースには賢明なものもたくさんあったが、先に進めば進むほど、トレーダーにも開発者にも何の役にも立たない、ただの偽物が増えていく。 通貨合成の裁定取引もその一つだ。

キーワードは「かつては」だ!でも今は違う。
よろしく、ウラジミール。
MrBrooklin
MrBrooklin | 21 1月 2026 において 07:13
Kenneth Michael Chambers #:
...私はEAにそれをコード化した...

EAに何をプログラムしたのですか?詳細を知りたいです。

よろしく、ウラジミール。

Zhang Yi
Zhang Yi | 3 2月 2026 において 13:45

この男はほとんど何も知らないと言わざるを得ない。


double commission = PositionGetDouble(POSITION_COMMISSION);

値は常に0だし、ギャラをごまかすためにここにいるのはここからも明らかだ 😂😂😂😂。

Arinze Michael Ejike
Arinze Michael Ejike | 3 2月 2026 において 16:27
MrBrooklin #:
キーワードは "used to be "だ!)でも今は違う。
よろしく、ウラジミール。
コードベースには素晴らしいコンテンツがある。特にライブラリーのセクション。コードベースの最も良い部分のように。
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
MQL5でのテーブルモデルの実装:MVC概念の適用 MQL5でのテーブルモデルの実装:MVC概念の適用
本記事では、MQL5におけるテーブルモデルの開発過程を、MVC (Model-View-Controller)アーキテクチャパターンを用いて解説します。データロジック、表示、制御を分離することで、構造化され柔軟かつ拡張可能なコードを実現します。テーブルモデルを構築するためのクラス設計や、データ格納のためのリンクリストの使用方法も取り上げます。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
初心者からエキスパートへ:ローソク足のヒゲを読み解く 初心者からエキスパートへ:ローソク足のヒゲを読み解く
この議論では、ローソク足のヒゲに隠された価格変動の裏側を解明する一歩を踏み出します。Market Periods Synchronizerにヒゲ可視化機能を統合することで、ツールの分析深度とインタラクティビティを向上させます。このアップグレードされたシステムにより、トレーダーは下位時間足チャート上で上位時間足の価格拒否を直接可視化でき、これまでヒゲの陰に隠されていた詳細な構造を明らかにできます。