サインツールを手軽に作りたい
サインツールってあるじゃないですか。こんな感じで売買タイミングを示してくれるインジケーター。
もちろんサイン通りに機械的にエントリーするなんてもってのほかですが、決められたルールでサインが出たときだけエントリーするかどうか検討する、みたいな使い方をしている人は多いと思います。
今回はcTraderでこんなのを作ってみましょうというお話です。
単純なサインの出し方
例えば、終値が20期間MAを超えたら矢印でサイン出したいとしましょう。こんな感じかな、と。
SimpleMovingAverage _sma;
protected override void Initialize() {
_sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
}
public override void Calculate(int index) {
if (Bars.ClosePrices[index] > _sma.Result[index]) {
Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
}
}
ただ条件判定して価格部分にChart.DrawIconでアイコン描いただけです。
でもこれだと少し問題があります。このあと、値が戻ってMAを下回ってもサインが残ってしまうのです。
おそらくこの類のサインであれば本当に知りたいのは「バー更新時に前の足の終値がMAを上回ったか」だと思います。
であれば、バー更新時だけ条件判定しましょうか。
SimpleMovingAverage _sma;
DateTime _lastTime;
protected override void Initialize() {
_sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
Bars.Tick += _=> {
if(_lastTime != Bars.LastBar.OpenTime) {
OnBar();
_lastTime = Bars.LastBar.OpenTime;
}
};
}
private void OnBar() {
var index = Bars.Count - 2;
if (Bars.ClosePrices[index] > _sma.Result[index]) {
Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
}
}
IndicatorにOnBarメソッドはないので、自分で用意してあげる必要があります。(BarOpendイベントやIsBarOpenみたいなプロパティはあてにならないので非推奨)
とりあえずこれで更新時だけサイン判定ができるようになりました。
しかし、これだとリアルタイムでの判定はできません。実際はリアルタイムで条件満たしたら未確定でも一旦表示してほしい、ということも多いでしょう。
ついでにいうと、これだけだと過去のサインは表示されません。表示させたければ、Calculateに別にロジック書くか、過去分判定用処理をどこかで別にする必要があります。
いろいろ考えると結構面倒
ただサイン出すだけのツールとは言え、作ってるといろいろ出てきて結構大変そうですよね。毎回サインツール作るたびにこんな共通ロジック部分に時間かけるのもばからしいです。
というわけで、これらの要望を簡単に満たすべく、サインインジケーターのテンプレートとなるIndicatorを作成しました。
これを使えば面倒なことを考えずとも条件判定ロジックのコードを書くだけで、サインインジケーターが作成できるようになります。
SignToolsTemplete
主な機能
・サインはリアルタイムで表示されます。未確定のバーでは出たり消えたり繰り返します。
・サインが出たら音声とチャートに色付けてアラートを出すことができます。(アラートの色はチャートがアクティブな状態で何かキー押せば消えます。)
・アラートを出すタイミングも指定できます。「その足で最初に条件満たした時点」か「毎回条件満たす度」か「サイン確定時 (足更新時) 」かのいずれかで指定します。
・検証用に過去チャートでサインが出てる場所にボタン一つでジャンプできます。(冒頭画像の右下のボタン)
ダウンロード
こちらからどうぞ。サンプルとして2本のMAのゴールデンクロス、デッドクロスでサインを出すツールになってます。
Indicatorクラスの中身を自由に書き換えて、お好きなサインツールを作成してください。
使い方
ダウンロードしたサンプルを見ればなんとなくわかるかもしれませんが、一応解説します。
仕組みとしてはSignIndicatorクラスにサイン表示やアラートを丸投げしてるだけです。作成者がやることは判定用のメソッドを作って、SignIndicatorオブジェクトに登録するだけ。
①判定用メソッドを作成
まずはどんなときにサインを出すかの判定メソッドを作成します。このメソッドで受け取るindexはCalculateのindexと同様のバーインデックスです。
ダウンロードしたサンプルをそのまま使うのであればBuyOrSellメソッドの中身を消して、ここに判定ロジックを書いてください。
//-------------------------------------------------------------------
// サイン判定メソッドはこんな感じで用意
// 必ずindexを受け取ってTradeTypeかnullを返す形にする
public TradeType? BuyOrSell(int index) {
// --- ここで条件判定を行い、買いサイン出すならTradeType.Buy、売りサイン出すならTradeType.Sell、サインなしならnullを返す。
if (index < 1) return null;
if (LongMA[index - 1] < ShortMA[index - 1] && LongMA[index] > ShortMA[index]) {
return TradeType.Sell;
} else if (LongMA[index - 1] > ShortMA[index - 1] && LongMA[index] < ShortMA[index]) {
return TradeType.Buy;
} else {
return null;
}
}
自分で作る場合は返り値と引数の型さえ同じメソッドであれば名前は何でも構いません。
買いサインを出したいとこで、TradeType.Buyを、売りサインを出したいところでTradetype.Sellを、条件合わないとこではnullを返すようにします。
②Initialize内でオブジェクトを作成し、各種設定
Initialize内でSignIndicatorオブジェクトを作成します。コンストラクタにはthis(Indicator本体)と、①で作成した判定用メソッド名を渡します。これだけでサインツール完成です。メソッド名を渡すときは末尾に( )を付けないようご注意ください。
以下はすべてInitializeメソッド内に記述します。
// --- サインインジオブジェクト設定
var sign = new SignIndicator(this, BuyOrSell);
設定は特になにもしなくても動きますが、色やアイコンを変えたい場合はプロパティで変更可能です。
// --- 色やアイコン変えたければ変える
sign.BuyColor = Color.Blue;
sign.SellColor = Color.Pink;
sign.BuyIcon = ChartIconType.UpTriangle;
sign.SellIcon = ChartIconType.DownTriangle;
また、デフォルトではアラートは作動しませんので、サイン出た時に音声ならしたいならSoundFileにファイル名を、チャート色変えるならAlertColorに色を設定してください。音声はNotificationsプロパティのPlaySoundでここで指定されたファイルをそのまま呼び出します。
// --- 画面色替えアラート。色を設定すると有効化
sign.AlertColor = Color.Yellow;
// --- 音声アラート。ファイル名を設定すると有効化。フルパス指定の方が確実。
sign.SoundFile = "C:\\Windows\\Media\\Alarm01.wav";
// --- アラートタイミングを変更。デフォルトはUpdate(バー更新後のサイン確定時のみアラート)
sign.WhenAlert = WhenAlert.FirstAndUpdate;
アラートタイミングはデフォルトは「確定時 (足更新時) 」です。タイミングを変えたい場合はWhenAlertプロパティを変更してください。
その他
サイン表示だけであればCalculateメソッドは使用しませんが、サンプルではサインのタイミング確認のため、サイン判定に使用するMAを表示させています。この辺りはツールに応じて自由にしてください。
また、サインをトレード検証に使うなら、右下に出現する次のサイン、前のサインにチャートをスクロールするボタンが便利ですので是非ご活用ください。(不要の場合はコンストラクタの3つ目の引数にfalseを指定すれば消えます。)
SignIndicatorクラス詳細
細かい設定したい人用に。
プロパティ
(ChartIconType) BuyIcon { get; set; }
買いサインのアイコンを設定します。
(ChartIconType) SellIcon { get; set; }
売りサインのアイコンを設定します。
(Color) BuyColor { get; set; }
買いサインの色を設定します。
(Color) SellColor { get; set; }
売りサインの色を設定します。
(double) DrawMargin { get; set; }
サインの描画Y位置のマージンを設定します。買いサインはローソク足の最安値の下、売りサインはローソク足の最高値の上に表示されますが、その時価格からどのくらい空けて表示するか設定します。
(int) JumpMargin { get; set; }
◀▶ボタン押したときにサインの右側に何本分のローソク足を表示させるか設定します。
(WhenAlert) WhenAlert { get; set; }
アラートを出すタイミングを設定します。デフォルトはUpdate(バー更新後確定時のみ)。設定できるのはFirstTime(最初に条件満たしたとき)、FirstAndUpdate(最初に条件満たしたとき+確定時)、EveryTime(条件満たす度毎回)のいずれかです。
(string) SoundFile {get; set;}
アラートに音声を使用する場合、音声ファイル名を指定します。フルパス指定推奨。ファイル名のみの場合、C:¥Windows¥Mediaフォルダ内のwavファイルを探します。
(Color) AlertColor {get; set;}
アラート時にチャート色を変える場合の色を設定します。
(WrapPanel) ButtonPanel
ボタンを表示しているパネルを取得します。ボタン位置を変更したいときなどに。
メソッド
パブリックメソッドはありません。コンストラクタが一つあるのみです。
SignIndicator(Algo algo, Func<int , TradeType?> judgeMethod, [bool showButton])
1つ目の引数はIndicator本体を渡します。Algo型を取るため、cBotのRobotクラスでも使えます。
2つ目の引数はサイン条件判定用メソッドです。indexを受け取ってTradeTypeかnullを返すメソッドなら何でも構いません。
3つ目の引数はジャンプボタンを使用するかどうかのオプションです。省略するとtrueになります。使用しない場合はfalseを渡してください。