ユニバーサルEA: シンボルプロパティへのアクセス (その 8)
Vasiliy Sokolov | 20 9月, 2017
イントロダクション
以前のCStrategy トレーディングエンジンの記事から少し時間が経ってしまいましたが、 これは、本格的なトレード戦略を作成するために少し時間が必要だったことによります。最も頻繁に使用されるツールであり、補助トレードライブラリから CStrategy の開発パスを実現するために時間が必要でした。 今回は CStrategy のさらなる開発方法を理解するのに役立つはずです。 CStrategy の実用的な使用により、最新バージョンの欠点が明らかになりました。 この欠点の訂正により「ユニバーサルトレードEA」シリーズの新しい記事を生じさせました。 現在の8番目のパートでは、オブジェクト指向の CStrategy クラスを介して、トレードのインストゥルメントのタスクについて説明します。
以前までの CStrategy バージョンの概要
EAのトレーディング環境は多岐にわたります。 アカウント情報、価格データ、時間を操作するための関数、およびターミナルで利用可能なトレーディングシンボルに関する情報があります。 このほとんどは、現在のクオートの受信やシンボルプロパティの操作など、トレーディングシンボル関連の関数で利用できます。 原則として、すべてのトレーディングEAは、価格データに対し稼働します。 トレードに基づいてパターンやトレードシグナルを計算するために、最新の価格データを使用します。 トレードオーダーの適切な生成を提供するために、現在のシンボルのプロパティについての情報を使用して、トレードの最小量やフリーズレベル(現在の価格からの範囲)、保留中のオーダーを配置することはできません。
このデータは、シンプルにアクセスできるべきであり、常に "手元" にある必要があります。 CStrategy の以前のバージョンではどうでしょう? 見つけ出すためにヒストリーを参照してみましょう。 以下より、以前のバージョンがトレーディングシンボルでどのように動作したかについて説明します。 この記事の3番目のパートでは、従来のインデクサ [] を使用してクオートにアクセスするメソッドについて説明しました。 補助クラスは、COpen、CHigh、CLow、CClose、CVolume、CTime などの CStrategy に含まれています。 リクエストされたインデックスに適切な値を返しました。 したがって、現在のシンボルに関する情報は、EAのコードで受け取ることができます。 たとえば、現在の足の終値は、次のコードを使用して取得できます。
...
double close = Close[0];
...
ただし、OHLC 形式の価格へのアクセスは十分ではなく、 Ask ()、Bid ()、Last () メソッドが追加されました。 ただし、現在のツールの基本情報を取得するには、FreezeLevel () などのメソッドが必要でした。 CStrategy クラスのサイズが大きくなり始めました。 CStrategy の中の多数のメソッドは混同し始めました。 複数のシンボルを交換するEAを作成しようとしてこの複雑さは始まりました。 CStrategy は、マルチシンボルツールです。 複数のEAが別々のシンボルを交換したり、2つ以上の金融商品をトレードするEAを作成するために使用できることを意味します。 しかし、後者のケースは、別のタスクシンボルを交互に設定することにより、時系列クラスを再構成する必要があるため、実装が困難でした。
string symbol1 = "EURUSD"; string symbol2 = "GBPUSD"; Close.Symbol(symbol1); double close_eurusd = Close[0]; Close.Symbol(symbol2); double close_gbpusd = Close[0]; ...
タスクシンボルに関する大量の情報によって、CStrategy が直接実装できないという結論につながります。 CStrategy クラスは、一連のトレードアクションを配置しながら複雑なタスクを実行し、追加の関数によってコードの管理性を損なう可能性があります。 したがって、シンボルを操作するためのメソッドは、別のCSymbolクラスに実装することをお勧めします。
WS オブジェクトと CSymbol クラスの最初の結びつき
Ask ()、Bid ()、および Last () メソッドと、CHigh やCLowなどの追加クラスの代わりに、CStrategy ベースのトレーディング戦略によって、CSymbol クラスに基づいて作成された特別なWSオブジェクトにアクセスできるようになりました。 このクラスは、CStrategy ライブラリのセットに属しており、標準のСSymbolInfoクラスと同様のメソッドを多数含んでいます。 でもこのクラスは違います。 シンボルプロパティを使用するだけでなく、制限オーダー (相場の深さ) に関する情報を含むシンボルのクオートを取得することもできます。 オブジェクト名 WS は「ワーキングシンボル」の略称です。 このオブジェクトは、ストラテジーコードで使用できます。 ショートネームの使用は便利です。 多くの場合、さまざまなシンボルプロパティにアクセスする必要がありますが、2文字の省略形はコードのコンパクトさと表現性を維持することができます。
この記事の前のパートでは、制御系がEAに渡される前に、CStrategy トレーディングエンジンは、内部環境オブジェクトの初期化の数を実行されていました。 タスクシンボルとタイムフレームの名前を保存し、新しいイベントを追跡するクラスも作成します (デフォルトのイベントは新しいティックと新しい足です)。 また、ログを有効にし、操作モードフラグを設定します。 CSymbol クラスの WS オブジェクトが初期化されます。 その内部構造は非常に簡単です。 シンボルとその時間枠、およびシンボルクオートへのアクセスを可能にする特殊なオブジェクトの2つの内部フィールドがあります。 InitSeries メソッドでは、WS オブジェクトが初期化されます。 EAのタスクシンボルと時間枠を知ることで、シンプルに初期化できます。
CStrategy::CStrategy(void)
{
WS.InitSeries(ExpertSymbol(), Timeframe());
}
オブジェクトが初期化されると、シンボルの必須プロパティを取得できます。 たとえば、現在の足の高値を取得するために、次のように記述します。
double max = WS.High[0];
WS オブジェクトには、計算で直接使用するための便利で自己完結的なツールとなる追加プロパティが用意されています。 一般的なケースを考えてみましょう。前の足の高値のすぐ上に BuyStop のオーダーを配置したいとします。 EURUSD をトレードし、前の足の高値から 0.35の間隔でストップオーダーを置きたいとします。 次のコードを記述する必要があります。
void CMovingAverage::InitBuy(const MarketEvent &event) { ... Trade.BuyStop(1.0, WS.High[1] + WS.StepToPrice(3), WS.Name()); ... }
この1つの行コードには、多くのアクションが含まれています。
- 前の足の極端な値を受け取る (WS.High[1]);
- 3ポイントの必要な距離を取得するために1ポイントを乗算 (WS.StepToPrice (3));
- 結果として得られる価格の距離を高値に追加する (WS.High [1] + WS.StepToPrice (3));
- トレードされた計測器が現在のシンボル (WS.) と等しいときに、結果の値でトリガ価格で BuyStop 指図を送信します。(WS.Name())。
StepToPrice メソッドは、メタトレーダーに採用されているネームシステムとはかなり異なっているように見えるかもしれません。 他のトレードプラットフォームでは、価格のステップは、最小の価格差です。 メタトレーダーでは SYMBOL_TRADE_TICK_SIZE です。 この名は、ティックサイズまたは値 SYMBOL_TRADE_TICK_VALUE とシンプルに混同するため、CSymbol はこのパラメータに別の名前を使用します。 もかかわらず、CSymbol メソッドの他のほとんどの名前は MQL5 システム修飾子とメソッドと一致しますが、常に同じではありません (例: StepToPrice)。 CSymbol の主な目的は、トレードツールについての完全情報を得るための直感的なメソッドのセットを提供することです。
CSymbol クラスの構造 メソッドの比較表
メタトレーダーでは、大スケールなプロパティセットを持つトレーディングシンボルが提供されています。 まず、すべてのプロパティは、条件付きで整数、実数、および文字列値に分けることができます。 整数のプロパティには、bool 値、列挙型 (enum)、日付と時刻 (datetime)、および整数のプロパティ (int および long) の形式でのシステム修飾子が含まれます。 実数プロパティには、さまざまな小数値 (double) が含まれます。 文字列プロパティには、シンボルの名前、文字列の説明など、文字列値を返すプロパティが含まれます。 さらに、シンボルには特定の相場セグメントに固有のプロパティがある場合があります。 たとえば、現在のトレーディングセッションの追加プロパティは、FORTSシンボルで使用できます。 オプションには固有のプロパティもあります。 CSymbol クラスは、追加の内部 SessionInfo クラスの現在のFORTSトレーディングセッションのプロパティを定義します。 残りのプロパティは、その型に基づいて分離されません。 適切な名前のメソッドの形で「そのまま」利用できます。
さらに、CSymbol クラスには、シンボルクオートへのアクセスを可能にする追加のコレクションがあります。 たとえば、一般に定義されたCOpen、CHigh、CLow、CClose、CVolume は OHLCV シリーズにアクセスするために使用されますが、相場の深さは特別な CMarketWatch クラスを使用してアクセスすることができます。 CMarketWatch の詳細な説明は、記事「 MQL5 クックブック: 独自の相場の深さを実装する」にあります。 CSymbol クラスには、CClose などの適切な名前を持つメソッドとインデックスクラスのほかに、SymbolInfo クラスに類似していないメソッドがあります。 より詳細に説明しましょう。
使用可能: 指定した名前のシンボルがターミナルに存在する場合、このメソッドは true を返します。 このようなシンボルが見つからない場合は、false が返されます。
IndexByTime: 指定した時刻に対応する足のインデックスを返します。 たとえば、次のコードでは、1の値が ' index ' 変数に割り当てられています。
int index = WS.IndexByTime(WS.Time[1]); //インデックス = 1;
このメソッドは、時間を知っているとこの時間に対応するバーのインデックスを取得したい場合に使用するのに便利です。 BarsHoldで、トレーディングEAが保持した後にポジションを閉じる必要があるとします。 この関数を実装するコードは次のようになります。
//+------------------------------------------------------------------+ //移動平均に従ってロングポジションを管理する | //+------------------------------------------------------------------+ void CImpulse::SupportBuy(const MarketEvent &event,CPosition *pos) { int bar_open = WS.IndexByTime(pos.TimeOpen()); if(bar_open >= BarsHold) pos.CloseAtMarket("Exit by time hold"); }
StepToPriceは、シンボルポイントで表される最小価格変更値です。 メソッドの目的の説明は以前にあります。
CSymbol メソッドの完全なリストは、以下の表に記載されています。 説明 フィールドには、簡単なメソッドの説明が表示されています。 ほとんどの場合、ドキュメントの対応するセクションで、同様のシンボルプロパティの公式な説明と一致します。 このメソッドは、より適切な説明があります。
戻り値の型 フィールドには、メソッドまたはコレクションによって返される数値の型が表示されます。
MQL5 関数またはシステム識別子フィールドには、類似した目的で使用される適切な MQL5 システム識別子または関数の名前があります。 システム関数が指定されている場合、括弧は名前に追加されます。例えば CopyOpen () または MarketBookGet () に追加されます。 システム修飾子は、SymbolInfoInteger、SymbolInfoDouble、または SymbolInfoString 関数を呼び出すときに指定する必要がある3つの修飾子のうちの1つです。 この修飾子は、ENUM_SYMBOL_INFO_INTEGER、ENUM_SYMBOL_INFO_DOUBLE、または ENUM_SYMBOL_INFO_STRING の3つの適切なシステム列挙体のいずれかに属している必要があります。 たとえば、"MQL5 関数またはシステム識別子" で SYMBOL_TRADE_STOPS_LEVEL 修飾子が指定されている場合、このプロパティを取得するには SymbolInfoInteger を呼び出す必要があります。
int stop_level = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL);
CSymbol メソッド名の列には、対応するプロパティを返すメソッドの名前があります。 たとえば、トリプルスワップが課される曜日を取得するには、次のメソッドを呼び出す必要があります。
ENUM_DAY_OF_WEEK day = WS.DayOfSwap3x();
次に、メソッドの表を示します。
Description | 戻り値の型 | MQL5 関数またはシステム識別子 | CSymbol メソッド名 |
---|---|---|---|
シンボルのヒストリー的な引用へのアクセス | |||
指定されたバーインデックスのオープン価格の取得 (プリセットシンボルタイムフレーム) | double | CopyOpen() | Open[] |
指定された足のインデックスの高値を取得します。 | double | CopyHigh() | High[] |
指定したバーインデックスの安値を、あらかじめ設定されたシンボルタイムフレームで取得する | double | CopyLow() | Low[] |
指定したバーインデックスの終値を、あらかじめ設定されたシンボルタイムフレームで取得する | double | CopyClose() | Close[] |
指定したインデックスを持つバーのボリュームの取得 | double | CopyVolume() | Volume[] |
シンボルの相場深度プロパティの取得、レベル2の価格へのアクセス | MqlBookInfo | MarketBookGet() | MarketBook |
整数シンボルのプロパティ | |||
シンボルがターミナルに存在することを示す | bool | No analogues | Available |
このシンボルとタイムフレームのバーの数 | int | Bars() | BarsTotal |
シンボルの時間枠 | ENUM_TIMEFRAMES | Period() | Period |
相場ウォッチでシンボルが選択されていることを示す | bool | SYMBOL_SELECT | SelectInMarketWatch |
浮動スプレッドの表示 | bool | SYMBOL_SPREAD_FLOAT | SpreadFloat |
ポイント単位でのスプレッドの値 | int | SYMBOL_SPREAD | Spread |
ストップオーダーを設定するための現在の終値からのポイントの最小距離 | int | SYMBOL_TRADE_STOPS_LEVEL | StopLevel |
トレーディングオペレーションのフリーズ距離 (ポイント単位) | int | SYMBOL_TRADE_FREEZE_LEVEL | FreezeLevel |
許可されたオーダーモードのフラグ | int | SYMBOL_EXPIRATION_MODE | FlagsExpirationOrders |
許可されたオーダー実行モードのフラグ | int | SYMBOL_FILLING_MODE | FlagsExecutionOrders |
許可されたオーダータイプのフラグ | int | SYMBOL_ORDER_MODE | FlagsAllowedOrders |
オープンタイムが渡された引数に対応するバーのインデックスを返します。 | int | No analogues | IndexByTime |
コントラクト価格計算モード | ENUM_SYMBOL_CALC_MODE | SYMBOL_TRADE_CALC_MODE | CalcContractType |
オーダー実行タイプ | ENUM_SYMBOL_TRADE_MODE | SYMBOL_TRADE_MODE | ExecuteOrderType |
実行モード処理 | ENUM_SYMBOL_TRADE_EXECUTION | SYMBOL_TRADE_EXEMODE | ExecuteDealsType |
スワップ計算モデル | ENUM_SYMBOL_SWAP_MODE | SYMBOL_SWAP_MODE | CalcSwapMode |
トリプルデイスワップ日 |
ENUM_DAY_OF_WEEK | SYMBOL_SWAP_ROLLOVER3DAYS | DayOfSwap3x |
オプションの種類 | ENUM_SYMBOL_OPTION_MODE | SYMBOL_OPTION_MODE | OptionType |
オプション(Call/Put) | ENUM_SYMBOL_OPTION_RIGHT | SYMBOL_OPTION_RIGHT | OptionRight |
最後のクオートの時間 | datetime | SYMBOL_TIME | TimeOfLastQuote |
シンボルトレーディング開始日 (通常先物に使用) | datetime | SYMBOL_START_TIME | StartDate |
シンボルトレーディング決済日 (通常は先物に使用) | datetime | SYMBOL_EXPIRATION_TIME | ExpirationDate |
MOEX 先物シンボルの現在のトレードセッションのプロパティ | |||
現在のセッションでのトレード数 | long | SYMBOL_SESSION_DEALS | SymbolInfo.DealsTotal |
現時点での買いオーダーの合計数 | long | SYMBOL_SESSION_BUY_ORDERS | SymbolInfo.BuyOrdersTotal |
現時点での売りオーダーの合計数 | long | SYMBOL_SESSION_SELL_ORDERS | SymbolInfo.SellOrdersTotal |
現在のトレードセッション中の最高のボリューム | long | SYMBOL_VOLUMEHIGH | SymbolInfo.HighVolume |
現在のトレードセッション中の最も低いボリューム | long | SYMBOL_VOLUMELOW | SymbolInfo.LowVolume |
その日の最高Bid価格 | double | SYMBOL_BIDHIGH | SymbolInfo.BidHigh |
日の最も高いAsk価格 | double | SYMBOL_ASKHIGH | SymbolInfo.AskHigh |
その日の最低Bid価格 | double | SYMBOL_BIDLOW | SymbolInfo.BidLow |
その日の最安の Ask 価格 | double | SYMBOL_ASKLOW | SymbolInfo.AskLow |
一日の最後の最高値 | double | SYMBOL_LASTHIGH | SymbolInfo.LastHigh |
一日の最後の最安値 | double | SYMBOL_LASTLOW | SymbolInfo.LastLow |
現在のセッションでのトレードの合計量 | double | SYMBOL_SESSION_VOLUME | SymbolInfo.VolumeTotal |
現在のセッションの総売上高 | double | SYMBOL_SESSION_TURNOVER | SymbolInfo.TurnoverTotal |
オープンポジションの合計ボリューム | double | SYMBOL_SESSION_INTEREST | SymbolInfo.OpenInterestTotal |
現時点での買いオーダーの合計量 | double | SYMBOL_SESSION_BUY_ORDERS_VOLUME | SymbolInfo.BuyOrdersVolume |
現時点での売りオーダーの合計量 | double | SYMBOL_SESSION_SELL_ORDERS_VOLUME | SymbolInfo.SellOrdersVolume |
セッションのオープンプライス | double | SYMBOL_SESSION_OPEN | SymbolInfo.PriceSessionOpen |
セッションの終値 | double | SYMBOL_SESSION_CLOSE | SymbolInfo.PriceSessionClose |
セッションの平均加重価格 | double | SYMBOL_SESSION_AW | SymbolInfo.PriceSessionAverage |
現在のセッションの決済価格 | double | SYMBOL_SESSION_PRICE_SETTLEMENT | SymbolInfo.PriceSettlement |
セッションの最大許容価格値 | double | SYMBOL_SESSION_PRICE_LIMIT_MAX | SymbolInfo.PriceLimitMax |
セッションの最小許容価格値 | double | SYMBOL_SESSION_PRICE_LIMIT_MIN | SymbolInfo.PriceLimitMin |
実数シンボルのプロパティ | |||
インストゥルメントを買いできる最高の価格 | double | SYMBOL_ASK | Ask |
インストゥルメントを売りができる最高の価格 | double | SYMBOL_BID | Bid |
最後のトレードが実行された価格 | double | SYMBOL_LAST | Last |
価格ステップ数を乗じた最小価格変更値 | double | No analogues | StepToPrice |
1ポイントの値 (ティック) | double | SYMBOL_POINT | PriceStep |
資産通貨で表される一点 (ティック) の値 | double | SYMBOL_TRADE_TICK_VALUE | TickValue |
オプション実行価格 | double | SYMBOL_OPTION_STRIKE | OptionStrike |
トレードコントラクトのサイズ | double | SYMBOL_TRADE_CONTRACT_SIZE | ContractSize |
取引可能な最小ボリューム | double | SYMBOL_VOLUME_MIN | VolumeContractMin |
取引可能な最大ボリューム | double | SYMBOL_VOLUME_MAX | VolumeContractMax |
取引可能な最小ボリューム可変ステップ | double | SYMBOL_VOLUME_STEP | VolumeContractStep |
このシンボルに対して、開いているポジションと保留中のオーダーの最大許容合計ボリューム (買いまたは売りのいずれか)。 | double | SYMBOL_VOLUME_LIMIT | VolumeContractLimit |
1ボリュームに対するロングポジションのスワップ | double | SYMBOL_SWAP_LONG | SwapLong |
1ボリュームに対するショートポジションのスワップ | double | SYMBOL_SWAP_SHORT | SwapShort |
ワンロットポジションを開くために必要なマージン | double | SYMBOL_MARGIN_INITIAL | MarginInit |
オープンポジションの1ロットを維持するために必要なマージン | double | SYMBOL_MARGIN_MAINTENANCE | MarginMaintenance |
ヘッジポジションの1ロットを維持するために必要なマージン | double | SYMBOL_MARGIN_HEDGED | MarginHedged |
文字列シンボルのプロパティ | |||
シンボル名 | string | Symbol() | Name |
派生シンボルの基になるアセットの名前 | string | SYMBOL_BASIS | NameBasisSymbol |
ツールの基本通貨 | string | SYMBOL_CURRENCY_BASE | NameBasisCurrency |
利益通貨 | string | SYMBOL_CURRENCY_PROFIT | NameCurrencyProfit |
マージン通貨 | string | SYMBOL_CURRENCY_MARGIN | NameCurrencyMargin |
現在のクオートのソース | string | SYMBOL_BANK | NameBank |
シンボルの文字列の説明 | string | SYMBOL_DESCRIPTION | Description |
証券識別番号 (ISIN) の国際システムにおけるトレードシンボルの名称 | string | SYMBOL_ISIN | NameISIN |
シンボルツリー内のパス | string | SYMBOL_PATH | SymbolPath |
一度に複数のシンボルを使用する
CSymbol は通常のクラスであるため、EA内でこのクラスのオブジェクト数を無制限に作成できます。 WSは、CStrategy エンジンによって作成されたそのようなオブジェクトの1つであり、EAのタスクシンボルと時間枠を示します。 このEA は、他のシンボルへのアクセスをする追加のオブジェクトを作成することもできます。 モスクワ取引所のデリバティブ相場でSiとBrentを追跡すると仮定します。 このEAのコードでは、2つの CSymbol オブジェクトを使用できます。 Si とBrentを呼び出す:
//+------------------------------------------------------------------+ //| EventListener.mqh | //| Copyright 2017, Vasiliy Sokolov, St-Petersburg, Russia | //| https://www.mql5.com/ja/users/c-4 | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, Vasiliy Sokolov." #property link "https://www.mql5.com/ja/users/c-4" #include<Strategy\Strategy.mqh> //+------------------------------------------------------------------+ //一度に2つのシンボルを扱う戦略のテンプレート | //+------------------------------------------------------------------+ class CIntRate : public CStrategy { CSymbol Si; // Ruble-dollar CSymbol Brent; // Brent oil public: virtual void OnEvent(const MarketEvent& event); virtual bool OnInit(); }; //+------------------------------------------------------------------+ //| Initializes the ruble and oil symbols | //+------------------------------------------------------------------+ bool CIntRate::OnInit(void) { Si.InitSeries("Si Splice", Timeframe()); Brent.InitSeries("BR Splice", Timeframe()); return true; } //+------------------------------------------------------------------+ //| The price of Brent expressed in rubles | //+------------------------------------------------------------------+ void CIntRate::OnEvent(const MarketEvent &event) { double brent_in_rub = Brent.Last()*Si.Last()/Si.ContractSize(); } //+------------------------------------------------------------------+
このEAコードは、Brentとrubleの最後の価格を受け取り、その後、rubleで表現されたbrentの価格式を計算します。 1つの Si 先物コントラクトは $1000 に等しいので、1つのコントラクトの大きさで結果を分割する必要があります。 すべてのシンボルプロパティは1つのクラスで使用できるため、非常に簡単な操作です。 コードの残りの部分もシンプルな表現でできます。 主なものとして、EAのメソッドでは、Si とbrentのオブジェクトを初期化することを忘れてはなりません。
CSymbolを利用して利率 を構築
検討しようとしている CSymbol を使用した最後の例は、もう少し複雑であり、また、より興味深いものです。 先物コントラクトは、元になる資産に関連して繰り延べトレードされることが知られています。 商品の将来の価格は、スポット価格よりも高くなっていることを意味します。 この差額は、特定の商品または資産の相場金利を決定します。 ruble/dollar先物の例を考えてみましょう。 この記事を書いている瞬間の価格は1ドルの56.2875 ルーブルであり、最も近い Si-6.17 先物コントラクトの価格は1ドルの $1000 または56.682 ルーブルの56682ルーブルです。 そのため、スポット価格と30日後の将来の価格の差は (16.05.2017、Si-6.17 のテイクプロフィットは30日) 0.395 ルーブルまたは 39.5 kopeks です。 つまり、相場は 39.5 kopeks、すなわち、そのスポット価格の 0.7% によってルーブルを期待しています。 12ヶ月のインフレ率は、相場で予想される 8.42% であると計算することができます。 しかしこれは最も近い先物に計算されるインフレーションレベルです。 si-6.17 の代わりに9.17 を使用する場合、インフレ率は年率約 7.8%、低くなります。 すべての Si 先物を元になる資産価格と比較することで、 利子プロファイルを取得できます。 このプロファイルは、時間に応じて投資家の期待を示す表として表示されます。 例えば、次の30、100、200、300、400、500日の金利を得ます。
すべての値を計算するために、さまざまなシンボルプロパティとシンボルリストを積極的に使用する必要があります。 金利プロファイルの計算メソッド:
- このEAは、任意の先物シンボルにロードされます。 シンボル名を分析し、すべての関連先物をロードします。
- 各ロードされた先物シンボルは、シンボルのリストに置かれている CSymbol オブジェクトを表します。
- 新しいティックが受信されると、EAはシンボルのコレクションを使用して動作します。 各シンボルの元になる資産が検索されます。
- 次に、このEA は、選択したシンボルの価格とその元になる資産価格の差を計算します。 この差は、その後、年間の利息に変換されます。 この目的に、先物コントラクトの残りの寿命は考慮に入れられます。
- この結果の違いは、パネルの表の行として表示されます。 各行は "先物名-テイクプロフィット前の日数-利率" として表示されます。
説明からわかるように、このアルゴリズムは実際には見ためほどシンプルではありません。 ただし、CStrategy エンジンと CSymbol オブジェクトは、EA の計算の複雑さを大幅に軽減するのに役立ちます。 以下のコードはEAの形で実装されていますが、このEA はトレードアクションを実行しません。 代わりに、パネルにインタレスト値が表示されます。 次に、結果のコードを示します。
//+------------------------------------------------------------------+ //| EventListener.mqh | //| Copyright 2017, Vasiliy Sokolov, St-Petersburg, Russia | //| https://www.mql5.com/ja/users/c-4 | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, Vasiliy Sokolov." #property link "https://www.mql5.com/ja/users/c-4" #include<Strategy\Strategy.mqh> #include<Arrays\ArrayObj.mqh> #include "Panel.mqh" //+------------------------------------------------------------------+ //| Interest rate profile | //+------------------------------------------------------------------+ class CIntRate : public CStrategy { CArrayObj Symbols; //シンボルの一覧 CPercentPanel Panel; //金利を表示するためのパネル double BaseRate(CSymbol* fut); public: virtual void OnEvent(const MarketEvent& event); virtual bool OnInit(); }; //+-------------------------------------------------------------------+ //金利プロファイルを計算するために必要な先物を追加 | //+-------------------------------------------------------------------+ bool CIntRate::OnInit(void) { string basis = WS.NameBasisSymbol(); for(int i = 0; i < SymbolsTotal(false); i++) { string name = SymbolName(i, false); int index = StringFind(name, basis, 0); if(index != 0) continue; CSymbol* Fut = new CSymbol(name, Timeframe()); if(Fut.ExpirationDate() == 0 || Fut.ExpirationDate() < TimeCurrent()) { delete Fut; continue; } string text = "Add new symbol " + Fut.Name() + " in symbols list"; CMessage* msg = new CMessage(MESSAGE_INFO, __FUNCTION__, text); Log.AddMessage(msg); Symbols.Add(Fut); } string text = "Total add symbols " + (string)Symbols.Total(); CMessage* msg = new CMessage(MESSAGE_INFO, __FUNCTION__, text); Log.AddMessage(msg); if(Symbols.Total() > 0) { Panel.Show(); } return true; } //+------------------------------------------------------------------+ //プロファイルを計算し、テーブルに表示 | //+------------------------------------------------------------------+ void CIntRate::OnEvent(const MarketEvent &event) { double sec_one_day = 60*60*24; //86 400 for(int i = 0; i < Symbols.Total(); i++) { CSymbol* Fut = Symbols.At(i); double brate = BaseRate(Fut); double days = (Fut.ExpirationDate()-TimeCurrent())/sec_one_day; if(Fut.Last() == 0.0) continue; double per = (Fut.Last() - brate)/brate*100.0; double per_in_year = per/days*365; Panel.SetLine(i, Fut.NameBasisSymbol() + " " + DoubleToString(days, 0) + " Days:", DoubleToString(per_in_year, 2)+"%"); } } //+------------------------------------------------------------------+ //先物のスポットクオートを返します | //+------------------------------------------------------------------+ double CIntRate::BaseRate(CSymbol* fut) { string name = fut.NameBasisSymbol(); if(StringFind(name, "Si", 0) == 0) return SymbolInfoDouble("USDRUB_TOD", SYMBOL_LAST)*fut.ContractSize(); return SymbolInfoDouble(name, SYMBOL_LAST)*fut.ContractSize(); } //+------------------------------------------------------------------+
この基本関数は、メソッドに実装されています。 このメソッドは、WS を使用して元になる資産の名前を受け取ります。NameBasisSymbol () とすべてのシンボルをチェックして、この元になる資産に対応するすべての先物を検索します。 このような先物シンボルはぞれ CSymbol オブジェクトに変換され、シンボルの CArrayObj リストに追加されます。 その前に、先物コントラクトが有効かどうかチェックされます。 適切な先物コントラクトの満了時間は、将来的行う必要があります。
シンボルコレクションからの各先物の利率は、OnEvent メソッドで計算されます。 満了前の日数と先物と現物価格の間のデルタが計算されます。 この価格差は、年間リターンに従って正規化される割合に変換されます。 この結果の値がパネルテーブルに書き込まれます (SetLine メソッドを使用)。
テーブル自体はシンプルで、EAと共に表示される CStrategy パネルに似た一連のグラフィッククラスに基づいています。 EA のグラフィカルコンポーネントのコードは以下のとおりです。
//+------------------------------------------------------------------+ //| Panel.mqh | //| Copyright 2017, Vasiliy Sokolov. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, Vasiliy Sokolov." #property link "https://www.mql5.com" #include<Panel\ElChart.mqh> class CPercentPanel : public CElChart { private: CArrayObj m_fields; CArrayObj m_values; public: CPercentPanel(void); void SetLine(int index, string field, string value); }; //+------------------------------------------------------------------+ // | //+------------------------------------------------------------------+ CPercentPanel::CPercentPanel(void) : CElChart(OBJ_RECTANGLE_LABEL) { Width(200); Height(200); } //+------------------------------------------------------------------+ //| Sets the line | //+------------------------------------------------------------------+ void CPercentPanel::SetLine(int index,string field,string value) { if(m_fields.Total() <= index) { CElChart* sfield = new CElChart(OBJ_LABEL); sfield.XCoord(XCoord()+10); sfield.YCoord(YCoord()+21*index+10); sfield.Text(field); m_fields.Add(sfield); m_elements.Add(sfield); CElChart* svalue = new CElChart(OBJ_LABEL); svalue.YCoord(YCoord()+21*index+10); svalue.XCoord(XCoord()+132); svalue.Text(value); svalue.TextColor(clrGreen); m_values.Add(svalue); m_elements.Add(svalue); if(IsShowed()) { sfield.Show(); svalue.Show(); } Height(m_fields.Total()*20 + m_fields.Total()*2 + 10); } else { CElChart* el = m_fields.At(index); el.Text(field); el = m_values.At(index); el.Text(value); } ChartRedraw(); }
このEAをコンパイルし、Si 先物コントラクトのいずれかのチャート上で起動すると、次の表が表示されます。
テーブルとしてのルーブル/ドル金利プロファイル
テーブルからもわかるように、実質的にすべての時間のセクションの金利は等しく、年率 7% にちょうどになります。 最も近い先物コントラクトは、わずかに高いレートを示しています。
重要な注意: チャートでEAを起動する前に、必要なすべての先物コントラクトのクオートが利用可能であり、事前にロードされていることを確認してください。 それ以外の場合、結果は未定義になる可能性があります。
結論
新しい CSymbol クラス CStrategy トレーディングエンジンを検討しました。 このクラスは、さまざまなシンボルプロパティへのアクセスを提供することにより、トレーディングツールのタスクを簡素化します。 CSymbol は、金利プロファイルと非自明のインジケーターを作成において、非常に興味深い実証例でした。 多くのシンボル特性は CSymbol オブジェクトから容易に得られ、計算はそれほど複雑ではありませんでした。 このEAは、6つのシンボルを同時に使用しましたが、それはコードの長さには影響しませんでした。 CStrategy は CObject から継承され、インスタンスをシンプルに標準コレクションに追加して、スケーラブルで汎用性の高いデータ処理を行うことができます。 さらに、特定の関数が CStrategy から CSymbol に移管され、CStrategy がより軽量で管理しやすくなりました。