純粋なMQL5で実装した通貨ペア強度インジケーター
想像してみてください。トレーダーは毎日、FX市場の混沌とした状況に直面しています。28の通貨ペアが画面上で点滅し、それぞれ独自の速度で動き、市場というシンフォニーを奏でています。しかし、この金融オーケストラの中で、主要なメロディをどうやって見つけるのでしょうか。どの通貨が市場をリードしているのか、どの通貨が弱まり地盤を失っているのかをどう判断するのでしょうか。
本記事では、この混沌を明確な市場の強さのビジュアルとして示す特別なインジケーターを作ります。たとえば、このツールはEURが1時間足で強くなっている一方、JPYが日足で弱まっていることを瞬時に示します。このインジケーターは単にデータを表示するだけでなく、3つの主要時間足を通して各通貨の動きをストーリーとして伝えます。
このガイドでは、アイデアから完成されたテクニカルツールまでの道のりを順を追って解説します。複雑な数学計算やプログラムコードを、信頼できる取引アシスタントとなる美しいダッシュボードに変えていきます。単にコードを書くのではなく、市場分析の見方を変えるツールを作るのです。
MQL5プログラミングの刺激的な世界に飛び込み、数学的精度と直感的なシンプルさを兼ね備えたインジケーターを作成する準備はできていますか。それではシートベルトを締めてください。これから、プロフェッショナルなトレーディングツール開発の旅に出発します。
1. 通貨強度ダッシュボード:リアルタイムで通貨ペアの強さを分析するツールのアイデアとコンセプト
伝説的投資家レイ・ダリオがBridgewater Associatesで最初の取引システムを作ったとき、彼は「ある資産の動きを理解するには、その資産に関連するすべての金融商品群の動きを見る必要がある」という、シンプルで強力な原則に従っていました。彼はまずトレンドトレードから始め、次にバスケットトレードをおこない、その後アイデアを発展させてアービトラージやコインテグレートされたポートフォリオへと進めました。
私たちの通貨強度ダッシュボードも同じ考えに基づいています。トレンドの強さを評価し、バスケット指標、適正価格のアービトラージ指標、コインテグレートされたバスケット指標を作成していきます。
なぜこれが重要なのでしょうか。たとえばEUR/USDチャートを見ているとします。このペアは上昇しているのか下降しているのか。チャートの動きは一見明確に見えます。しかし、実際には何が起きているのでしょうか。EURが強くなっているのか、それともUSDが弱くなっているのか。各通貨の全体的な強さを理解せずには答えは出せません。ここで私たちのインジケーターの真価が発揮されます。
ダッシュボードの主な機能
マルチレベルの時間足および価格分析では、異なる時間足を使用することで、通貨の強さをより正確に把握できます。H1(1時間足)は短期的な変動を示し、H4(4時間足)は中期的なトレンドを反映します。D1(日足)は全体的な強さの大局を示します。各時間足には独自の重みがあり、短期的な変動による歪みを避け、長期トレンドに集中できます。最終的な通貨強度指標はすべての時間足を組み合わせて計算され、より包括的な分析が可能です。
動的ランキングは、通貨ペアの現在のポジションを維持するのに役立ちます。これにより、どの通貨が現在最も強く、どの通貨が最も弱いかを瞬時に判断することが可能です。ダッシュボードは極端な値を視覚的に強調表示し、変化を素早く追跡できるようにします。従来の指標が各通貨ペアを個別に分析するのに対し、私たちのシステムはダリオの手法に倣い、市場全体を一つの相互接続されたシステムとして捉えます。たとえばEURが強くなると、EURUSDだけでなく、GBP、JPY、CHFなど他の通貨との関係にも影響を及ぼします。
このようにして私たちのダッシュボードは、これらの関係性を集約し、市場の全体像を把握できるようにします。それにより、各通貨の真の強さを視覚的に確認できるのです。ダリオは言いました。「市場でお金を稼ぐには、独立して考え、謙虚である必要がある」。私たちの通貨強度ダッシュボードは、従来の分析手法では見つけられない隠れたトレンドを特定する手助けをしてくれます。
2. 基本要素の準備:入力設定、通貨ペアの接続、配色と更新間隔の定義
複雑な計算やアルゴリズムに入る前に、まずインジケーターの基盤をしっかり作りましょう。基本要素の正しい設定は、プロジェクト全体の成功の50%を占めます。
インジケーターのヘッダ構造
#property copyright "Copyright 2025" #property version "1.00" #property description "Currency strength analysis dashboard" #property indicator_separate_window #property indicator_plots 0
これらのディレクティブはインジケーターの基本情報を定義します。indicator_separate_windowに注意してください。このパネルはメインチャートを圧迫せず、別ウィンドウに表示されます。
トレーダーによる入力
// Inputs input color InpStrongColor = clrLime; // Color of strong currencies input color InpWeakColor = clrRed; // Color of weak currencies input color InpTextColor = clrWhite; // Text color input int InpUpdateInterval = 60; // Update interval (in seconds)
ユーザーはインジケーターの見た目や挙動をカスタマイズできます。緑と赤は通常、強さと弱さを表す色として使われますが、トレーダーは自分の好みに合わせて色を変更できます。
通貨ペアの定義
// Array of currency pairs const string CURRENCY_PAIRS[] = { "EURUSD", "GBPUSD", "USDJPY", "USDCHF", "AUDUSD", "NZDUSD", "USDCAD", "EURGBP", "EURJPY", "EURCHF", "EURAUD", "EURNZD", "EURCAD", "GBPJPY", "GBPCHF", "GBPAUD", "GBPNZD", "GBPCAD", "AUDJPY", "NZDJPY", "CADJPY", "CHFJPY", "AUDCHF", "NZDCHF", "CADCHF", "AUDNZD", "AUDCAD", "NZDCAD" };
この配列はインジケーターの中核です。分析対象となる主要通貨ペアをすべて含んでいます。順序にも注目してください。まずUSD建てのペア、次にEUR、GBP、…と続きます。この構造は個別通貨の強さ計算に役立ちます。
情報を格納するためのデータ構造体
// Structure for storing the strength of a currency pair struct SPairStrength { string pair; // Currency pair double strength; // Current strength double h1_change; // Change per hour double h4_change; // Change in 4 hours double d1_change; // Daily change }; // Global variables SPairStrength g_strength_data[]; int g_pairs_count; int g_timer_counter;
SPairStrength構造体は、各通貨ペアの必要情報を格納するコンテナです。最終的な強さだけでなく、各時間足の変化も保存し、トレーダーが動きの全体像を把握できるようにします。
インジケーターの初期化
int OnInit() { // Initialize the data array g_pairs_count = ArraySize(CURRENCY_PAIRS); ArrayResize(g_strength_data, g_pairs_count); // Fill in the names of pairs for(int i = 0; i < g_pairs_count; i++) { g_strength_data[i].pair = CURRENCY_PAIRS[i]; } // Create graphical objects if(!CreateGraphics()) { return(INIT_FAILED); } // Set the timer EventSetTimer(InpUpdateInterval); g_timer_counter = 0; return(INIT_SUCCEEDED); }
初期化関数では、データ配列のサイズを設定し、基本情報を入力した後、グラフィカルオブジェクトを作成し、更新タイマーを設定します。
シャットダウン時のクリーンアップ
void OnDeinit(const int reason) { EventKillTimer(); ObjectsDeleteAll(0, "SPPanel_"); ChartRedraw(); }
リソースを正しく解放することを忘れないでください。良いコードの証です。
これでインジケーターの基礎が整いました。次のセクションでは、通貨強度の計算システムと結果の可視化の作成に取り組みます。
3. データ格納構造体の作成:各通貨ペアの強さを保存するためのSPairStrength構造体の設計
すべてのプログラマは知っていますが、データ構造は家の基礎のようなものです。プロジェクト全体の成功は、どれだけ慎重に設計されているかにかかっています。では、SPairStrength構造体の解剖を始めましょう。
// Structure for storing the strength of a currency pair struct SPairStrength { string pair; // Currency pair double strength; // Current strength double h1_change; // Change per hour double h4_change; // Change in 4 hours double d1_change; // Daily change }; // Global variables SPairStrength g_strength_data[]; int g_pairs_count; int g_timer_counter;
この構造体の中心には、通貨ペアに関する必要な情報をすべて格納するための洗練された解決策があります。通貨ペアのデジタルパスポートのように、それぞれのフィールドが市場の動きを物語ります。
pairフィールドは、金融商品の名前、つまりFXの世界での一意のIDです。人の名前が個人を識別するのと同じように、文字列「EURUSD」や「GBPJPY」は、どの通貨ペアを扱っているかを瞬時に示します。
strength変数は、通貨ペアの強さのエッセンスであり、市場における数値評価です。教師が複数のテスト結果から最終成績を計算するように、この値はすべての時間足でのパフォーマンスを考慮して単一の強さ指数を作成します。
次に、一時的なデータ構造についてです。私たちは3つの主要なマーカー(h1_change、h4_change、d1_change)を使用します。これは3台の監視カメラのようなもので、それぞれが独自の時間スケールで価格の動きを捉えます。1時間足(h1_change)は短期的な変動をとらえ、4時間足(h4_change)は中期的なトレンドを追跡、日足(d1_change)は価格変動の全体像を描きます。
構造体で作業するために、グローバル変数も作成します。
// Initialize the data array void InitializeDataArray() { g_pairs_count = ArraySize(CURRENCY_PAIRS); ArrayResize(g_strength_data, g_pairs_count); // Fill in basic information for(int i = 0; i < g_pairs_count; i++) { g_strength_data[i].pair = CURRENCY_PAIRS[i]; g_strength_data[i].strength = 0; g_strength_data[i].h1_change = 0; g_strength_data[i].h4_change = 0; g_strength_data[i].d1_change = 0; } }
これらすべての要素が組み合わさることで、強力な分析ツールが完成します。医師が患者の健康状態を評価するためにさまざまな指標を使用するように、私たちの構造体も、通貨ペアの「健康状態」を判断するための主要な指標を集めます。次のセクションでは、この洗練されたデータ構造体がどのようにグラフィカルインターフェースに命を吹き込まれ、単なる数値が市場機会の視覚的なイメージに変わるのかを見ていきます。
4. グラフィカルインターフェースの整理:メインパネルの作成、見出しの配置、値表示のカスタマイズ
データの可視化とは、数字をわかりやすい図に変える技術です。トレーダーが市場の状況を瞬時に読み取れるよう、直感的なインターフェースを作りましょう。
bool CreateGraphics() { // Main panel if(!ObjectCreate(0, "SPPanel_Main", OBJ_RECTANGLE_LABEL, 0, 0, 0)) { Print("Error creating main panel: ", GetLastError()); return false; } // Customize the panel appearance ObjectSetInteger(0, "SPPanel_Main", OBJPROP_XDISTANCE, 20); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_YDISTANCE, 20); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_XSIZE, 800); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_YSIZE, 400); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BGCOLOR, C'16,20,24'); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BORDER_COLOR, C'29,31,34'); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BORDER_TYPE, BORDER_FLAT); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BACK, false);
暗い背景を選んだ理由は明確です。長時間の使用でも目の疲れを軽減するためです。ダッシュボードのサイズも慎重に選定されており、画面を圧迫せずに必要な情報を最適に表示できるようになっています。
// Create headings and markup CreateLabel("SPPanel_Strong", "STRONG PAIRS - LONG", 30, 30, InpTextColor, 10, true); CreateLabel("SPPanel_Weak", "WEAK PAIRS - SHORT", 420, 30, InpTextColor, 10, true); string header = " PAIR H1 H4 D1 FORCE"; CreateLabel("SPPanel_Header1", header, 30, 60, clrGray, 9); CreateLabel("SPPanel_Header2", header, 420, 60, clrGray, 9);
インターフェースは、強いペアと弱いペアの2つの論理ゾーンに分かれています。これは磁石の2極のように、最も重要な取引機会に注意を引きます。各データ列にはそれぞれ役割があり、異なる時間足を通して価格の動きを物語ります。
bool CreateLabel(const string name, const string text, const int x, const int y, const color clr, const int size, const bool is_bold=false) { if(!ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0)) { Print("Error creating label ", name, ": ", GetLastError()); return false; } ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetString(0, name, OBJPROP_FONT, is_bold ? "Arial Bold" : "Arial"); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); return true; }
CreateLabel関数は、パネル上にテキストを正確に配置する「アーティスト」の役割を果たします。インターフェースの各要素はピクセル単位で調整され、データの調和のとれた構図を作り出します。
次のセクションでは、このインターフェースに実際の通貨ペアの動きデータを反映させ、パネルを「生きたオブジェクト」として市場のリズムに合わせて動かしていきます。
強さ計算アルゴリズムの実装
インジケーターの心臓部には、通貨ペアの強さを計算する強力なアルゴリズムがあります。これは単なる数学的な式ではなく、各時間足が役割を果たす市場データのシンフォニーです。
// Calculate the price change for a given timeframe double CalculateChange(const string symbol, const ENUM_TIMEFRAMES timeframe) { MqlRates rates[]; ArraySetAsSeries(rates, true); if(CopyRates(symbol, timeframe, 0, 2, rates) <= 0) { return 0.0; } if(rates[1].open == 0) return 0.0; return ((rates[0].close - rates[1].open) / rates[1].open) * 100.0; } // Calculate the strength of all currency pairs void CalculateStrengths() { for(int i = 0; i < g_pairs_count; i++) { // Calculate changes across different timeframes g_strength_data[i].h1_change = CalculateChange(g_strength_data[i].pair, PERIOD_H1); g_strength_data[i].h4_change = CalculateChange(g_strength_data[i].pair, PERIOD_H4); g_strength_data[i].d1_change = CalculateChange(g_strength_data[i].pair, PERIOD_D1); // Calculate the total force (weighted value) g_strength_data[i].strength = g_strength_data[i].h1_change * 0.2 + // 20% weight of the hourly chart g_strength_data[i].h4_change * 0.3 + // 30% weight of the 4-hour chart g_strength_data[i].d1_change * 0.5; // 50% weight of the daily chart } }
なぜこのような重み付けをするのでしょうか。日足は最も大きな重み(50%)を持ち、全体的なトレンドを反映します。4時間足は中期的な動きを捉え、重みは30%、1時間足は短期的な変動に対応し、重みは20%です。これは市場ノイズを除去するフィルタシステムのようなものです。各レベルが信号を精錬し、より正確な通貨強度を提供します。
5. バブルソートシステム:通貨ペアを強さ順に並べ、強い通貨と弱い通貨を特定するメカニズムの作成
現代のアルゴリズム取引において、データのソートのスピードと正確性は極めて重要です。私たちが開発したソートメカニズムは、単なる古典的アルゴリズムの実装ではなく、外国為替市場の特定のタスクに最適化された慎重なソリューションです。
void SortStrengthData() {
for(int i = 0; i < g_pairs_count - 1; i++) {
for(int j = i + 1; j < g_pairs_count; j++) {
if(g_strength_data[j].strength > g_strength_data[i].strength) {
SPairStrength temp = g_strength_data[i];
g_strength_data[i] = g_strength_data[j];
g_strength_data[j] = temp;
}
}
}
}
一見シンプルに見えるこのコードの背後には、強力な金融分析ツールがあります。アルゴリズムの各反復は、通貨ペアの強さをマイクロ秒単位で比較する作業です。強い通貨ペアは自然と配列の上位に昇格し、取引のエリートグループを形成します。一方、弱い通貨ペアは下位に移動し、ショートポジションを狙うトレーダーにとって理想的なシナリオを作り出します。
void GetTopPairs(SPairStrength &strong[], SPairStrength &weak[], int count = 10) { ArrayResize(strong, count); for(int i = 0; i < count; i++) { strong[i] = g_strength_data[i]; } ArrayResize(weak, count); for(int i = 0; i < count; i++) { weak[i] = g_strength_data[g_pairs_count - 1 - i]; } }
GetTopPairs関数は、私たちのアプローチの優雅さを示しています。データ配列全体を常に再ソートする代わりに、整理された状態で保持することで、最も強い通貨ペアと最も弱い通貨ペアの情報を瞬時に抽出できます。これは、ミリ秒単位で情報が重要になる高頻度取引において特に重要です。
void UpdateDisplay() { for(int i = 0; i < 10 && i < g_pairs_count; i++) { string text = StringFormat("%s %+.1f %+.1f %+.1f %+.1f", g_strength_data[i].pair, g_strength_data[i].h1_change, g_strength_data[i].h4_change, g_strength_data[i].d1_change, g_strength_data[i].strength); UpdatePairDisplay("Strong_" + IntegerToString(i), text, InpStrongColor, i); } }
次のセクションでは、このデータ更新システムがどのようにしてこの「よく潤滑された機械」を常に稼働させ、トレーダーにリアルタイムで通貨ペアの強さに関する最新情報を提供するかを見ていきます。
6. データ更新システムの実装:タイマーと通貨強度値を定期的に更新する関数の設定
取引ツールの成功の基盤は、情報の正確性とタイムリーさにあります。この通貨強度インジケーターも例外ではありません。その心臓部には、慎重に設計されたリアルタイムデータ更新システムが存在します。
void OnTimer() { g_timer_counter++; if(g_timer_counter >= InpUpdateInterval) { CalculateStrengths(); SortStrengthData(); UpdateDisplay(); g_timer_counter = 0; } }
この洗練されたタイマーメカニズムは、まるでメトロノームのように市場の変化のリズムを刻みます。デフォルト値では60秒ごとに、インジケーターはすべてのデータを完全に更新し、トレーダーに意思決定のための最新情報を提供します。
void UpdateDisplay() { // Remove old values ObjectsDeleteAll(0, "SPPanel_Value_"); // Update strong pairs for(int i = 0; i < 10 && i < g_pairs_count; i++) { string text = StringFormat("%s %+.1f %+.1f %+.1f %+.1f", g_strength_data[i].pair, g_strength_data[i].h1_change, g_strength_data[i].h4_change, g_strength_data[i].d1_change, g_strength_data[i].strength); CreateLabel("SPPanel_Value_Strong_" + IntegerToString(i), text, 30, 90 + i * 25, InpStrongColor); } }
データ更新のプロセスは、劇場での舞台セットの入れ替えに似ています。古い値はスムーズに新しい値に置き換わり、市場の鮮やかでダイナミックな状況を描き出します。各値は数学的な精度でフォーマットされており、パーセンテージ変化は小数点2桁 列揃えで読みやすく、色分けにより瞬時に情報を把握できるようになっています。
void RefreshData() { static datetime last_update = 0; datetime current_time = TimeCurrent(); // Check if an update is needed if(current_time - last_update >= InpUpdateInterval) { CalculateStrengths(); SortStrengthData(); UpdateDisplay(); last_update = current_time; } }
さらにこのシステムには、過剰な更新を防ぐ保護機能やサーバー時間との同期機構も組み込まれています。これは、高負荷の取引口座で作業する際に特に重要です。次のセクションでは、これらすべての要素がどのように組み合わさり、結果表示の最適化を実現するかを見ていきます。
7. 結果表示の最適化:データ出力のフォーマットと値の色強調設定
金融データの世界では、視覚的な表現が重要な役割を果たします。私たちのインジケーターは、市場データの流れを直感的に理解できる図に変換し、各要素に明確な目的を持たせています。
void UpdatePairDisplay(const string label_suffix, const string value, const color clr, const int position) { string text = StringFormat("%s %+6.1f %+6.1f %+6.1f %+6.1f", value.pair, value.h1_change, value.h4_change, value.d1_change, value.strength); color display_color = value.strength > 0 ? InpStrongColor : InpWeakColor; CreateLabel("SPPanel_" + label_suffix, text, position < 10 ? 30 : 420, // X coordinate 90 + (position % 10) * 25, // Y coordinate display_color, 9); }
ここでの数値フォーマットは、単なる見た目の向上に留まりません。各値は固定幅と符号付きで出力され、完全に揃った列を形成します。正の値は自動的に緑、負の値は赤で表示されるため、トレーダーは瞬時に状況を把握できます。
void ApplyColorCoding() { // Dynamically detecting boundaries for color coding double max_strength = 0; for(int i = 0; i < g_pairs_count; i++) { if(MathAbs(g_strength_data[i].strength) > max_strength) max_strength = MathAbs(g_strength_data[i].strength); } // Apply gradient coloring for(int i = 0; i < g_pairs_count; i++) { double strength_ratio = g_strength_data[i].strength / max_strength; color intensity = GetColorIntensity(strength_ratio); UpdatePairColor(i, intensity); } }
インジケーターは動的な色付けシステムを採用しており、色の強さが通貨ペアの相対的な強さを反映します。色が鮮やかであればあるほど動きが大きいことを示し、トレーダーは最も活発な通貨ペアを瞬時に特定できます。
次のセクションでは、さまざまな市場状況下でのパフォーマンスを確認するためのインジケーターのテストプロセスを見ていきます。
8. インジケーターのテスト:異なる時間足での計算精度と動作安定性の確認
目の前には、すでに実際の市場データを表示している完全に動作する通貨強度ダッシュボードが見えます。ここで、インジケーターがさまざまな市場状況でどのように機能するか、そして正しく動作していることをどのように確認できるかを見てみましょう。

スクリーンショットでは、通貨ペアが明確に分かれて表示されています。左側の強い通貨ペアの列では、EURCADが主にプラスの動きを示しており、リーダーとして目立っています。
右側の弱い通貨ペアの列では、CADCHFが顕著な弱さを示しています。特に上位時間足での弱さが顕著で、H4では-0.5、D1では-1.8、全体として-1.1の弱さを示しています。これは、インジケーターが持続的なトレンドを正確に特定できることを示す素晴らしい例です。
結論
市場データの混沌を明確で構造化された取引機会の図に変える、プロフェッショナルな通貨強度インジケーターを完成させました。このダッシュボードには、有料版もあり、長期トレンドの調整局面でのエントリーポイントを探す機能も搭載されています(たとえば、長期的に上昇トレンドが続いているものの、1時間足チャートでは下落が見られる場合に、利益を狙って買えるような状況です)。
このダッシこのダッシュボードは、以下の複数の革新的な機能を備えています。
- マルチレベル時間足分析(H1、H4、D1)によって、市場の動きの全体像を把握する
- スマートな重み付けシステムによって各時間足が全体の強さスコアに貢献する
- 直感的にデータを表示する洗練されたビジュアルインターフェース
- 効率的なリアルタイム更新システム
- 通貨ペアのソートとランキングの堅牢なメカニズム
このインジケーターの強みは、単なる技術的な実装だけにあるのではなく、背後にある哲学にもあります。レイ・ダリオの原則に従い、私たちは市場を単一で相互接続されたシステムとして捉えるツールを作成しました。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/17303
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
取引における資金管理とデータベースを用いた個人向け会計プログラム
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
多通貨エキスパートアドバイザーの開発(第23回):自動プロジェクト最適化段階のコンベアの配置(II)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
通貨ペアをクロスコースの大規模なリストの形で使用することは、考慮不足であり、極めて非効率的である。1つのベース(通常は米ドル)に対して相対的な通貨のみを取り上げ、そこから任意の組み合わせを得るのが正しい。
すべてが正しく行われており、単一通貨から始めるよりも何倍も明白である。
素晴らしい仕事だ!
通貨ペアをクロスコースの大規模なリストの形で使用することは、考慮不足であり、極めて非効率的である。一つのベース(原則として米ドル)に対して相対的な通貨のみを取り上げ、そこから任意の組み合わせを得るのが正しい。
コードが小さくなり、危険です。導入した「通貨の強さ」という用語の意味が失われる可能性があります。
正しいやり方で、単一通貨に反対するよりも何倍も明白だ。
よくやった!
トレーダーにとって、例えばEURJPYがEURUSD*USDJPYであることが明白でないなら、おそらく間違ったビジネスに従事しているのだろう。FXの「メジャー」だけをとってみても、28ペアよりも7ペアの方が(あらゆる意味で)処理しやすい。また、ブローカーが(よくあることだが)いくつかのクロスを持っていない場合、どうするのだろうか?マイナー"、地域通貨、金属をバスケットに加えたい場合は?同じバスケットを評価する必要はないが、マーケット・ウォッチ全体をMQLプログラムに引きずり込めというのか?このようなアドバイザーのせいで、フォーラムに定期的に質問が寄せられるのです。
UpdatePairDisplayのような原理的にコンパイルできないものも含め、抽出されたコードの一部について話し始めたわけではありません。
不満足だ。