多通貨エキスパートアドバイザーの開発(第27回):複数行テキスト表示コンポーネント
内容
はじめに
前回の記事では、ローソク足の平均サイズ(ポイント単位)や、同方向に連続するローソク足の本数に関する情報を表示する補助インフォーマーEAの基本バージョンを作成しました。このプロジェクトは、さまざまなシンプルな戦略を実装した多通貨EAの自動最適化および起動システムという本来のメインプロジェクトとは直接関係していません。しかし、EA インフォーマー自体のさらなる開発については、しばらく本連載の枠組みの中で進めていきます。というのも、すでにさまざまなコンポーネントの実装方法について試行錯誤と改良を始めており、その成果を最終的にはメインプロジェクトへ統合したいと考えているためです。
コード構造についても、より効率的な設計へ移行しました。これにより、Adwizardライブラリ開発の複数領域で作業を並列的に進められるようになりました。その一つが、生成されるEAを管理するためのビジュアルインターフェースの開発です。本記事で取り上げるEAインフォーマープロジェクトは、不必要に複雑化することなく、さまざまなUI実装アプローチを検証するための実験環境として役立ちます。それぞれの長所と短所を把握することで、最適な手法を選定し、メインプロジェクトの開発をより効果的に進められるようになります。
前回は計算処理部分を実装しました。この部分には特に厳しいパフォーマンス要件はありませんでした。計算結果を表示するために、標準で利用できる二つのシンプルな方法を使用しました。一つ目は、送信したテキストをチャート上に直接表示する標準関数Comment()です。二つ目は、別の標準関数Print()を使用してEAのログへテキストを出力する方法です。これらは単純な用途であれば非常に便利です。
しかし、これらの方法にはいくつかの制限があります。特にComment()の最大の問題は、フォントのサイズや書体、文字色を制御できないこと、そして大量の情報を表示する際にスクロールできないことです。そのため、複数行のデータや構造化された情報を出力する場合には扱いづらさが生じます。一方、Print()によるログ出力も、スクロールできる点を除けば同様の問題があります。さらに、ログへ常に新しいエントリが追加され続けるという別の不便さもあります。
そこで本記事では、独自コンポーネントとして、複数行テキストの表示、柔軟なフォント設定、さらに、画面全体を占めるスクロール機能対応ダイアログウィンドウを作成します。このツールによって、情報の可視化をより分かりやすく、使いやすいものにできます。また、このコンポーネントの実用性が確認できれば、将来的にはAdwizardライブラリの一部として組み込み、多通貨EAに関するさまざまな情報を表示するための汎用ツールとして活用する予定です。
要件の整理
本コンポーネントで実装予定の機能を整理すると、次のようになります。
-
複数行テキストの表示:コンポーネントには、あらかじめ整形された文字列を1つの変数として渡します。この文字列には改行コードが含まれる場合があり、その改行ごとに分割された各行をチャートウィンドウ上の別々の行として表示します。
-
テキストのスクロール:表示領域に対してテキスト量が多く、すべてを一度に表示できない場合には、マウスホイールによる縦方向のスクロールを可能にします。また、Shiftキーを押しながらマウスホイールを操作することで、横方向のスクロールにも対応します。なお、現時点ではスクロールバーは表示しませんが、将来的には追加する可能性があります。
-
フォントサイズの変更:Ctrlキーとマウスホイールの組み合わせにより、表示フォントのサイズを動的に拡大・縮小できるようにします。
-
フォントパラメータの変更:フォントのスタイル、文字色、背景色といったパラメータの変更をサポートします。ただし、これらの変更は当面の間はプログラム側からの設定に限定します。将来的には、実行中にユーザーが設定を変更できるUIの追加も検討します。
-
チャートサイズ変更への自動適応:EAが動作しているチャートウィンドウのサイズが変更された場合には、それに合わせてテキスト表示領域のサイズも自動的に調整され、常に利用可能な全領域を占有するようにします。
-
最小化:表示領域を最小化・最大化できる機能を実装します。
実装の過程で一部の要件は調整される可能性がありますが、上記の内容で基本的な設計方針としては十分です。
CConsoleDialogクラス
新しいクラスCConsoleDialogを作成します。このクラスは、既存の標準ライブラリクラスCAppDialogを継承する形で実装します。これは、親クラス側ですでに多くの機能が実装済みであるためです。最小化・最大化・EAアプリケーションを閉じるためのボタン付きウィンドウ表示などは、すでに実装済みです。そのため、本クラスでは、クライアント領域への描画処理の実装に専念できます。
具体的には、このクライアント領域にテキストを表示する処理を実装します。テキストの描画にはCCanvasクラスのオブジェクトを使用し、文字描画をおこないます。また、スクロール機能およびフォントサイズ変更機能については、チャートイベントの処理を通じて実装します。
新しいクラスの概要は以下のようになります。
//+------------------------------------------------------------------+ //| Fullscreen dialog window class | //| to display multi-line text | //+------------------------------------------------------------------+ class CConsoleDialog : public CAppDialog { protected: CCanvas m_canvas; // Canvas object for displaying text string m_lines[]; // Array of text lines string m_text; // Text to display in the dialog window int m_startRow; // Initial line of visible text int m_startCol; // Starting column (symbol) of visible text int m_totalRows; // Total number of text lines int m_totalCols; // Total number of symbols in the longest line of text int m_visibleRows; // Maximum number of visible lines int m_visibleCols; // Maximum number of visible symbols in a line string m_fontName; // Text font name int m_fontSize; // Font size uint m_fontColor; // Font color int m_fontSymbolWidth; // Width of one symbol in pixels int m_fontSymbolHeight; // Text line height in pixels uint m_backgroundColor; // Background color bool m_mouseWheel; // Previous state of mouse scroll event tracking bool CreateCanvas(); // Create a canvas void UpdateCanvas(); // Output text on canvas void UpdateCanvasFont(); // Change the canvas font public: CConsoleDialog(); // Constructor ~CConsoleDialog(void); // Destructor // Methods for creating a dialog window bool Create(string name); virtual bool Create(const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2); // Event handling virtual void ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam); virtual void Minimize(); // Minimize the dialog window virtual void Maximize(); // Maximize the dialog window virtual void Text(string text); // Set the new text virtual void FontName(string p_fontName); // Set the font name virtual bool FontSize(int p_fontSize); // Set the font size virtual void FontColor(uint p_fontColor); // Set the font color // Set the background color virtual void BackgroundColor(uint p_backgroundColor); };
公開メソッドのうち、現時点で主に使用するのは、テキストを新しく設定するためのText()メソッドと、ダイアログウィンドウを生成するための初期バージョンのCreate()メソッドです。Create()メソッドは、ウィンドウ名のみを指定してダイアログを生成できるシンプルな仕様とします。このウィンドウ名は、そのままウィンドウヘッダーのキャプションとしても使用されます。
コンストラクタとデストラクタ
CConsoleDialogクラスのコンストラクタでは、デフォルトのフォント設定を初期化します。ここではモノスペースフォントであるConsolasを使用し、フォントサイズは13、文字色はわずかに透過した黒色とします。このフォントを選択した理由は、等幅フォントであることにより、表形式のデータをテキストとして正確に整列表示できるということです。プロポーショナルフォントでは列幅が揃わず、テーブル状の表示が崩れてしまうため、今回の用途には適しません。
フォントサイズ13pxは、十分な情報量を表示できる程度にコンパクトでありながら、可読性も確保できるバランスの取れた値です。今後はユーザー操作によって簡単に変更できるようにする予定であるため、初期値としての厳密な重要性はそれほど高くありません。また、背景色は透過に設定し、CDialogクラスが持つ標準のグレー背景がCanvas越しに見えるようにします。これにより、ネイティブUIとの一貫性を維持します。
描画のための基本設定を確定するため、初期化の段階で FontSize()メソッドを呼び出し、Canvas描画に必要な基本パラメータを設定します。一方、デストラクタではリソース管理を担当します。具体的には、CCanvas オブジェクトを適切に破棄し、さらにチャート上で変更していたマウスホイールイベントの設定を元の状態へ復元します。
//+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CConsoleDialog::CConsoleDialog() : m_fontName("Consolas"), m_fontSize(13), m_fontColor(ColorToARGB(clrBlack, 240)), m_backgroundColor(ColorToARGB(clrBlack, 0)) { FontSize(m_fontSize); } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CConsoleDialog::~CConsoleDialog() { // Delete the canvas m_canvas.Destroy(); // Return the previous mouse scroll event handling settings ChartSetInteger(m_chart_id, CHART_EVENT_MOUSE_WHEEL, (long)m_mouseWheel); }
ダイアログウィンドウの作成
ウィンドウを作成するためのCreate()メソッドには2つのバージョンがあります。1つ目はウィンドウ名のみを受け取るもので、ウィンドウの位置とサイズをチャート領域全体に設定し、上部に小さな余白を加えます。このメソッドはチャートの寸法を計算し、具体的な座標を指定する第2のCreate()メソッドを呼び出します。
第2のメソッドでは、チャート番号、名前、サブウィンドウ番号、および座標を指定してダイアログウィンドウを作成できます。このメソッドではまず親クラスの実装を呼び出してウィンドウを作成し、その後、最小化状態のための寸法を設定します。次にCanvasを作成し、マウススクロールイベントの追跡を有効化します。そして、表示開始位置(スクロール位置)を初期化しし、テキストの表示が先頭から開始されるようにします。
//+------------------------------------------------------------------+ //| Method to create a dialog window by name only | //+------------------------------------------------------------------+ bool CConsoleDialog::Create(string name) { // Set the corner position and window size int x1 = 0; int y1 = DIALOG_VERTICAL_MARGIN; int y2 = (int) ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0); int x2 = (int) ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0); // Call the method for creating according to the given dimensions return Create(0, name, 0, x1, y1, x2, y2); } //+------------------------------------------------------------------+ //| Dialog window creation method | //+------------------------------------------------------------------+ bool CConsoleDialog::Create(const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2) { // Call the parent method to create the dialog if(!CAppDialog::Create(chart, name, subwin, x1, y1, x2, y2)) { return false; } // Set the size of the minimized dialog window m_min_rect.SetBound(0, DIALOG_VERTICAL_MARGIN, 250, DIALOG_VERTICAL_MARGIN + CONTROLS_DIALOG_MINIMIZE_HEIGHT); // Create a canvas if(!CreateCanvas()) { return false; } // Save the previous mouse scroll event handling settings m_mouseWheel = ChartGetInteger(0, CHART_EVENT_MOUSE_WHEEL); // Set up tracking mouse scroll events ChartSetInteger(chart, CHART_EVENT_MOUSE_WHEEL, 1); // Set the initial text position in the window m_startRow = 0; m_startCol = 0; return true; }
チャートウィンドウの上端からの上部余白の値は、DIALOG_VERTICAL_MARGIN 定数によって設定されます。この余白により、チャート上部に記号名と時間足、さらに実行中のEAの名前を表示することができます。EAの名前をクリックすることで、そのパラメータへ素早くアクセスすることも可能です。もしダイアログウィンドウがチャートの最上部から開始される場合、このような機能は利用できなくなります。ただし、この機能が不要になった場合は、上記の定数の値を0に設定するだけで、ダイアログウィンドウはチャートの利用可能領域全体を実質的に占有するようになります。
イベント処理
ChartEvent()メソッドは、さまざまなチャートイベントの処理を担当します。基本的には、マウスホイールスクロールイベント (CHARTEVENT_MOUSE_WHEEL)を処理します。ウィンドウが最小化されていない場合、押されているキーを確認します。Shiftキーが押されている場合は、テキストの列数が表示可能範囲を超えている場合は横方向へスクロールします。追加のキーが押されていない場合は、テキストの高さが表示領域を超えているときに縦方向へスクロールします。また、Ctrlキーを押しながら操作すると、フォントサイズを変更できます。チャートサイズが変更された場合、このメソッドはウィンドウサイズを自動的に調整し、必要に応じて利用可能な領域全体を占有するように拡張します。その他のイベントはすべて、親クラスであるCAppDialog側で処理されます。
//+------------------------------------------------------------------+ //| Event handling | //+------------------------------------------------------------------+ void CConsoleDialog::ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { // Handle the mouse wheel scroll event if(id == CHARTEVENT_MOUSE_WHEEL) { // If the dialog window is minimized, then we do not handle this event if(m_minimized) { return; } // Parse the state of the buttons and the mouse wheel for this event int flg_keys = (int)(lparam >> 32); // Flag of the states of the Ctrl, Shift keys and mouse buttons int delta = (int)dparam; // total value of the wheel scroll, // triggered when +120 or -120 is reached // If the SHIFT key is pressed, if((flg_keys & 0x0004) != 0) { // If the number of symbols in the string is greater than the number of visible // symbols in the dialog, then we perform a horizontal shift if(m_totalCols > m_visibleCols) { // For one scroll event we will move by 2 symbols (120 / 60 = 2) delta /= 60; // If the new start position is within the allowed range, if(m_startCol - delta >= 0 && m_startCol - delta <= m_totalCols - m_visibleCols + 2) { // Save the new starting position m_startCol -= delta; // Update the canvas UpdateCanvas(); } } } else if (flg_keys == 0) { // Otherwise, if the number of lines of text is greater than the number of visible // lines in the dialog, then we perform a vertical shift if(m_totalRows > m_visibleRows) { // For each scroll event we will move by 1 line (120 / 120 = 1) delta /= 120; // If the new start position is within the allowed range, if(m_startRow - delta >= 0 && m_startRow - delta <= m_totalRows - m_visibleRows + 1) { // Save the new starting position m_startRow -= delta; // Update the canvas UpdateCanvas(); } } } else if((flg_keys & 0x0008) != 0) { // Otherwise, if the CTRL key is pressed, we try to set a new font size if(FontSize(m_fontSize + delta / 120)) { // Update the canvas UpdateCanvas(); } } return; } // Handle chart changing event if(id == CHARTEVENT_CHART_CHANGE) { // If the display size changed if(m_chart.HeightInPixels(m_subwin) != Height() + DIALOG_VERTICAL_MARGIN || m_chart.WidthInPixels() != Width()) { // Set new size for the dialog window m_norm_rect.SetBound(0, DIALOG_VERTICAL_MARGIN, m_chart.WidthInPixels(), m_chart.HeightInPixels(m_subwin)); // If the dialog window is not minimized, if(!m_minimized) { // maximize it to fill the chart area with new dimensions Maximize(); } return; } } // Handle other events in the parent class CAppDialog::ChartEvent(id, lparam, dparam, sparam); }
このダイアログではCWndObjクラスを継承するコンポーネントを使用していないため、標準的なマクロを使用して、ダイアログコンポーネントのイベントをそれぞれのハンドラ関数にバインドするOnEvent()関数を生成することができません。適用されているCCanvasコンポーネントは、代わりにChartEvent()という汎用チャートイベントハンドラの使用を強制します。
最小化
ウィンドウをMinimize()メソッドで最小化する際には、使用されているリソースを解放するためにCanvasが破棄されます。その後、親クラスの実装が呼び出され、ウィンドウの状態が変更されます。同様にMaximize()メソッドによって最大化する際には、まず親クラスのメソッドが呼び出されてウィンドウが最大化され、その後Canvasが生成され、新しいクライアント領域のサイズに合わせて表示を更新します。
//+------------------------------------------------------------------+ //| Minimize the dialog window | //+------------------------------------------------------------------+ void CConsoleDialog::Minimize() { // Delete the canvas m_canvas.Destroy(); // Call the parent Minimize method CAppDialog::Minimize(); } //+------------------------------------------------------------------+ //| Maximize the dialog window | //+------------------------------------------------------------------+ void CConsoleDialog::Maximize() { // Call the parent Maximize method CAppDialog::Maximize(); // Create a canvas CreateCanvas(); // Display text on the canvas UpdateCanvas(); }
将来的には、CCanvas用のラッパークラスを作成し、それをCWndObjクラスの派生クラスにすることで、より便利になる可能性があります。しかし現時点では、この方法でも十分対応可能です。
テキストの処理
表示されるテキストを設定または変更するには、Text()メソッドを使用します。このメソッドでは、新しいテキストが現在のテキストと異なるかどうかを確認します。異なる場合、元の文字列は改行文字 '\n' を基準として文字列配列に分割されます。その後、行数が保存され、最も長い行の最大長が算出されます。この情報は、スクロール処理と表示範囲の計算を正しくおこなうために必要です。最後に、Canvasの再描画が呼び出され、新しいテキストが表示されます。
//+------------------------------------------------------------------+ //| Set a text | //+------------------------------------------------------------------+ void CConsoleDialog::Text(string text) { // If the text changes, if(text != m_text) { // Save the new text m_text = text; // Divide the text into lines StringSplit(m_text, '\n', m_lines); // Remember the number of lines m_totalRows = ArraySize(m_lines); // Define the maximum length of lines m_totalCols = 0; FOREACH(m_lines) { m_totalCols = MathMax(m_totalCols, StringLen(m_lines[i])); } // Display text on the canvas UpdateCanvas(); } }
フォントと色の設定
FontName()メソッドは、テキスト表示に使用するフォント名を設定し、それに応じてCanvasの設定を更新します。
フォントサイズの変更はFontSize()メソッドで実装されており、新しい値を受け取り、その値が適切な範囲(8から72まで)内であることを確認します。変更が成功した場合、スクロール位置はテキストの先頭にリセットされ、Canvasのフォント属性は新しいサイズに合わせて更新されます。また、新しいサイズに基づいて1文字あたりの幅および高さが計算され、保存されます。これにより、表示可能なテキスト領域を正確に算出できるようになります。
FontColor()メソッドは、フォントの色を設定するために使用されます。
//+------------------------------------------------------------------+ //| Set the font name | //+------------------------------------------------------------------+ void CConsoleDialog::FontName(string p_fontName) { // Save the new font name m_fontName = p_fontName; // Update the canvas font UpdateCanvasFont(); } //+------------------------------------------------------------------+ //| Set the font size | //+------------------------------------------------------------------+ bool CConsoleDialog::FontSize(int p_fontSize) { // If the size is within reasonable limits, if (p_fontSize >= 8 && p_fontSize <= 72) { // Save the new font size m_fontSize = p_fontSize; // Reset the starting row and column m_startRow = 0; m_startCol = 0; // Update the canvas font UpdateCanvasFont(); return true; } return false; } //+------------------------------------------------------------------+ //| Set the font color | //+------------------------------------------------------------------+ void CConsoleDialog::FontColor(uint p_fontColor) { m_fontColor = p_fontColor; }
Canvasとの連携
CreateCanvas()メソッドはCanvasの生成を担当し、ダイアログウィンドウのクライアント領域のサイズを持つCCanvasオブジェクトを初期化します。また、アルファチャンネル付きのカラーフォーマットを指定します。Canvasが正常に作成された場合には、フォント関連のパラメータが直ちに設定されます。UpdateCanvas()メソッドは、Canvas上に実際にテキストを描画する役割を持ちます。このメソッドではまず背景がクリアされ、その後、現在の行および文字のスクロール位置を考慮しながら表示範囲内の行を描画します。各表示行については、必要に応じて先頭部分を省いたうえで、テキストはわずかな余白を持って表示されます。描画が完了すると、Canvasの再描画が呼び出され、変更内容がユーザーに反映されます。
最後にUpdateCanvasFont()メソッドは、Canvas上のフォント設定を更新し、M文字を基準として1文字のサイズを計算します。また、現在のウィンドウサイズに基づいて表示可能な行数および文字数を算出し、スクロール処理に必要な情報を設定します。
//+------------------------------------------------------------------+ //| Create a canvas | //+------------------------------------------------------------------+ bool CConsoleDialog::CreateCanvas() { // Get the dimensions of the dialog window client area int height = ClientAreaHeight(); int width = ClientAreaWidth(); // If the size is non-zero if(height > 0 && width > 0) { // If an error occurred while creating the canvas, then exit if(!m_canvas.CreateBitmapLabel("display", ClientAreaLeft(), ClientAreaTop(), ClientAreaWidth(), ClientAreaHeight(), COLOR_FORMAT_ARGB_NORMALIZE)) { PrintFormat(__FUNCTION__" | ERROR: Creating canvas %d", GetLastError()); return false; } UpdateCanvasFont(); } return true; } //+------------------------------------------------------------------+ //| Display text on canvas | //+------------------------------------------------------------------+ void CConsoleDialog::UpdateCanvas() { // Erase the canvas with the background color m_canvas.Erase(m_backgroundColor); // For each line that falls within the visible range for (int i = m_startRow; i < MathMin(m_totalRows, m_startRow + m_visibleRows); i++) { // Take the next line of text string line = m_lines[i]; // If it should be shown not from the first symbol, then if (m_startCol > 0) { // Cut out the initial symbols line = StringSubstr(line, m_startCol); } // Display the string on the canvas m_canvas.TextOut(5, 5 + (i - m_startRow) * m_fontSymbolHeight, line, m_fontColor, TA_LEFT | TA_TOP); } // Call the method to draw the canvas on the screen m_canvas.Update(true); } //+------------------------------------------------------------------+ //| Change the canvas font | //+------------------------------------------------------------------+ void CConsoleDialog::UpdateCanvasFont() { // Set font parameters for text output on canvas m_canvas.FontSet(m_fontName, m_fontSize); // Set new sizes of one symbol m_canvas.TextSize("M", m_fontSymbolWidth, m_fontSymbolHeight); // Determine the number of visible lines and symbols per line (columns) m_visibleRows = ClientAreaHeight() / m_fontSymbolHeight; m_visibleCols = ClientAreaWidth() / m_fontSymbolWidth; }
作成したコードをプロジェクトフォルダ内のConsoleDialog.mqhファイルに保存し、開発したコンポーネントを接続するためにエキスパートアドバイザー(EA)のインフォーマーファイルにどのような変更が必要かを確認します。
コンポーネントの接続
新しいコンポーネントを使用してチャート上にテキストを表示するには、EAインフォーマーファイルを開きます。まず、作成したライブラリファイルをインクルードします。
#include "ConsoleDialog.mqh"
次に、グローバルなダイアログオブジェクトを作成します。
CConsoleDialog *dialog;
OnInit()メソッド内では、計算および表示処理を開始する前に、ダイアログの生成および起動コマンドを追加します。
//+------------------------------------------------------------------+ //| Initialize the EA | //+------------------------------------------------------------------+ int OnInit(void) { // ... // Create and launch a dialog to display the results dialog = new CConsoleDialog(); dialog.Create("Symbols Informer"); dialog.Run(); // Perform a forced recalculation Calculate(true); // Show the results Show(); return(INIT_SUCCEEDED); }
最後にShow()関数内でComment()関数の呼び出しを置き換え、結果のテキストをダイアログに設定するように変更します。
//+------------------------------------------------------------------+ //| Show results | //+------------------------------------------------------------------+ void Show() { // Get the results as text string text = TextComment(); // Show it on the chart in the dialog window dialog.Text(text); }
プロジェクトフォルダ内のSymbolsInformer.mq5ファイルに加えた変更を保存します。
テスト
インフォーマーEAをデフォルトパラメータで起動します。スクロール機能とテキストサイズの変更が両方利用できるため、最も見やすいフォントサイズや、希望する表示領域を簡単に選択できます。
たとえば、EURUSDのM30における平均ローソク足サイズのデータのみを確認したい場合には、フォントサイズを大きくすることで、以下のような表示を作成できます。

GBPUSDとEURGBPのすべての値を一度に確認したい場合は、フォントサイズをさらに小さくしてテキストをスクロールします。

開発されたコンポーネントは、グラフィカルなインターフェースを使用せず、すべての情報をチャート上にテキスト形式で表示する既存のEAにも容易に適用することができます。
例えば、最近の記事「FX裁定取引:リスク管理を伴う公正価値への回帰を目指す行列取引システム」では、著者はそのようなEAの例を提示しています。

ソースコードにいくつかの小さな変更を加え、本コンポーネントの接続セクションで説明した方法に従うことで、以下のような結果が得られます。

このような形式で情報を表示する方が、はるかに視認性が高くなります。
結論
本記事では、平均ローソク足のサイズ(ポイント単位)や、同一方向に連続するローソク足の系列の長さを表示する補助インフォーマーEAの初期バージョンを改良しました。その過程で、他の多くのEAにも応用可能なコンポーネントを開発しました。
しかし現時点では、計算処理と結果表示の両方を1つのEAが担当しています。次回は、これら2つの処理を分離し、より高い柔軟性を持たせることを試みます。このアプローチを多通貨取引EAにも適用する予定です。
お読みいただきありがとうございました。またすぐにお会いしましょう。
重要な注意事項
この記事および連載のこれまでのすべての記事で提示された結果は、過去のテストデータのみに基づいており、将来の利益を保証するものではありません。このプロジェクトでの作業は研究的な性質のものであり、公開された結果はすべて、自己責任で使用されるべきです。
アーカイブ内容
| # | 名前 | バージョン | 詳細 | 最近の変更 |
|---|---|---|---|---|
| SymbolsInformer | プロジェクト作業フォルダ | |||
| 1 | SymbolsInformer.mq5 | 1.01 | 一方向ローソク足の連続本数に関する情報を表示するEA | 第27回 |
| 2 | CConsoleDialog.mqh | 1.00 | 第27回 | |
| 3 | AbbyCross.mq5 | — | CConsoleDialogクラスを含むサードパーティ製EAファイルの例 | |
| SymbolsInformer/Include/Adwizard/Utils | 補助ユーティリティ、コード削減用マクロ | |||
| 4 | Macros.mqh | 1.07 | 配列操作に便利なマクロ | 第26回 |
| 5 | NewBarEvent.mqh | 1.00 | 特定の銘柄の新しいバーを定義するクラス | 第8回 |
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/17883
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
中央銀行のバランスシートデータからグローバル流動性を読み解く
MQL5コミュニティOAuthを利用した外部アプリケーション連携
PythonによるCFTCデータマイニングとAIモデルの構築
外国為替市場向けCAPMモデルインジケータ
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索