cTraderがなくてもcBotが作れる!
cTraderなしにcBot作る人なんているのかわかりませんが、まぁとにかくcTrader4.2からはcBotやインジケーターを作る際にcTrader本体は不要になりました。
これにより開発環境の縛りが一切なくなったため、普段使い慣れた環境でcBotやインジケーターが作成できます。
ここではVS CodeでのcBot開発方法を紹介しようと思います。Windows前提で話は進めますが、MacやLinuxでも適宜読み替えていただければ開発自体は可能です。
あえて「VS Codeで開発したい!!」と思う人なんてVS Code使ってる人以外にはいないと思うので、VS Codeについては詳しく説明しませんし、この記事はある程度プログラム経験がある方向けと思って書きます。
cTrader公式ページ
なお、VisualStudio Codeを使った開発方法については公式でもちゃんと説明があります。
Using Visual Studio / Other .NET IDEs - cTrader Automate API
以下はこの公式の情報を参考に手順を解説したものです。
(2023/8/13追記)
cTrader 4.8以降ではVS Codeでの編集に対応済み
cTrader4.8からは組み込み開発環境のツールバーから「Visual Studio Codeで編集」を選ぶだけでVS Codeが利用できるようになりました。
下記の手順は基本的にcTrader 4.7以前をお使いの方向けの説明です。
(cTrader4.8以降だとしても.Net 6 SDK & C#拡張機能までは必要です。)
VS Codeを使ったcBot開発
ちなみにIndicatorも最初にフォルダ作る場所が違うのと、コピペするテンプレートが違う以外は完全に同じです。
前準備
.Net 6のSDKが必要です。SDKだけ入れてもいいですが、何も考えずにVisual Studio 2022をインストールしてしまうのが楽です。
Visual Studio 2022 の新機能 | 無料ダウンロード - Visual Studio (microsoft.com)
画像のCommunity2022をクリックするとダウンロードされますので、それを実行します。
インストーラーが準備されこの画面がでたら.Netデスクトップ開発だけチェック入れてインストールしておけば必要なものが一式入ります。
VS Codeの拡張機能
VS Codeはインストール済みですよね?
C#拡張機能が必要です。入ってない場合は追加しておいてください。
必須の拡張機能はこれだけです。
この先も一応説明しますが、この後の手順は自動化スクリプトを用意しましたので、よかったら記事最後のダウンロードリンクからどうぞ。
フォルダ作成
マイドキュメントのcAlgo/Sources/Robotsに新しいフォルダを作成して好きな名前をつけます。HellocBotとでもしときましょうか。
そしたらこれを右クリックして「Codeで開く」を選択します。
「Codeで開く」がメニューになければシェルでも開いてcode ./HelloCBot
とでもしてVSCodeでこのフォルダを開いてください。
プロジェクト作成
VS Codeが開いたらターミナルを開いておいてください。Ctrl+Jで開くはず。
あとはここに公式にある通りのdotnetコマンドをひたすら打ち込むべし。
dotnetコマンドはVisualStudio入れてれば使えるようになってるはずです。(多分SDKだけでも使えるはず。)
HelloCBotの部分は自分でつけた名前に読み替えてくださいね。
dotnet new sln
dotnet new classlib --name HelloCBot -f net6.0
dotnet sln add .\HelloCBot\HelloCBot.csproj
dotnet add .\HelloCBot\HelloCBot.csproj package cTrader.Automate
順番にソリューションの作成 - クラスライブラリプロジェクトの作成 - プロジェクトをソリューションに追加- cTrader用のNugetPackageを追加しています。
(cTraderのcBotやインジケーターの実態はライブラリなのでクラスライブラリプロジェクトとして作成します。)
テンプレートをコピペ
Class1.csというファイルにcBotテンプレートをコピペします。Class1.csという名前が気に食わなければ変えても構いません。
このファイルがcBotのメインソースコードになり、cTrader組み込みの環境で開いたときはこのファイルが表示されます。
ここにcBot用テンプレートをコピペします。
using cAlgo.API;
namespace cAlgo.Robots;
[Robot(AccessRights = AccessRights.None)]
public class MyRobot : Robot
{
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }
protected override void OnStart()
{
// To learn more about cTrader Automate visit our Help Center:
// https://help.ctrader.com/ctrader-automate
Print(Message);
}
protected override void OnTick()
{
// Handle price updates here
}
protected override void OnStop()
{
// Handle cBot stop here
}
}
インジケーターならこっち。
using cAlgo.API;
namespace cAlgo;
[Indicator(AccessRights = AccessRights.None)]
public class MyIndicator : Indicator
{
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }
[Output("Main")]
public IndicatorDataSeries Result { get; set; }
protected override void Initialize()
{
// To learn more about cTrader Automate visit our Help Center:
// https://help.ctrader.com/ctrader-automate
Print(Message);
}
public override void Calculate(int index)
{
// Calculate value at specified index
// Result[index] =
}
}
cTraderで「新規作成」したときにでてくる初期テンプレートですね。
ここからあとは好きに編集してください。
ビルド
ビルドもコマンドで一発
dotnet build --configuration Release
ソースコード付きならこう
dotnet build --configuration Release -p:IncludeSource=True
出来上がり
ここまでで(Windows環境なら)もうcTraderで使える形で配置されています。
実際は作ったものを動かしてみないとなんとも言えないのでcTraderを一切開かずに開発するというのは非現実的ですが、ちょっとしたインジケーターであればAutomate画面は一切開かずに作れちゃいますね。
一つずつコマンド打つのが面倒な人へ
「VS Codeは使いたいけどdotnetコマンドで一つずつ作ってくのめんどくない?」という私のようなものぐささんのために(というか私のために)コマンド一発で新しいcBotやインジケーターのテンプレートを作成するスクリプトを用意しました。Windows専用です。
ダウンロード方法
下記リンクをクリックするとブラウザ上に中身が表示されます。コマンドが羅列してあるだけなので、なんとなく何してるかわかると思います。
(2023/5/7 追記) PCに.net7が入ってると7を使おうとしてしまいビルドできないため、フレームワークを.net6指定にしました。 (追記終わり)
使用する場合は右クリックから「名前をつけてリンク先を保存」を選んでパスの通ってるところにダウンロードしてください。
使い方
ctindi 新indicator名
ctbot 新cbot名
このコマンドで勝手にプロジェクト作成からテンプレート挿入、VS Codeを開くところまで一気にやってくれます。
ついでにビルドタスクも作るのでVS CodeでCtrl+Shift+Bでビルド可能になります。
使用上の注意
コマンド実行用です。ダブルクリックしないでください。(多分何も起きません)
また、実行には.Net6 SDKとVisualStudioCodeがインストールされてる必要があります。ない状態で実行すると中途半端にフォルダとか作られた状態で落ちると思いますのでご注意ください。
ざっと作って自分で使ってるだけであまりテストしてません。自己責任のもと利用いただけるようお願いします。
なにを血迷ったかbatファイルなんぞで書いてしまったのであまり編集したくないのですが、おかしなところくらいは直しますので言ってください。
使う人が多いようであればなんかしら別の方法でちゃんと作ります。
(2023/5/9 追記)
Windows11での注意点
Windows11ではOneDrive同期が自動的に有効になっており、そのままだとcAlgoフォルダがOneDriveフォルダ内に作られてしまうことがあるようです。この場合はbatファイルはそのままでは使えません。(動きますが、ソースコードが別のところに入ってしまいます)
そもそもこの機能、無料のままではすぐに容量不足のエラーに見舞われるやっかいなものですので、OneDriveに課金予定のない方はWindows11を使い始めたらまずはOneDrive同期機能をOFFにすることのをお忘れなく。(私は気づかずあとから面倒なことになりました・・・)
OneDrive有料会員の方は同期機能を使う方もいるかもしれません。その場合に上記batファイルを使うなら内部のフォルダ名を書き換えて利用してください。
(2022/8/17 追記)
新規作成後インテリセンスがうまく効かない場合
私の環境だけかもしれませんが、新規作成後にomniSharpのエラーがでてインテリセンスが効かないことがあったので、解決方法をメモしておきます。どうもスクリプトの使用有無にかかわらずときどき起きる現象のようです。
dotnet clean
- obj/Debug下の.Net6.0をフォルダごと削除
- ビルド
- コマンドパレットから restart omniSharp する
これでインテリセンスが効くようになるはずです。