cTrader

cAlgoの基礎知識

この記事ではcAlgoを用いたプログラミングの基礎知識をご紹介します。

cTrader 3.6に対応しています。

プログラミング言語はC#

MT4の独自言語であるMQL4と違い、cTraderではC#を使いインジケーターと自動売買プログラムを作成します。
cAlgoはcTraderの開発元であるSpotwareが提供しているC#のAPIの一種です。
このAPIを使い、cTrader上で動くプログラムを作成します。

MT4上でのみにしか使われないMQL4と違い、C#は様々な場面で使われている言語な為、情報の収集が比較的容易です。
また、通常のC#でのプログラミングで使える機能は全て使用できます。

開発環境

各プロジェクトのビルドはcTraderのAutomateタブか、Visual Studioより行います。

cTraderからのビルド

cTraderの左側のメニューよりAutomateを選択し、ビルドしたいプロジェクトを選択します。
+ボタン左隣のビルドボタンをクリックするか、右クリックしてビルドをクリックするとビルドされます。

Ctrl+Bのホットキーでもビルドを行えます。

ソースコード書き込みとビルドの違い

右クリックして表示されるメニューにあるビルドは二種類あります。

通常のビルドの場合はソースコードは平文でファイルに書き込まれず、cTrader上でのみ動作する様にコードが暗号化されます。
ソースコード書き込みを選択した場合はファイルにソースコードが書き込まれ、利用するユーザーに中身が丸見えの状態になります。

ビルドした環境に限り、通常のビルドをした場合でもコードは常に表示されます。

Visual Studioからのビルド

統合開発環境(IDE)であるVisual Studioをコンパイラとして使う事ができます。
cTraderに搭載されているエディタはお世辞にも使い勝手が良いとは言えず、特に理由が無ければVisual Studioのご利用をおすすめします。

Visual Studioがインストールされた状態で、プロジェクトを右クリック→”Visual Studioを使用しないでください”を選択します。
原文は”Edit in Visual Studio”なので、これは誤訳です。


VSIXのインストーラーが実行されるので、指示に従いインストールします。

以上で下準備は完了し、以後同じ動作をするとVisual Studioが開かれます。

Visual Studioの上部にあるビルド→ソリューションのビルドを選択するとビルドが実行されます。
.algoファイルが生成されていれば問題なくビルドに成功しており、cTraderは自動的にそのファイルを読み込みます。

定義へ移動

Visual Studioでは各APIを選択してF12、もしくは右クリックして表示されるメニューから定義へ移動をクリックするとそのAPIの定義を確認する事ができます。
地味な機能ですが、この機能のおかげでいちいちオンライン上でドキュメントを漁る手間が省け、時間の節約になります。

クラスのプロパティ

クラス宣言の前に[Indicator]もしくは[Robot]の属性を付加する事により、主に五つのプロパティを設定できます。

ScalePrecision

インジケーターでのみ設定できます。

intを取ります。
チャートの右側に表示される価格の桁を指定します。
IsOverlayがtrueの場合は反映されません。

IsOverlay

インジケーターでのみ設定できます。

boolを取ります。
trueに設定すると、チャート画面にオーバーレイとして表示され、falseの場合はチャートの下画面に個別のエリアが与えられます。

AutoRescale

インジケーターでのみ設定できます。

boolを取ります。
チャート画面のスケール変更を許可するかどうかを指定します。

TimeZone

インジケーターとcBotで設定できます。

stringを取ります。
TimeZonesクラスに対応しています。
DataTimeの時間がここで指定したタイムゾーンになります。

TimeZones.TokyoStandardTimeを指定すると、DataTimeは全て日本時間に変換されますが、特定のタイムゾーンのDateTimeを取りたい時以外は特に設定する必要はありません。
DataTimeのToLocalTime()を必要な時に使えば事足ります。

AccessRights

インジケーターとcBotで設定できます。

AccessRightsを取ります。
ここで指定したAccessRightsによって、出来る事が限られます。
権限が足らない場合、SecurityExceptionの例外がスローされます。
cTraderのAutomateタブより実行している時に限り、例外が発生した場合は下のログタブから確認できます。

権限が足らない時に表示されるエラー

None以外のAccessRightsが設定されている場合、チャートへ追加時に確認のダイアログが表示されます。

アクセス権限の警告

AccessRights.None

何の権限も指定しません。
cAlgoのみで完結する場合はこちらの権限で問題なく動作します。

AccessRights.FileSystem

ファイルへの干渉を可能にします。

AccessRights.Internet

インターネット接続を可能にします。

AccessRights.Registry

レジストリの操作を可能にします。

AccessRights.FullAccess

何の制限も無い最も強い権限です。
winapiのインポートやウィンドウの作成等、.Net Frameworkの機能を際限なく使用する事が可能になります。

パラメーターの入力

各パラメーターはクラスのメンバとして宣言され、get,setアクセサを持っている必要があります。
[Parameter]の属性も必須です。

六つのプロパティが用意されています。
クラスのプロパティと違い、パラメーターのプロパティはcBotでもIndicatorでも同じです。

パラメーターの名前

一番最初にstringを入れると表示されるパラメーター名を変更できます。
指定しない場合、変数名がそのまま表示されます。

DefaultValue

デフォルトの値を指定します。

MinValue

最小値を指定します。
この数値以下に設定する事はできなくなります。

MaxValue

最大値を指定します。
この数値以上に設定する事はできなくなります。

Step

矢印ボタンをクリックした時の変動幅を指定します。

Group

同じstringをGroupに指定し、パラメーターのグループ分けをする事ができます。

この様に書くと、パラメーターの入力画面ではグループ毎にまとめられて表示されます。

パラメーターをグループ分け

チャートに計算結果を表示する

パラメーターの入力と同じように、IndicatorDataSeriesの前に[Output]属性を付与する事で、チャート上に計算結果を表示させる事ができるようになります。

[Output]属性はインジケーターでのみ有効です。

設定可能なプロパティの数も同じく六つあります。

LineColor,LineStyle,Thicknessの三つはパラメーター入力画面でユーザーが設定できます。

ユーザーが選択可能なOutputの設定


Outputの名前

stringを取ります。
一番最初にstringを入れるとパラメーター入力画面で表示されるOutput名を変更できます。
パラメーターの名前と違い、設定は必須です。

LineStyle

LineStyleというenumを取ります。
ラインの表示の仕方を設定できます。
ユーザーが後から設定を変更する事もできます。

LineColor

stringを取ります。
ラインの色を指定します。
ここで指定する色はデフォルトの色なだけで、ユーザーはパラメーター入力画面より好きな色に変更できます。
cAlgoにはColorクラスが用意されていますが、これをそのまま指定する事はできません。

“Red”,”Blue”等、stringとして色を直接指定する必要があります。

Thickness

floatを取ります。
ラインの太さを指定します。

IsHistogram

boolを取ります。
ヒストグラムとして表示するかどうかを指定します。

trueに設定した時の表示

PlotType

PlotTypeというenumを取ります。
ラインの見た目を変更します。
ユーザーが設定を変更する事はできません。

IndicatorDataSeriesに計算結果を入れる

Calculateメソッド内でindexを元に計算結果を入れればチャートへ表示されます。

主なイベントハンドラ

cAlgoのプログラミングは、ある一定のイベントが発生した時に呼び出されるイベントハンドラを定義して行います。
様々なイベントハンドラが用意されていますが、ここではcTraderのAutomateタブより追加ボタンを押した時に生成されるコードを参考に基礎的なハンドラの解説を行います。

OnStart()

cBotのイベントハンドラです。

チャートに追加された時に一度だけ呼び出されます。
各インジケーターの初期化や、ユーザーから入力されたパラメーターを元に何かの計算をここで行います。

OnTick()

cBotのイベントハンドラです。

ティック(値動き)毎に呼び出されます。
通常OnTick()かOnBar()にロジックを書きます。

OnBar()

cBotのイベントハンドラです。

新しい足が生成される度に呼び出されます。
OnTick()と同じ用途ですが、OnTick()を使ったcBotは大抵、スプレッドやスリッページの僅かな差によって結果が大きく変わるロジックばかりで、そういったcBotはバックテストでは成績が良くとも実際のトレードでは成績が振るわないという事になりやすいです。

そういったロジックを避けて、なるだけこちらのOnBar()を使ったcBotの作成をおすすめします。

OnStop()

cBotのイベントハンドラです。

cBotが停止される時に一度だけ呼び出されます。
cTraderを直接終了した場合には呼び出されず、停止ボタンをクリックした時のみ呼び出されます。

OnError()

cBotのイベントハンドラです。

名前からはわかりにくいですが、注文時にエラーが発生した時にのみ呼び出されます。
プログラムのクラッシュ時やアクセス権限が足らなかった時には呼び出されません。

Initialize()

インジケーターのイベントハンドラです。

cBotのOnStart()と同じく、チャートに追加された時に一度だけ呼び出されます。
使用するインジケーターの初期化処理等を行います。

Calculate(int index)

インジケーターのイベントハンドラです。

cBotのOnTick()と同じく、値動きがあった時に呼び出されます。
インジケーターのロジックをここに書きます。

cBotのコメント付きサンプルコード

cTraderに元から入っているSample RSI cBotはOnTick()を使い、値動きがある度に評価します。
Relative Strength Indexの値が30と70になった時に買いか売りのポジションを閉じ、それと同時にその閉じたポジションの逆のポジションを取ります。

ソースコードにコメントをつけたものがこちらです。

cAlgoにより慣れる為に

まだまだcTraderの知名度は国内外共に低く、情報が流通していない事から一見敷居が高いように感じられるcAlgoのプログラミングですが、一度慣れてしまえば後は応用でほとんどのアイデアを形にする事ができるようになります。

cTraderに元から入っているSampleや、フォーラムにあるコード、公式のドキュメントが良い参考になると思います。

関連記事一覧