またろうのシストレブログ

マネックス証券が提供しているトレードステーションと、MT4などシストレ関連について色々書きます。株と自動売買、EasyLanguageについても。

売気配・買気配をチャートにして描いてみる



自動売買するならスキャルピングでやってみたいと考える人はそれなりにいるかと思います。

今回は板の売気配・買気配をチャート上に描いてみます。
売気配・買気配は別の関数にして、インジケーターで描写します。

売気配・買気配

関数
REALTIME_BID

variables:
	intrabarpersist bool RealTime( false ) ;

once ( GetAppInfo( aiRealTimeCalc ) = 1 )
	begin
	RealTime = true ;
	end ;
	
if RealTime then { real-time tick - not on bar in history }
	REALTIME_BID = InsideBid
else
	REALTIME_BID = -1 ;

REALTIME_ASK

variables:
	intrabarpersist bool RealTime( false ) ;

once ( GetAppInfo( aiRealTimeCalc ) = 1 )
	begin
	RealTime = true ;
	end ;

if RealTime then { real-time tick - not on bar in history }
	REALTIME_ASK = InsideAsk
else
	REALTIME_ASK = -1 ;

インジケーター

vars:
	BidValue(0),
	AskValue(0);

BidValue = REALTIME_BID;
AskValue = REALTIME_ASK;

IF BidValue = -1 then
	NOPLOT(1)
ELSE
	Plot1(BidValue, !("買い気配"), Red, Default, 1);

If AskValue = -1 then
	NOPLOT(2)
ELSE
	Plot2(AskValue, !("売り気配"), Blue, Default, 1);

f:id:tsukinowaapp:20180703094917j:plain

1ティックチャート上に描写します。
赤が買気配、青が売気配、灰色が売買された株価(終値)、緑が移動平均(5)、オレンジが移動平均(25)です

見ての通り、1ティックだと線がジグザグするのでストラテジーを組むうえで結構使い辛いかと思います。
なので買気配と売気配を合計して2で割ったものを一定期間で平均化します。

気配の平均化

関数
ITA_AVG

inputs: 
	AvgProp(NumericSimple);

variables:
	intrabarpersist bool RealTime(false),
	double Avg(5),
	int BarCount(0),
	double TempProp(1);
	
once ( GetAppInfo( aiRealTimeCalc ) = 1 )
begin
	RealTime = true ;
end;
	
if RealTime then
BEGIN

	Avg = (InsideBid + InsideAsk) / 2;

	BarCount += 1;
	
	IF BarCount < AvgProp then
		TempProp = BarCount 
	ELSE
		TempProp = AvgProp;
	
	ITA_AVG = Average(Avg, TempProp);

END 
else
BEGIN
	ITA_AVG = -1;
END;

インジケーター

inputs: 
	AvgColor(Yellow),
	UpColor(Red),
	DownColor(Blue),
	AvgProp(5);

vars: 
	Answer(0);

Answer = ITA_AVG(AvgProp);

IF Answer = -1 then
BEGIN
	NOPLOT(1);
END
ELSE
BEGIN
	IF Answer < Answer[1] then
		Plot1(Answer, !( "板平均" ), DownColor, Default, 1)
	ELSE if Answer > Answer[1] then
		Plot1(Answer, !( "板平均" ), UpColor, Default, 1)
	ELSE
		Plot1(Answer, !( "板平均" ), AvgColor, Default, 1);
end;

f:id:tsukinowaapp:20180703105620j:plain


順に5本、25本、50本、灰色が売買された株価(終値)、緑が移動平均(5)、オレンジが移動平均(50)です。
移動平均より上下の動きが緩やかになります。
ただ、50本まで行くと移動平均と大差ない線になりますね。

次回はこの関数を使ってストラテジーを組んでみます。

アラート上げたいだけならショウミーがいいよって話



自動売買はまだちょっと怖いので
特定条件が揃ったらアラートを上げるだけにしたいって考えている人は多いんじゃないかと思ってます。
その時に使えるのが「ショウミー」という分析テクニックです。

f:id:tsukinowaapp:20180702090322p:plain

ショウミーは条件が揃うとポップアップが表示され、音を鳴らすこともできます。
設定でメールを送信することもできます。

ショウミーはインジケーターと同じ要領で設定できます。
「挿入」→「ショウミー」

f:id:tsukinowaapp:20180702101424p:plain

デフォルトで用意されているショウミー一覧

すぐに使えるショウミーが結構な数用意されています。
酒田五法も拾えるのが面白いですね。

1か月基準の高値(安値)更新
1週間基準の高値(安値)更新
1年間基準の高値(安値)更新
日中基準の高値(安値)更新
N日間基準の高値(安値)更新
インサイドバー(はらみ足)
ギャップアップ足
ギャップダウン足
ケリ足(強気/弱気)
タスキギャップ(上放れタスキ、下放れタスキ)
トンカチ
はらみ寄せ線(強気/弱気)
ハンマーまたはハンギングマン(カラカサ陽線または陰線)
ピボット・リバーサル(上昇・下落)
ピボットハイ
ピボットロー
フラクタル
ヘッド・アンド・ショルダー(三尊)
ペナントパターン・ブレイクアウト
高値・安値の更新(チャートに表示されている範囲で)
高値・安値ブレイクアウト
陰の陽はらみ・陽の陰はらみ(はらみ線)
アイランド・リバーサル(上昇・下落)
キー・リバーサル(上昇・下落)
価格反転(価格エクステンション後の反転)
丸坊主(陰・陽)
強気の包み線・弱気の包み線
三ツ星
三法(上げ三法、下げ三法)
捨て子線
出会い線(強気/弱気)
赤三兵・黒三兵
切り込み線・かぶせ線
先詰まり
同時線
南の三ツ星
包み足
明けの明星(十字星)・宵の明星(十字星)※(十字星)ありなしで2種類あるが判定が少しだけ異なる
流れ星
連続上昇・連続下落

設定方法

挿入しただけではアラートが上がらないので以下の設定を行います。
画面上で右クリック→「分析テクニックの設定」

f:id:tsukinowaapp:20180702112010p:plain

対象のショウミーを選択して「設定」
「アラート」タブをクリック

f:id:tsukinowaapp:20180702113448p:plain

「アラート有効化」にチェック。
アラート条件に一致する場合:

1回のみアラート表示 1回アラートを上げたら、以降条件が揃ってもアラートを上げない
バーごとにアラート1回(足種) 足種1本につき1回だけアラートを上げる
連続してアラート表示 ティック(取引)ごとに判定して条件が一致したらアラート(条件次第ではアラートが頻出します)

次のメッセージセンター通知設定を使用:

なし 表示しない
グローバルメッセージ設定を使用 デフォルト設定を使う場合
カスタム設定を使用 このアラート独自の設定を使う場合

下2つのいずれかを選択したら「設定」

f:id:tsukinowaapp:20180702114554p:plain

アラーム音:好みで
サウンドは結構な種類の音から選べます。音声(スピーチ用テキスト)はYou have an alertって言います。

ビジュアル:
ポップアップを出したいならチェック。表示時間も調整できます。

メール:
知り合い等に連絡したいなら設定。
※一種のメーラーなのでSMTPの設定が必要です。

ストラテジーをショウミーに改造する

ストラテジーをショウミーに改造するのはさほど難しくありません。
開発環境の「ファイル」→「新規作成」→「ショウミー」で
新しいショウミーを起こしたら、ストラテジーのソースを貼り付けて
Buyなどのポジション発行コマンドを書き換えます。

Plot1( Close, !( "買いトリガー" ));
Alert("買いトリガー");

文言は任意に書き換えてください。
Plotはチャート上に点を打つコマンドです。(どこでアラートを上げたか目安になります)
Plotは重複できないので、書き換える箇所が複数ある場合はPlot1、Plot2...という具合に加算していきます。
Alertは実際にアラートを発行するコマンドとなります。

これで基本は動くのですが、
ポジション関連のコマンドがある(MarketPositionなど)とエラーになりますので
それらをすべて削除する手間があります。


トレステで使えるインジケーター(チャート)一覧



今日はトレードステーションで使えるインジケーター(デフォルトで使えるもの)を纏めてみました。
カスタムチャート系(任意の値を設定するとその場所に線を引くもの)とファンダメンタル系は除外しました。

インジケーター一覧

〇:特に何も考慮せず使用可能
●:使用の際に設定が必要
▲:項目として存在するが、パラメーターが足りないため事実上使用不能

インジケーター名 使用可否 備考
3 重指数平滑移動平均オシレーター (TRIX) 三乗指数平滑移動平均の変化率
52 週高値・安値 日中足で使ってもエラーにならないが日足で使うのが基本
ACオシレーター  
ADX  
ADXR 現在のバーと直近の後続のバーADX 値の平均
ATR ボラティリティ  
CCI (コモディティ・チャネル・インデックス)  
CCI 移動平均 CCIをAverageで平均化したもの
DMI  
MACD  
PPOオシレーター MACDを長期指数平滑平均で割って100を掛けたもの
RCI  
ROC  
相対強度指数(RSI) 計算方法の異なる2種類あり
アームズインデックス (TRIN) 値上がり銘柄数(出来高)・値下がり銘柄数(出来高)が必要
アキュムレーション・ディストリビューション  
アキュムレーション・ディストリビューション出来高指標  
アベレージトゥルーレンジ  
アリゲーター・インジケーター XAverageOrig
アルーン・インジケーター  
アルーン・オシレーター  
アルサー・インデックス 投資家の市場行動に関連するストレスレベル
イーズ・オブ・ムーブメント 価格と取引量の関係を示す尺度
オーサム・オシレーター  
オン・バランス・ボリューム  
ギャンハイローアクティベーター  
ケルトナー・チャネル  
ゴールデンクロス  
サイコロジカルライン  
ジグザグ%  
ジグザグ・ポイント  
シャンデ・モメンタム・オシレーター  
ストラテジー累積資産曲線  
スロー・ストキャスティックス  
ダブルスロー・ストキャスティックス  
チェイキン・オシレーター  
チェイキン・ボラティリティ  
チェイキンマネーフロー  
ティピカル・プライス 高値、安値、終値の 3 つの平均
デッドクロス  
デトレンド・プライス・オシレーター  
ネガティブ・ボリューム・インデックス (NVI)  
パラボリック SAR  
ファスト・ストキャスティックス  
フィボナッチリトレース  
プライス・オシレーター  
プライス・ボリューム・トレンド  
フロア・トレーダー・ピボット 表示範囲を3日以上にする必要あり
ポジティブ・ボリューム・インデックス (PVI)  
ポラライズド・フラクタル・エフィシェンシー  
ボリューム・オシレーター  
ボリューム・レシオ 計算方法の異なる2種類あり
ボリンジャーバンド 利用用途の異なる3種類あり
マーケット・スラスト 値上がり銘柄数(出来高)・値下がり銘柄数(出来高)が必要
マーケット・ファシリティ・インデックス  
マクレラン・オシレーター 値上がり銘柄数・値下がり銘柄数が必要
マス・インデックス  
マネー・フロー・インデックス  
モメンタム  
リンダ・ラシュキの 3/10 オシレーター  
動線形回帰 (TSF)  
二重指数移動平均(DEMA)  
エーラース MESA 適応移動平均線(MAMA)  
四重指数移動平均(QEMA)  
三重指数移動平均(TEMA)  
移動平均エンベロープ  
ハル移動平均線  
加重移動平均  
三角移動平均線  
指数平滑移動平均リボン  
指数平滑移動平均  
出来高加重移動平均  
移動平均線  
適応型移動平均線  
移動平均乖離率  
一目均衡表 ウインドウの設定を変更する必要あり
価格スプレッド 2つのチャートの価格差分を出力する
価格チャネル  
価格チャネル %P  
価格変動率  
加重終値 (高値+安値+終値+終値)/4
究極のオシレーター  
自動トレンドライン  
出来高 ROC  
出来高移動平均  
垂直水平フィルター (VHF)  
線形回帰トレンド  
線形回帰曲線  
騰落レシオ 値上がり銘柄数・値下がり銘柄数が必要
日足・セッション高値・安値ライン  
買気配・売気配  
買気配・売気配ボリューム・レシオ  
板情報 気配をチャート上にアウトプット
標準誤差バンド  
標準偏差ボラティリティ  
標準偏差ボラティリティ・ストキャスティックス 日足のみ使用可能
乖離率  

思ったより沢山ありますね。
(中にはググってもよくわからないものも…)
時間があったら中のソース見て、何をしているか解説しようかと思います。

f:id:tsukinowaapp:20180701182349j:plain

表にないものは?

表に無いものや使用不可になっているものは、基本自作するかマネックスが作ってくれるのを待つしかありません。
平均足は以前作ったものがありますが
VWAPについては、
「VWAPに可能な限り近い値を算出してチャート上にアウトプットすることは可能ですが、小数点レベルまで一致した値は1ティックチャートにしない限り不可能」
のようです。

他サイトを見ながら改造したものがあるので近いうちに公開します。

トレステで一目均衡表を表示するにはセットアップが必要って話



トレードステーションには様々なチャート分析が用意されていますが、
実は最初にセットアップしないと使えないものがあります。

一目均衡表を表示するには

一目均衡表は何も考えずに挿入すると、下記のようなエラーが出ます。

f:id:tsukinowaapp:20180629085610p:plain

何のこっちゃ?って話ですが、
先行スパンって右にずらして描いているので、画面に入ってねーよ!って言ってるんですね。
なので、「ウインドウの設定」を変えてあげる必要があります。

画面上で右クリック→「ウインドウの設定」

f:id:tsukinowaapp:20180629085937p:plain

「一般」→「チャートプロパティ」の右スペースを25に設定。

f:id:tsukinowaapp:20180629090414p:plain

これで一目均衡表を挿入すれば表示されます。

f:id:tsukinowaapp:20180629090422j:plain

ちなみに私の場合ですが、だいぶ線がごちゃごちゃして見辛いことになっているので
遅行線を灰色にしています。

f:id:tsukinowaapp:20180629090551j:plain

トレステで騰落レシオは使えない?

他にも初期セットアップが必要だったり、
セットアップすべきパラメーターが無くて使えないチャートがあります。
(なんやそれ?って感じですが)
時間のある時にリストアップしますか。

騰落レシオは上昇銘柄数と下降銘柄数をセットしないといけないのですが
どうも$ADVや$DECLの東証版が無いようで実質使えないっていう…

全ての銘柄を総当たりチェックしてカウントを取るようなコードを書かないと駄目くさいです。


過去の日中足のデータをテキストファイルに吐いてみる



前回では過去の日中足のチャートを確認する方法を書きましたが
今回は四値(始値終値・高値・安値)とインジケーターで出力した値をテキストファイルとして出力する方法を書こうかと思います。

簡単な方法

予めチャート分析の「銘柄コードの設定」を出力したい設定にしておきます。
(足種や範囲(期間)など)
インジケーターの出力値もファイル出力したいのであれば、挿入しておきます。

画面上の「表示」→「データウインドウ」を押下

f:id:tsukinowaapp:20180626101834p:plain

右から2番目のアイコン、「すべて表示」を押下

f:id:tsukinowaapp:20180626101634p:plain

左端のフロッピーのアイコン、「保存」を押下
任意の場所に保存

f:id:tsukinowaapp:20180626104619p:plain

カンマ区切りなので拡張子をcsvにしたほうが良いかもですね。

コードを書く方法

インジケーターやショウミー、ストラテジーにコードを書いてファイル出力する方法もあります。

Print(File("c:\txt\data_001.txt"), DATE, ",", TIME, ",", Open, ",", Close);

出力したい場所に上記のコードを書きます。

Print文で出力場所とフォーマットを指定しています。
コードを書くという手間がありますが、
好きなフォーマットに加工できますし
作り方次第で出力条件も如何様にできるというメリットもあります。

トレステなら過去の日中足を確認することも容易だねって話


Webコンテンツから取得は困難

誰しも過去のチャートを見て戦略を立てたいと考えます。

過去の日足や週足を見たいのであればYahooファイナンスなどで確認できますが
これが日中足(時間足・分足・秒足)になると途端に難しくなります。
恐らくWebコンテンツから無償で過去の日中足を取得する方法は、事実上無いかと思います。
ひょっとしたら探し方が悪いだけかもしれませんが。
(あっても有償だったり、更新しているのか分からない状態だったり)

なので、各証券会社が用意しているトレードアプリで見てみたいと考えます。
ところが、これも限界がありまして
某証券会社の場合は足種に関係なく12000本までという制限があります。
1分足にするとおよそ20日分、秒足がないので20ティック足にすると2日分しか取れないのです。
さらに言うと期間指定ができないんですね。
つまり現在日付から過去n日分のデータしか取れないってことです。

トレステによる日中足の取得

では、トレードステーションはどうでしょうか?

各足種によって遡れる過去データに違いがあるようです。
何か月(何年)前まで取得できるか調べた結果

ティック:3か月前
出来高:3か月前
秒:2か月前
分:2007年10月1日以降
日:1991年1月4日以降
週:1991年1月4日以降
月:1991年1月4日以降

f:id:tsukinowaapp:20180625105434p:plain

分足で2007年まで遡れるのはすごいですね。

当然ながら範囲指定も可能です。
f:id:tsukinowaapp:20180625103124p:plain

最終日からn日指定、あるいは開始日指定で取ってこれます。

ちなみに秒足やティック足の場合、期間指定が大きいと取得するデータ量も増えるので
スケジュールという形で取得することになります。

f:id:tsukinowaapp:20180625103804p:plain

割と画面表示に時間が掛かったりするので、多くても20日程度に留めておいた方が良いかもしれません。

ちなみに、EasyLanguageを使って四足などの計算結果をCSV(テキストファイル)に吐き出す方法もありますので
次回書きます。

EasyLanguageの本をタダで入手する?



f:id:tsukinowaapp:20180624103352p:plain

「EasyLanguageプログラミング入門」を300名様にプレゼント
だそうです。
応募は6月30日までです。

info.monex.co.jp

トレステの口座が無くても応募可能なので、
興味のある人は応募してみては?

ちなみに私はせっかちなのでAmazonで買ってしまいました。
読み込んだら書評でも書いてみます。
ざっと見ですが、結構知らないテクニカル指標がありそうな…
(自分が無知なだけ?)


ストラテジーを組んだら最適化をしようぜって話



多くのストラテジーリテラル閾値)を使って売買の判定をしているかと思います。
しかし多くの場合、「この辺かな?」みたいな感じで、根拠なく設定しているかと。
かといって、手動で数字を変えて、テストしてでは工数が洒落にならないですね。

でも、トレステには「最適化」と言って範囲を設定すれば纏めてテストしてくれる機能があります。

最適化のやり方

前回ストラテジーを組んでみたので、今回はそれを使って最適化をしてみようと思います。

マウス右クリック→「ストラテジーの設定」
対象ストラテジーを選択状態にして「設定」を押下

f:id:tsukinowaapp:20180623100625p:plain

最適化したい項目を選択→「最適化」

f:id:tsukinowaapp:20180623100655p:plain

開始と終了にテストしたい範囲を入力。
増分は上積みしていく値(2なら8,10,12…という感じ)を指定
設定確認したら「OK」

f:id:tsukinowaapp:20180623100709p:plain

項目が画像の通りになっていることを確認して「OK」

f:id:tsukinowaapp:20180623105745p:plain

「最適化」を押下
画面が再描画されたら「表示」→「ストラテジー最適化レポート」

f:id:tsukinowaapp:20180623105957p:plain

上から総損益の高い順に表示されます。
(項目ダブルクリックでソートも可能です)

f:id:tsukinowaapp:20180623111006p:plain

テスト後は最も総損益の高い値が設定されます。

f:id:tsukinowaapp:20180623103426p:plain

最適化の結果をファイルに保存することもできます。
「結果をファイルに保存」にチェックを入れて
「参照」でファイルを保存する場所を指定して「最適化」を押下

f:id:tsukinowaapp:20180623104556p:plain

テキストファイルで結果が出力されます。

f:id:tsukinowaapp:20180623112503p:plain

カンマ区切りなので拡張子をcsvに変更したほうが見やすいかもしれません。
A列が入力値、C列が総損益です。

項目の複数指定

3本の平均線を比較する移動平均線大循環などは一つの線だけ最適化しても意味ないんじゃないの?って話ですが
実は複数の項目を指定して同時に最適化できます。

f:id:tsukinowaapp:20180623111905p:plain

テスト項目がクロスで増える分、時間は掛かりますがより適切な値を設定できるかと思います。
但しテスト項目を増やし過ぎると1時間オーバーもあり得るので、多くても3項目程度に留めたほうが良さそうです。

移動平均線大循環分析でストラテジーを組んでみる



今回は少なめのステップ数で、エントリーから決済までやるストラテジーを組んでみようかと思います。
マネックス証券移動平均線大循環分析のインジケーターを配布しています。

info.monex.co.jp

これの中身を参考にして、ストラテジーを組んでみます。

コーディング

ルールとしては、
ロング(買い)は
短期>中期>長期で、全てが上向き、MACDも上向きなら買いエントリー
短期<中期で短期が下向きになったら売り決済
ショート(空売り)は
短期<中期<長期で、全てが下向き、MACDも下向きなら空売りエントリー
短期>中期で短期が上向きになったら買い戻し決済

エントリー開始は9時30分から
14時以降はエントリーしない
14時30分に手仕舞い

[Intrabarordergeneration = true];

inputs: 
	AvgType(0),
	MAGeta(25),
	MALength1(5),
	MALength2(20),
	MALength3(40),
	MACD3SLength(20),
	MACD3LLength(40),
	StartTime(0930),
	EndTime(1430);
	
vars: 
	IntrabarPersist DaijunkanFlg(0),
	IntrabarPersist double MA1(0),
	IntrabarPersist double MA2(0),
	IntrabarPersist double MA3(0),
	IntrabarPersist macd3(0),
	EntryEndTime(1400);
	
EntryEndTime = CalcTime(EndTime, -30);

//Daijunkan
macd3 = MACD(Close, MACD3SLength, MACD3LLength);

IF AvgType = 0 then
BEGIN
	MA1 = XAverage( Close, MALength1 );
	MA2 = XAverage( Close, MALength2 );			
	MA3 = XAverage( Close, MALength3 );
END
ELSE
BEGIN
	MA1 = AverageFC( Close, MALength1 );
	MA2 = AverageFC( Close, MALength2 );			
	MA3 = AverageFC( Close, MALength3 );
END;

DaijunkanFlg = 0;
IF MA1 > MA2 + MAGeta and MA2 > MA3 and MA1 > MA1[1] and MA2 > MA2[1] and MA3 > MA3[1] and macd3 > macd3[1] then DaijunkanFlg = 1;
IF MA1 < MA2 - MAGeta and MA2 < MA3 and MA1 < MA1[1] and MA2 < MA2[1] and MA3 < MA3[1] and macd3 < macd3[1] then DaijunkanFlg = -1;

//
If MarketPosition = 0 and StartTime <= TIME and TIME < EntryEndTime then 
BEGIN
	if DaijunkanFlg = 1 then 
	BEGIN
		Buy (!("買いスタート")) next bar at market;
	END;

	if DaijunkanFlg = -1 then
	BEGIN
		Sellshort (!("空売りスタート")) next bar at market;
	END;
END;

//
IF MarketPosition <> 0 then 
BEGIN
	if MarketPosition = 1 then
	BEGIN
		IF MA1 < MA2 and MA1 < MA1[1] then
		BEGIN
			Sell (!("売り抜け")) next bar at market;
		END;
	END;
	
	if MarketPosition = -1 then 
	BEGIN
		IF MA1 > MA2 and MA1 > MA1[1] then
		BEGIN
			BuyToCover (!("買い戻し")) next bar at market;
		END;
	END;
END;

if EndTime <= TIME and TIME <= 1500 then
BEGIN
	if MarketPosition = 1 then
	BEGIN 
		Sell (!("指定時間売り抜け")) next bar at market;
	END;
	
	if MarketPosition = -1 then
	BEGIN
		BuyToCover (!("指定時間買い戻し")) next bar at market;
	END;
END;

コード解説

インジケーターのソースを見たところ、AverageFCでななくXAverageがデフォルトになっていたので
それに従っています。
XAverageとは何かっていうと、指数加重移動平均だそうです。
中身を見るとこんな計算式になっています。

SmoothingFactor =  2 / ( Length + 1 );
XAverage = XAverage[1] + SmoothingFactor * ( Price - XAverage[1] ) ;

Price は現在の株価です。
1つ前との差分をLengthで割って加算する感じですが、
単純なLengthでなく1足してから割っている所が割と謎ですね。

[Intrabarordergeneration = true];というのは
ティック(取引)が発生したら都度オーダー(発注)の判定処理を行うか、という意味です。
これをfalseにすると、足が完成したタイミングでのみ判定処理を行います。

変数の宣言の前にIntrabarPersist と付いていますが、
これを付けないと、足が完成したタイミングのみで変数が更新される仕様となります。
なので、ティック(取引)毎に値を更新したい場合はIntrabarPersist を宣言しておきます。
(フラグ管理で使う変数にIntrabarPersistがないと、想定しているタイミングで更新されないとかあります)

MarketPosition で現在のエントリー状態を調べることができます。
0でポジションなし、1でロング、-1でショートです。

TIMEで現在の時刻を4桁で拾ってこれます。
TIMEの計算はCalcTimeを使う必要があります。

ちょっとした上下でエントリーしないように
短期と中期の大小比較の際に下駄を履かせています。

バックテストしてみる

以下の条件でバックテストしてみます。
銘柄:任天堂[7974]
足種:2分
期間:20日(2018/05/25~2018/06/21)
数量:100株
ストラテジーの設定はデフォルトのまま

f:id:tsukinowaapp:20180622141510j:plain

(あくまでもバックテストの結果で利益が出たという話ではありません)

f:id:tsukinowaapp:20180622150346p:plain

f:id:tsukinowaapp:20180622150408p:plain

f:id:tsukinowaapp:20180622150431p:plain

実際にはもっと早めに利確するようなロジックを追加していくような感じでしょうか。

しかしこれにもカラクリがあって、手数料を引いていないんですね。
約定金額100万あたり400円ですから、
任天堂の場合1回の取引で1600円、往復3200円っていう…
手数料無料期間を活用するしかないですね。

トレステのマトリクスは直感的でいいねって話



トレードステーションを使う人の殆どはEasyLanguageによる自動売買に興味がある人だと思うのですが
それ以外にも良いところがあるので書いていこうかと。

マウスオペレーションで注文

トレードステーションのマトリクス(板)は
他の証券会社が用意しているツールより直感的に操作できます。

売気配もしくは買気配の上にマウスオーバーすると、注文欄に種別が表示されます。

f:id:tsukinowaapp:20180621112525p:plain

このままクリックすると、注文確認画面が表示されます。

f:id:tsukinowaapp:20180621114946p:plain

「はい」クリックで発注されます。

ちなみに、「マトリックス発注オブジェクトでは今後確認画面を表示しない」をチェックすると
注文確認画面を表示せずいきなり発注することも可能です。
(ちょっと怖いですが)

買い注文(売り注文)のあるところで指定すると指値注文になりますが、
無いところを指定すると逆指値の成行注文になります。
(指定したところまで上がった(下がった)ら成行で発注)

f:id:tsukinowaapp:20180621120040p:plain

マウスオーバーすると、株価の右端に黒い三角が表示されますが
そこにマウスポインタを重ねてクリックすると各種発注条件を指定できます。

f:id:tsukinowaapp:20180621125653p:plain

直感的に操作できるというのはGUIデザインで重要だと思っています。
他の証券会社のトレードアプリも操作したことがあるのですが
ボタンの配置が分かり辛く、発注すらままならないことがあります。
「マニュアルを読め」という話かもしれませんが
無駄に敷居を上げてしまうよりも、デザインで配慮して欲しいですよね。

「決済」「ドテン」ボタンが便利

マトリックスの画面右下の注文/ポジション操作に
注文の取消ボタンの他に
「決済」「ドテン」ボタンがあります。

トレードアプリを使っていると
返済売買をするときに売買方向を間違えてボタンを押してしまうという
経験があるかと思います。
「決済」ボタンは現在のポジション方向を意識せずに利確できるので便利です。
また「ドテン」は返済売買と反対側の新規建てを同時に出してくれるという便利なボタンです。
デイ取引で有利かと思います。


良く使う計算式は関数にしておくと便利だよって話



オリジナルのインジケーターやストラテジーを作っていくと、
同じ計算式を毎回書くのは非効率だという考えに行き着くと思います。
そういうのは関数にして呼び出した方が、効率的かつバグになりにくいです。

関数の作り方

「ファイル」→「新規作成」→「関数」
f:id:tsukinowaapp:20180620080545p:plain

名前:関数名を英数字で
メモ:任意
リターンタイプ:適切な設定を
小数点を返すならダブル、整数がいいなら整数、true/falseならブーリアン関数で良いかと。

今回は全体ティックに対しての上昇ティックの割合をオシレーター形式で表示します。
名前は UPDOWN_TICKS とします。

inputs: 
	Avg(NumericSimple);

vars:
	PriceW(0),
	ShareW(0),
	Answer(0),
	ii(0),
	BarCount(0);

if CurrentBar > 1 then 
BEGIN

	PriceW = 0;
	ShareW = 0;
	
	FOR ii = 0 to Avg - 1
	BEGIN
		IF ii < BarCount then
		BEGIN
			PriceW += UPTICKS[ii];
		END;
	END;

	FOR ii = 0 to Avg - 1
	BEGIN
		IF ii < BarCount then
		BEGIN
			ShareW += TICKS[ii];
		END;
	END;
		
	if ShareW > 0 then Answer = (PriceW / ShareW) * 100;

END;

BarCount += 1;

UPDOWN_TICKS = Answer;

関数の場合、inputsは別のソース(インジケーターなり、ストラテジーなり)から値を引き渡す形になりますので
引き渡す型を指定します。
NumericSimple:履歴値を持たない数値
NumericSeries :履歴値を持つ数値
StringSimple :履歴値をもたない文字列

履歴値とは以前説明した,、Close[1]とかいう過去の計算結果を持つ変数のことです。
ほとんどの場合、NumericSimpleで事足りるかと思います。

最終行のUPDOWN_TICKS = Answer;はJavaScriptでいう return Answer; です。

インジケーターの作り方

これをインジケーターに取り込んで表示してみます。

「ファイル」→「新規作成」→「インジケーター」
f:id:tsukinowaapp:20180620090032p:plain

名前:分かりやすい名前(日本語OK)
省略名:分かりやすい名前(日本語OK)
注記:任意
次のウインドウに適用する:デフォルトのまま(全部チェックが入っている状態)
テンプレートを選択:任意(どのみち消してしまうので)

inputs:
	Avg(25),
	ShortAvg(5);

vars: 
	Answer(0),
	ShortAnswer(0);

Answer = UPDOWN_TICKS(Avg);
ShortAnswer = UPDOWN_TICKS(ShortAvg);

Plot1(Answer, !( "ティック率1" ), DarkGray, Default, 1);
Plot2(ShortAnswer, !( "ティック率2" ), DarkMagenta, Default, 1);
Plot3(50, !( "中央" ), DarkCyan, Default, 1);
Plot4(80, !( "High" ), DarkCyan, Default, 1);
Plot5(20, !( "Low" ), DarkCyan, Default, 1);

関数から値を受け取り、画面に表示しています。
さらに中心と上下に直線のラインを引くことで、今どの状態にあるかを分かりやすくしています。

「挿入」→「インジケーター」で画面に表示されます。

f:id:tsukinowaapp:20180620092249p:plain

オリジナルのチャートやオシレーターを作ってニヤニヤ眺めるのもトレステの楽しみ方の一つですね。

マルチチャート・マルチクオートの色変更



トレードステーションにマルチチャート・マルチクオートというアプリがあります。
使ったことがある人はお気づきかと思いますが
青色が、背景の濃い灰色に滲んで大変見辛いことになってます。

f:id:tsukinowaapp:20180619084144p:plain

なので、色変更したいと考えますが
どうやらGUIで設定変更できる仕組みがないようです。
じゃあ色は変えられないのかというと、そうでもなく
このアプリ自体がEasyLanguageで出来ているので、
ソース上の色指定している箇所を書き換えるという荒業で変更可能です。

色変更のやり方

EasyLanguage開発環境を起動
画面左上のフォルダアイコン、もしくはCtrl+O(オー)を押下
「EasyLanguageドキュメントを開く」で
MultiChartあるいはMultiQuoteを開く(色を変えたいほう)
メソッド InitColorsAndFonts を検索(184行目付近にあります)

//--------------------------------------------------------------------------------------------------------------
//	application colors and fonts
//--------------------------------------------------------------------------------------------------------------
method void InitColorsAndFonts()
begin
	clrBackground = Color.FromArgb(71, 78, 87);
	clrButtonsBackground = Color.FromArgb(22, 39, 53);
	clrButtonsText = Color.FromArgb(182, 190, 194);
	clrTileBackground = Color.FromArgb(27, 32, 37);
	clrSymbolText = Color.FromArgb(255, 255, 255);
	clrDarkGray = Color.FromArgb(182, 190, 194);
	
	fntButtons = Font.Create(FONT_FAMILY, 10);
	fntSymbol = Font.Create(FONT_FAMILY, 12, FontStyle.Bold);
end;

RGB(10進数)指定で好きなように色を変えることができます。

16進数・RGB・RGBAカラーコード変換ツール

各変数と色の関係は以下の通り。

f:id:tsukinowaapp:20180619103450p:plain

カラーリング例1

	clrBackground = Color.FromArgb(200, 250, 200);
	clrButtonsBackground = Color.FromArgb(180, 230, 180);
	clrButtonsText = Color.FromArgb(10, 10, 10);
	clrTileBackground = Color.FromArgb(160, 210, 160);
	clrSymbolText = Color.FromArgb(1, 1, 1);
	clrDarkGray = Color.FromArgb(200, 100, 100);

f:id:tsukinowaapp:20180619103954p:plain

カラーリング例2

	clrBackground = Color.FromArgb(200, 200, 200);
	clrButtonsBackground = Color.FromArgb(230, 230, 230);
	clrButtonsText = Color.FromArgb(1, 1, 1);
	clrTileBackground = Color.FromArgb(240, 240, 240);
	clrSymbolText = Color.FromArgb(1, 1, 1);
	clrDarkGray = Color.FromArgb(182, 190, 194);

f:id:tsukinowaapp:20180619104140p:plain