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

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

TOPIXの値動きを見ながらETFを売買してみる



トレステは、マルチチャートと言って複数のチャートを一つの画面に表示して
それぞれのチャートの状態を見ながら特定の株の売買をするという芸当が出来ます。

今日はマルチチャートを使ってTOPIXの値動きを見ながら
ETF(今回は[1570]NEXT FUNDS 日経平均レバレッジ上場投信)を売買するストラテジーを組んでみます。

f:id:tsukinowaapp:20180709093109j:plain

何故TOPIX

[1570]NEXT FUNDS 日経平均レバレッジ上場投信は、
日経平均株価の上昇・下降に合わせて株価が変動するETFですが
日経平均株価は5秒ごとの更新に対し
TOPIXは1秒ごとの更新で、チャートの動きがほぼ一致しているのでこちらを採用しています。
もちろん日経平均株価を見ながらETFの売買をすることも可能です。

チャートの設定

ストラテジーを組み込む前に、ワークスペースの下準備が必要です。

ワークスペースにチャート分析を組み込んだら、取引したい銘柄コードを設定
今回は5秒足にしておきます。
(マルチチャートはティック足に対応していません)

「挿入」→「銘柄コード」を押下
銘柄コードにTOPIXのコード($0000-TS)を入力、「プロット」を押下

こんな感じになるかと思います。
f:id:tsukinowaapp:20180709093911j:plain

売買高は見ないので「分析テクニックの設定」で削除するか、「状態」押下でオフにしておきましょう。

マルチチャートに分析テクニックを設定する方法

多くの人はマルチチャートに分析テクニックを設定したいかと思います。
そのまま設定すると、最初に設定したチャート(一番上)に適用されるので
適用したいチャートを指定する必要があります。

「挿入」→「インジケーター」で任意のチャートを選択
画面右クリック→「分析テクニックの設定」で挿入したチャートを洗濯して「設定」
「一般」タブを押下して「参照チャート」のプルダウンをクリックして、設定したいほうのチャートを選択した上で「OK]
f:id:tsukinowaapp:20180709101555p:plain

これで切り替わります。

ストラテジー

ストラテジーは以前組んだものを改造して使ってみます。

tsukinowakabu.hatenablog.jp

[Intrabarordergeneration = false];

inputs: 
	AvgType(0),
	MAGeta(0.1),
	MALength1(5),
	MALength2(20),
	MALength3(40),
	MACD3SLength(20),
	MACD3LLength(40);
	
vars: 
	IntrabarPersist DaijunkanFlg(0),
	IntrabarPersist double MA1(0),
	IntrabarPersist double MA2(0),
	IntrabarPersist double MA3(0),
	IntrabarPersist macd3(0),
	IntrabarPersist CloseData(Close of Data2);

CloseData = Close of Data2;

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

IF AvgType = 0 then
BEGIN
	MA1 = XAverage( CloseData, MALength1 );
	MA2 = XAverage( CloseData, MALength2 );			
	MA3 = XAverage( CloseData, MALength3 );
END
ELSE
BEGIN
	MA1 = AverageFC( CloseData, MALength1 );
	MA2 = AverageFC( CloseData, MALength2 );			
	MA3 = AverageFC( CloseData, 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 ((0900 < time and TIME < 1120) or (1230 < TIME and TIME < 1450)) 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 TIME >= 1125 and TIME < 1130 then
Begin
	if MarketPosition = 1 then
	BEGIN 
		Print(GetSymbolName, "指定時間売り抜け(午前)", TIME);
		Sell ( "指定時間売り抜け(午前)" ) next bar at market;
	end;
	if MarketPosition = -1 then
	BEGIN
		Print(GetSymbolName, "指定時間買い戻し(午前)", TIME);
		BuyToCover ( "指定時間買い戻し(午前)" ) next bar at market;
	end;
End;

if TIME >= 1455 then
Begin
	if MarketPosition = 1 then
	BEGIN 
		Print(GetSymbolName, "指定時間売り抜け(午後)", TIME);
		Sell ( "指定時間売り抜け(午後)" ) next bar at market;
	end;
	if MarketPosition = -1 then
	BEGIN
		Print(GetSymbolName, "指定時間買い戻し(午後)", TIME);
		BuyToCover ( "指定時間買い戻し(午後)" ) next bar at market;
	end;
End;

ほぼ一緒ですが終値(Close)などの四本値を使用する場合、参照するチャートを指定する必要があります。

CloseData = Close of Data2;

(Close) of DataNで使用するチャートを指定します。
(末尾は数字です)
何番目のチャートを参照するか、を指定します。
チャートが3つ以上ある場合はData3、Data4...という感じです。
毎回指定するのは面倒なので
変数を用意して、Closeを代入してそれを使用するのが楽かと思います。

とりあえす20日分(2018/06/11~2018/07/06)のバックテストをしてみます。
単元数は100株で。

f:id:tsukinowaapp:20180709114857p:plain

どうしても間隔の早い足(5秒)にすると
取引だけ偉く増えて、大した利益にならない感じになりますね。
なので1分足にして、最適化してみます。

f:id:tsukinowaapp:20180709121826p:plain

取引の回数は大幅に減りましたが、買い取引が微妙な結果に。

マルチチャートを使う際の注意

チャートの制約

マルチチャートにする場合は、時間足(月~秒)のみで、ティック足は設定できません。
銘柄ごとに出来高が異なるので当然ではありますが。

取引の制約

取引は最初に設定した一番上の銘柄(Data1)のみ行えます。
1つのチャート分析で複数の銘柄に対して取引は行えません。

ストラテジーの制約

いわゆるイントラバー取引(ティックごとに判定し、条件成立したら発注する)は行えません。
足が完成したタイミングで判定し、条件が成立したら取引するロジックになります。
損切やトレールストップを織り込みたいなら
SetStopLossやSetPercentTrailingなどのコマンドを活用ください。
(こちらは足の途中でも発注されます)