水平線を表示させるインジケーター
この記事では、cTraderのカスタムインジケーターを作成し、Shiftキーを押しながらマウスクリックするだけでチャート上に水平線を描く方法を説明します。
cAlog コード全文
using System;
using cAlgo.API;
namespace cAlgo
{
[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
public class NewIndicator : Indicator
{
[Parameter("水平線色", DefaultValue = "Pink")]
public Color ShiftKeyColor { get; set; }
[Parameter("線の太さ", DefaultValue = 3)]
public int Thickness { get; set; }
protected override void Initialize()
{
Chart.MouseDown += Chart_MouseDown;
}
private void Chart_MouseDown(ChartMouseEventArgs obj)
{
if (obj.ShiftKey == true)
{
double price = obj.YValue;
DateTime startTime = obj.TimeValue;
DateTime endTime = startTime.AddDays(10000); // 長い水平線を描く
string lineId = "トレンドライン" + DateTime.UtcNow.Ticks;
Color color = ShiftKeyColor;
ChartTrendLine rect = Chart.DrawTrendLine(lineId, startTime, price, endTime, price, color, Thickness, LineStyle.Solid);
rect.IsInteractive = true;
}
}
public override void Calculate(int index)
{
}
}
}
コードの全文です。
下記見出しで解説します。
名前空間のインポート
using System;
using cAlgo.API;
using System;
: これは、プログラムで標準的なC#の機能を使えるようにするための宣言です。たとえば、コード内で日付や数学関数を扱うために必要です。using cAlgo.API;
: これは、cAlgo.APIという特別なライブラリをプログラムに取り込むための宣言です。このライブラリは、外国為替市場などで自動取引を行うための機能を提供します。
名前空間の定義
namespace cAlgo
{
“namespace”とは、プログラミング言語で一連のコードをグループ化したり、名前を管理したりするために使われるものです。これを用いることで、大規模なプロジェクトで名前の衝突を防いだり、関連するクラスや機能を一緒にまとめたりすることが可能になります。
“cAlgo”はこの場合、そのネームスペースの名前です。このネームスペース内にあるすべてのクラスや関数は”cAlgo”という名前の下にまとめられます。
インジケータクラスの定義
[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
public class NewIndicator : Indicator
ここでは、NewIndicator
という新しいクラスが定義されています。このクラスはIndicator
クラスを継承しており、この継承によってIndicator
クラスが持つ機能をNewIndicator
クラスも利用できるようになっています。
クラスの上にある[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
という部分は、アトリビュートまたはデコレータと呼ばれるもので、クラスの振る舞いや特性を追加または変更します。この特定のアトリビュートは、このクラスがチャートの上にオーバーレイされるべきインジケータであること(IsOverlay = true
)、そしてこのインジケータが特別なアクセス権を必要としないこと(AccessRights = AccessRights.None
)を示しています。
プロパティの定義
[Parameter("水平線色", DefaultValue = "Pink")]
public Color ShiftKeyColor { get; set; }
[Parameter("線の太さ", DefaultValue = 3)]
public int Thickness { get; set; }
[Parameter("水平線色", DefaultValue = "Pink")] public Color ShiftKeyColor { get; set; }
:ShiftKeyColor
という名前のプロパティを定義しており、その型はColor
です。これは水平線の色を表しています。[Parameter("水平線色", DefaultValue = "Pink")]
という部分は、このプロパティがパラメータであることを示しています。また、そのデフォルト値は”Pink”(ピンク)です。
[Parameter("線の太さ", DefaultValue = 3)] public int Thickness { get; set; }
:Thickness
という名前のプロパティを定義しており、その型はint
(整数)です。これは線の太さを表しています。[Parameter("線の太さ", DefaultValue = 3)]
という部分は、このプロパティがパラメータであることを示しています。また、そのデフォルト値は3です。
これらのプロパティの値は、プログラムの実行時に設定または変更することができます。
Initializeメソッドの定義
protected override void Initialize()
{
Chart.MouseDown += Chart_MouseDown;
}
このコードスニペットは、Initialize
という名前のメソッドを定義しています。このメソッドはprotected
(保護された)とマークされており、これはこのメソッドがこのクラスおよびその派生クラスからのみアクセス可能であることを示しています。override
キーワードは、このメソッドが基底クラスであるIndicator
のInitialize
メソッドを上書き(オーバーライド)することを示しています。
Initialize
メソッド内部では、Chart.MouseDown
イベントにChart_MouseDown
メソッドをリスナーとして追加しています。これは、マウスがチャート上で押下されたときにChart_MouseDown
メソッドが呼び出されることを意味します。そのため、このメソッドはチャート上でマウスの押下操作を捕捉するために初期化作業を行います。
イベントハンドラの定義
private void Chart_MouseDown(ChartMouseEventArgs obj)
{
if (obj.ShiftKey == true)
{
double price = obj.YValue;
DateTime startTime = obj.TimeValue;
DateTime endTime = startTime.AddDays(10000); // 長い水平線を描く
string lineId = "トレンドライン" + DateTime.UtcNow.Ticks;
Color color = ShiftKeyColor;
ChartTrendLine rect = Chart.DrawTrendLine(lineId, startTime, price, endTime, price, color, Thickness, LineStyle.Solid);
rect.IsInteractive = true;
}
}
このコードスニペットは、Chart_MouseDown
という名前のメソッドを定義しています。このメソッドはマウスがチャート上で押下されたときに呼び出されます。メソッドのパラメータobj
は、マウスの押下イベントの詳細を含むChartMouseEventArgs
オブジェクトです。
メソッドの中では、Shiftキーが押されている(obj.ShiftKey == true
)ときに次の処理を行います。
- マウスの位置に対応する価格(
double price = obj.YValue;
)と時間(DateTime startTime = obj.TimeValue;
)を取得します。 - 長い水平線を描くための終了時間を設定します(
DateTime endTime = startTime.AddDays(10000);
)。 - ユニークなIDを生成します(
string lineId = "トレンドライン" + DateTime.UtcNow.Ticks;
)。 - 既定の色(
Color color = ShiftKeyColor;
)と太さ(Thickness
)で、取得した価格と時間を使用してトレンドラインを描画します。このトレンドラインは水平線となり、始点と終点の価格(Y座標)は同じです。 - 生成されたトレンドラインは対話式として設定され、ユーザーがそれをクリックしたりドラッグしたりすることが可能です(
rect.IsInteractive = true;
)。
Calculateメソッドの定義
public override void Calculate(int index)
{
}
このコードスニペットは、Calculate
という名前のメソッドを定義しています。このメソッドはpublic
(公開)とマークされており、これはこのメソッドがこのクラスの外からでもアクセス可能であることを示しています。override
キーワードは、このメソッドが基底クラスであるIndicator
のCalculate
メソッドを上書き(オーバーライド)することを示しています。
Calculate
メソッドには整数型のパラメータindex
がありますが、メソッドの中身は現状空です。これはこのメソッドが何も実行しない、すなわち特に何も計算しないことを意味します。ただし、このメソッドは通常、チャートの更新時に新たな価格データが追加されたときなどに、インジケータの計算を行うために使われます。現在のところ、このCalculate
メソッドは何も実行しないため、将来的に必要に応じてこのメソッドの中に計算ロジックを追加することが可能です。
コメント