ユニバーサルEA: シンボルプロパティへのアクセス (その 8)

20 9月 2017, 12:17
Vasiliy Sokolov
0
424

イントロダクション

以前の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日の金利を得ます。

すべての値を計算するために、さまざまなシンボルプロパティとシンボルリストを積極的に使用する必要があります。 金利プロファイルの計算メソッド:

  1. このEAは、任意の先物シンボルにロードされます。 シンボル名を分析し、すべての関連先物をロードします。
  2. 各ロードされた先物シンボルは、シンボルのリストに置かれている CSymbol オブジェクトを表します。
  3. 新しいティックが受信されると、EAはシンボルのコレクションを使用して動作します。 各シンボルの元になる資産が検索されます。
  4. 次に、このEA は、選択したシンボルの価格とその元になる資産価格の差を計算します。 この差は、その後、年間の利息に変換されます。 この目的に、先物コントラクトの残りの寿命は考慮に入れられます。
  5. この結果の違いは、パネルの表の行として表示されます。 各行は "先物名-テイクプロフィット前の日数-利率" として表示されます。

説明からわかるように、このアルゴリズムは実際には見ためほどシンプルではありません。 ただし、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 がより軽量で管理しやすくなりました。


MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/3270

添付されたファイル |
ディープニューラルネットワーク(その1)データの準備 ディープニューラルネットワーク(その1)データの準備

この一連の記事では、取引を含んだ多くの分野で応用されているディープニューラルネットワーク(DNN)の探索を続けます。ここでは、実践的な実験によって新しい方法や概念をテストするとともにこのテーマの新しい次元を探求する予定です。シリーズの最初の記事は、DNNのデータを準備することを目的としています。

一連の指標シグナルに対する単純ベイズ分類器 一連の指標シグナルに対する単純ベイズ分類器

本稿では、複数の独立した指標からのシグナルを使用して取引システムの信頼性を向上させるベイズの公式の適用を分析します。理論計算は、任意の指標で動作するように構成された単純な汎用EAで検証されます。

フラグパターン フラグパターン

本稿では、フラグ、ペナント、ウェッジ、長方形、三角形、収縮三角形、膨張三角形のパターンを分析します。それらの類似点と相違点を分析するだけでなく、パターンを検出するための指標、及びその有効性を迅速に評価するためのテスター指標を作成します。

MetaTrader5のカスタムウォークフォワード最適化 MetaTrader5のカスタムウォークフォワード最適化

この記事では、MQL で実装された組み込みのテスターおよび補助ライブラリを使用して、ウォークフォワード最適化による正確なシミュレーションを扱います。