CRTIndicatorを使用してストップロスとテイクプロフィットのレベルを設定するcBotを作成しました。
アイデアは、前のローソク足(CandleIndexで指定)のCRTレベル(高値、中間、安値)を使用して、新しい取引のストップロスとテイクプロフィットを設定することです。
手順:
- ある条件(テスト用のパラメータとして定義する)に基づいて取引(買いまたは売り)を開くcBotを作成します。
- CRTIndicatorを使用して、前のローソク足(ユーザーが設定するローソク足インデックス)からレベルを取得します。
- 買い取引の場合、ストップロスを参照ローソク足のCRT低値に、テイクプロフィットをCRT高値に設定します。
- 売り取引の場合、ストップロスを参照ローソク足のCRT高値に、テイクプロフィットをCRT低値に設定します。
ただし、私たちが持っているCRTIndicatorは各ローソク足のレベルを計算してプロットするだけです。
cBotからインジケーターにアクセスして、関心のある特定のローソク足の値を取得する必要があります。
cBotの設計をしましょう:
パラメータ:
- CandleIndex:どの前のローソク足を使うか(0 = 現在、1 = 前の足、など)
- TradeType:テスト用に買いと売りを選択するパラメータを設定するか、移動平均クロスオーバーのようなシグナルを使って決定します。
簡単にするために、取引タイプを選択するパラメータを作りましょう。
ただし注意:ライブ取引では、エントリーのためのいくつかの条件を使用します。既存のポジションがなければ現在のローソク足で取引を開く単純なcBotを作ります。
チャートの時間枠で取引していると仮定します。
cBotの手順:
- ポジションが開いているか確認し、なければ開くことを検討します。
- 指定されたCandleIndex(現在に対して過去のローソク足)についてCRTIndicatorの値を取得します。
- 買い取引の場合:
ストップロス = 参照ローソク足のCRT低値
テイクプロフィット = 参照ローソク足のCRT高値 - 売り取引の場合:
ストップロス = 参照ローソク足のCRT高値
テイクプロフィット = 参照ローソク足のCRT低値
ただし、インジケーターは各インデックスごとに計算しています。固定のCandleIndexオフセットを使っているため、すべてのインデックスで同じ値をプロットしています。
しかしcBotでは、指定されたCandleIndexのために現在の時間(最新の完了したローソク足)でインジケーターからレベルを取得したいのです。
重要:インジケーターのCalculateメソッドは各インデックスで呼ばれ、現在のインデックスで参照ローソク足(インデックス - CandleIndex)の値を保存します。
したがって、特定の過去のローソク足のCRTレベルを取得したい場合は、そのローソク足のインデックスでインジケーターの出力シリーズを読み取ればよいのですか?
ただし注意:インジケーターの出力は現在のインデックスに合わせられています。実際、インジケーターは以下のように設定しているため、すべてのバーで同じ値をプロットしています:
CRTHigh[index] = crtHigh; // crtHighは(index - CandleIndex)ローソク足の高値
つまり、インデックス100でCandleIndex=1の場合、インデックス99の高値を取得してインデックス100にプロットしています。
これは、CandleIndex本前のローソク足のCRTレベルを取得したい場合、現在のバー(インデックス)でインジケーターの出力を取得すれば、そのCandleIndex本前のレベルが得られることを意味します。
しかし、cBotではOnBarまたはOnTickを実行します。最も最近完了したバー(インデックス = MarketSeries.Close.Count - 2)に関心があり、欲しいローソク足は(現在のインデックス - CandleIndex)です。
または、インジケーターを変更して参照ローソク足と同じインデックスでレベルを出力することもできますが、その場合はプロットをCandleIndex分シフトする必要があります。
しかし現在のインジケーターは、前のバーから現在のバーにレベルをプロットするように設計されています。したがって、CandleIndex=1の場合、各バーで前のバーのレベルをプロットしています。
cBotでの使い方:
cBotにインジケーターを追加し、最も最近のバー(インデックス = MarketSeries.Close.Count - 1)の値を取得します。これによりCandleIndex本前のバーのレベルが得られます。
例:
現在のバーのインデックス = 最終バー(インデックス = MarketSeries.Close.Count - 1)
このインデックスでのインジケーター出力(CRTHigh[MarketSeries.Close.Count-1])は、(現在のインデックス - CandleIndex)バーの高値です。
ただし、インジケーターのCalculateメソッドは各過去バーおよび新しいバーごとに呼ばれます。したがって、最終バーの出力シリーズには欲しい値が含まれています。
cBotのコードを書きましょう:
パラメータを用意します:
[Parameter("Candle Index", DefaultValue = 1, MinValue = 0)]
public int CandleIndex { get; set; }
[Parameter("Trade Type", DefaultValue = TradeType.Buy)]
public TradeType SelectedTradeType { get; set; }
[Parameter("Volume (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Volume { get; set; }
CRTIndicatorのインスタンスも作成します。
OnBarの手順:
ポジションがなければ、現在のバーのインジケーター出力(CandleIndex本前のレベルに対応)からストップロスとテイクプロフィットを設定して新規ポジションを開きます。
ただし注意:インジケーターの現在のバー(最終バー)に対する出力は(現在のバーのインデックス - CandleIndex)のレベルに設定されています。しかし最初の方では十分なバー数があることを確認する必要があります。