cTrader5.4の新機能
cTraderがアップデートされました
お久しぶりです、ajinoriです。しばらくcTraderから離れてたのですが、久しぶりに見てみたらcTrader5.4で面白いアップデートがあったようじゃないですか。
アルゴリズム開発にpythonが利用可能になりました!
今回はもうこれだけです。
他にAPIのアップデートはあったようですが、そこまで大きなものなさそうなのでリンクだけ貼っておきます。
これまではアルゴリズム(cBot,インジケーター,プラグイン)の開発にはこれまでC#しか使えなかったのですが、これが pythonで開発できるようになりました。
今回はこの件について語りたいと思います。
使い方
新規作成画面からすすめていくとプログラミング言語選択の画面が出るのでpythonを選択します。
最初だけ必要なものをinstallするか聞かれるのでインストールを選んで進めてください。
設定が終わると
pythonコードが出てきました。最初の数行は動作させるためのおまじないだと思っておいてください。class ~ がcBotクラス本体です。
on_start, on_tickなどpython風の名前に変わってますが、そのままC#で書いたときのOnStart, OnTickに該当します。その他、on_stop,on_barなどなどそのままC#で書いてたときの名称をスネークケース(小文字+アンダスコア区切り)に変換した名前で定義可能です。
pythonで書けることのメリット
いまいち何が嬉しいのかピンとこない人も多いと思うのでajinoriが思うpythonでアルゴリズムを作れることのメリットを上げておきます。
習得しやすいメジャー言語
pythonは比較的わかりやすく習得しやすい言語と言われており、あらゆるところで使われるようになってきています。最近だとpythonからプログラミングに入る人も多いようです。
cTraderのcBot開発を他人にオススメするときも「C#の勉強にもなるよ!」というより「pythonの勉強にもなるよ!」といえたほうが魅力的です。
データ解析や機械学習のデファクトスタンダード
さらに、 データ解析や機械学習,AI関連開発などは主にpythonが使われています。
cBotがpythonで書けることでこのような手法を取り入れたcBotが作られやすくなります。
pythonで書くことのデメリット
じゃあもう全部pythonでいいかというと残念ながらそういうわけには行きません。pythonにも・・・というか cTrader開発でpythonを使うことにはデメリットもあります。 うん、試してみたらメリット全部ぶっ潰すくらいたくさんありました。
遅い
pythonは遅い です。普通に使う分にはあまり気になることはないのですが、マイクロ秒単位で少しでも早く発注入れたい!というときに使うべきではないです。そいういうシビアなプログラムはC#で作っておいたほうがいいでしょう。
とはいっても大抵のプログラムでは気にするほどではないと思います。
ビルド時のチェックが効かない
pythonにはそもそもビルドという概念がありません。
pythonで書いたcTraderアルゴの場合、本体はC#なのでビルドは必要なのですが、pythonコードは単に中に埋め込まれてるだけのため、中身がどんなにおかしくてもビルド成功 してしまうのです。
当然そんなもの動くわけもなく実行時にエラーをはいて止まります。
pythonコード部分を別にテストする仕組みを作らないとめちゃくちゃデバッグがきつくなりそうです。
開発環境は整ってない
これはpython自体のデメリットではないのですが、 cTrader周りの開発においてはまだまだC#のほうが開発しやすい 状況になっています。
というのも、これってpythonnetというライブラリを使用してpythonコードをC#プログラム内で実行させることで実現してるので、いわゆる普通のpythonプログラムではないんですよね。
私は普段VSCodeで開発していますが、この辺の事情によりpythonでcBot作ろうとするとインテリセンスがうまく効きませんし、エラー表示だらけになります。もしかしたら頑張って色々設定すれば解決できる部分はあるかもしれませんが、そこに頑張るくらいならC#で書くかな・・・と。
今のところ「一応pythonでも書けるようになったよ!」という程度で決して開発環境が整ってるとは言い難い感じがします。
いくらpythonが使いやすいとはいえこれは初学者には厳しいです。
pythonだけでは完結しない
もとがC#なこともあり、現状pythonだけで作り上げることはできません。
パラメータの定義は結局C#の.csファイルで行う 必要があります。
別にC#を知らなくても決まった書き方さえ覚えればできるので、そこまで大変ではないのですが.pyファイルと.csファイルを両方編集しなければいけないのはちょっと手間です。ついでにcTrader組込エディタだとそもそもどこから編集すればいいのかすらわからないです。
サンプルコード
ぶっちゃけデメリットのが目立つのでサンプル作るかも迷ったのですが一応・・・
MAクロスで売買するcBotをpythonで書くとこうなります。
import clr
clr.AddReference("cAlgo.API")
# Import cAlgo API types
from cAlgo.API import *
# Import trading wrapper functions
from robot_wrapper import *
class py_ma_cross:
def on_start(self):
self.label = "py_ma_cross"
# 期間は UI から設定(FastPeriod / SlowPeriod)
self.fast = api.Indicators.SimpleMovingAverage(
api.Bars.ClosePrices, api.FastPeriod
)
self.slow = api.Indicators.SimpleMovingAverage(
api.Bars.ClosePrices, api.SlowPeriod
)
def on_bar_closed(self):
# ゴールデンクロス: fast が slow を上抜け → 売りを閉じて買い
if self.fast.Result.Last(0) > self.slow.Result.Last(0) and self.fast.Result.Last(1) <= self.slow.Result.Last(1):
self._close_positions(TradeType.Sell)
api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, self.label)
# デッドクロス: fast が slow を下抜け → 買いを閉じて売り
elif self.fast.Result.Last(0) < self.slow.Result.Last(0) and self.fast.Result.Last(1) >= self.slow.Result.Last(1):
self._close_positions(TradeType.Buy)
api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000, self.label)
def _close_positions(self, side):
for p in api.Positions.FindAll(self.label):
if p.TradeType == side:
api.ClosePosition(p)
パラメータの設定の仕方
移動平均線の期間など、外部から渡すパラメータですが、これはC#のファイルで用意する必要があります。組み込み開発環境からの編集のやり方が見当たらないのですが、直接ファイル開いて別のエディタで編集してもいけます。
.pyファイルがあるフォルダを見てみてください。
windowsなら"ドキュメント/cAlgo/Sources/Robots/{cBot名}/" にあると思います。
ここに{cBot名}.csというファイルが作られてますので、その中に定義します。ここは普通にC#で書くときと同じで、上記サンプルだとこう。
using System;
using cAlgo.API;
using Python.Runtime;
namespace cAlgo.Robots;
[Robot(AccessRights = AccessRights.None, AddIndicators = true)]
public partial class py_ma_cross : Robot {
[Parameter("Fast MA Period", DefaultValue = 10, MinValue = 1)]
public int FastPeriod { get; set; }
[Parameter("Slow MA Period", DefaultValue = 30, MinValue = 2)]
public int SlowPeriod { get; set; }
}
3rd partyライブラリの使い方
サンプルでは使用してませんが、pandasやnumpyなどの外部パッケージも使用可能みたいです。公式
これも同じフォルダ内にrequirements.txtが用意されています。
この中に使いたいライブラリ名とバージョンを書くことでビルド時にpip installしてくれる・・・はずなのですが、私のとこではなんかうまく動きませんでした。
誰か試してみてください。
(書き方はpythonで使う普通のrequirements.txtと同じ)
例
pandas==2.2.2
まとめ
pythonで書けるようになったぜ!という喜びのポストだったはずが、なんか愚痴みたいなのが多くなってしまいました。
まぁC#ですでにアルゴリズム作ってる人があえてpythonに切り替えるメリットは少なそうですね。慣れてる人は「どうしてもpython使いたい部分だけpythonで書く」みたいな使い方がちょうどいいのかもしれません。
それでも 「公式公認でpythonで書けるようになった」 というのはcBot開発の裾野を広げるという点では大きな意味を持つと思います。
cTrader使いの非プログラマーだけどpythonだけならちょっとわかるぞ、という方はもしよかったらチャレンジしてみてください。
すみません、触ってて気が変わりました。使いにくすぎるし思うように動かない。これはまだ人に勧めてよいものではありませんね。もう少し成熟するまで待つことをオススメします・・・