クラスやメンバに属性を付与するAttribute
cBot作成時に生成されるテンプレートのクラス定義を見てみましょう。
namespace cAlgo.Robots{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class cTradersLife : Robot {
[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }
この2行目と4行目、プログラム経験のある方でもC#に馴染みがないと「この[カッコ]なに?」って感じですよね。
これはC#特有の構文で、クラスやメンバに属性(attribute)を付与するものです。
namespace cAlgo.Robots{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
// このクラス↓は(TimeZone=...)のRobotにします
public class cTradersLife : Robot {
[Parameter(DefaultValue = 0.0)]
// このメンバ↓は(DefaultValue=0.0)のParameterにします
public double Parameter { get; set; }
Attributeの型名は基本的に~Attributeとなっていますが、指定するときは[Robot]のようにAttributeを省略できます。
Attributeのプロパティ
cAlgoで使用するAttributeはプロパティを持ちます。
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]の()内がプロパティです。「これは(アクセス権限はなくて、UTC標準のタイムゾーンで動く)Robotですよと指定してるわけです。
プロパティは一つ一つ プロパティ名=値 の形で指定する必要があります。名前付きのプロパティを持たずに[Levels(20.0, 80.0)]のように直接数字を指定するだけのものもあります。
cAlgo内での使い方
cAlgoでは「cTrader本体に使い方を教えてあげるラベル」程度に考えておけば構いません。ほぼcBotもしくはIndicatorを作成し始めるとき最初に設定で使うだけです。
しかもほぼテンプレートで自動出力されてるので、やることは[Robot]や[Indicator]のプロパティを変更したり、どれが[Parameter]でどれが[Output]か指定する程度です。
以下にcAlgoで定義されているAtrributeを一通り示します。なお、プロパティはコード上では {get; set;}ですが、Attributeのプロパティは使い方が全く異なるため {get; set;}の記述は省略します。
cBot作成で使用するAttribute
RobotAttribute
これが付与されたクラスはcBot本体として扱われます。
プロパティ
(AccessRights) AccessRights
アクセス権限を指定します。プログラムがcTraderの外側に手を出す場合にどこまでやっていいのか権限を指定します。.None以外にすると起動時に警告が出ます。
(TimeZone) TimeZone
タイムゾーンを指定します。BarのOpenTimeなどで取得した時の時間がこのタイムゾーンになります。DataTime.Nowなどは影響を受けませんので注意してください。
ParameterAttribute
付与されたメンバ変数はcBotやIndicatorの外部から設定できるパラメータとなります。詳細は別記事書きました。
-
ParameterAttribute【cAlgo API】
外部から設定可能なパラメータ cBotやインジケーターのパラメータとして外部からユーザーが選択できる項目を表すために、MT4のEAではexternやinputというキーワードを使用して指定しますが、c ...
続きを見る
プロパティ
(string) Name
パラメータの表示名を指定します。プロパティ名を記述せずに[Parameter("name", ...)]と指定します。指定しなければメンバ変数名がそのまま表示されます。(サンプルコード参照)
(メンバの型) DefaultValue
既定値を指定します。起動しようとしたときに最初から入ってる値です。実際のプロパティ自体の型はobjectですが、メンバの型を入れてください。
(string) Group
パラメータのグループを指定します。
(メンバの型) MinValue
パラメータの最小値を指定します。数値型専用。
(メンバの型) MaxValue
パラメータの最大値を指定します。数値型専用。
(double) Step
設定画面で上下ボタンを押したときのパラメータの増減値を指定します。
サンプルコード
public class HelloWorld : Robot {
[Parameter("期間",DefaultValue = 25)]
public int Period { get; set; }
インジケータ作成で使用するAttribute
上記ParameterAttributeに加えて下記を使います。
IndicatorAttribute
付与されたクラスはIndicatorとして扱われます。Robotと同じ2つのプロパティに加えて下記を持ちます。
プロパティ
(bool) IsOverlay
重ねて表示するか別窓で表示するか。指定しないとfalse(別窓表示)です。
(bool) AutoRescale
自動でスケール調整をするかどうか。IsOverlay=trueのインジケータで、trueだと画面にインジケーターを表示させるよう自動調整されます。IsOverlay=falseの場合は違いがよくわかりません。指定しないとtrueです。cTraderはRescale周りもうちょい頑張ってほしいです(愚痴)
(int) ScalePrecision
数値を表示する際の小数点以下の桁数を指定します。
OutputAttribute
付与されたメンバはインジケータの表示に使われます。
プロパティ
(string) Name
表示する名前を指定します。プロパティ名を記述せずに[Output("name", ...)]のように指定します。
(string) LineColor
ラインの色を指定します。既定値は"Green"です。
(PlotType) PlotType
表示するのが線か点かヒストグラムかをPlotTypeで指定します。既定値はPlotType.Lineです。
(LineStyle) LineStyle
ラインスタイルをLineStyleで指定します。既定値は普通の線LiseStyle.Solidです。
(double) Thickness
線の太さをしてします。既定値は1.0です。
(bool) IsHistogram
ヒストグラムにするかどうか。
LevelsAttribute
必要なら指定します。指定位置に基準線を表示させたいときに[Indicator]と並べて使います。
プロパティ
(double[]) Levels
水平線を表示する場所。プロパティ名は記述せずに[Lebels(20.0, 80.0)]のように指定します。必ず指定する必要があります。
CloudAttribute
一目均衡表の雲みたいなの作りたいときに。[Indicator]と並べて使います。付与すると2本のラインの間を雲みたいな表示にできます。
プロパティ
(string) FirstLineName (string) SecondLineName
間を雲にしたい2本のラインのそれぞれの名前。プロパティ名を記述せずに[CloudAttribute("firstLine", "secondLine")]のように指定します。必ず指定する必要があります。
(Color) FirstColor
雲の色。指定しないと1本目のラインと同じ色になります。
(double) opacity
雲の不透明度。0~1の間の値で指定します。defaultは0.2。
関連する列挙型
Outputのプロパティで使用するPlotTypeとLineStyleは以下のメンバを指定します。
PlotType列挙型
Line | 線 (データ欠損があっても存在するデータ同士をつなぐ) |
DiscontinuousLine | つながらない線(データ欠損があった場合、途切れる) |
Points | 点 |
Histogram |
ヒストグラム |
LineStyle列挙型
ちなみにこれはChartTrendLineなどでも使用します。
Solid | 線 |
Lines | 途切れ線 _ _ _ _ _ _ _ _ _ _ |
Dots | 点線 .......... |
DotsRare | 間が空いた点線 . . . . . . . . . . . . |
DotsVeryRare | もっと間が空いた点線 . . . . . . . . . . . |
LinesDots | 線+点 _ . _ . _ . _ . _ . |
その他cAlgoのAttribute
一応、リファレンスにあるので挙げておきますが、使いません。
(2021/7/20 追記) 気づいたら使えなくなっており、リファレンスからも消えています。ver4.0にて削除?
HideFromIntellisenceAttribute
旧式のメンバについていて、インテリセンスで表示されないようになっているみたいです。名前付きプロパティはありません。
System.ComponentModelの[EditorBrowsable(EditorBrowsableState.Never)]の組み込み環境版でしょうか。手元で試してみましたがよくわかりませんでした。同じアセンブリ内で機能しないとこも同様なのかもしれません。
でも、そもそも組み込み環境だと別アセンブリではインテリセンスがきいていない気がするんですけど・・・
余談ですが、attributeという用語はプログラミング言語によっては違う意味合いになったりしますので、検索の際はご注意を。