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

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

ナイアガラの発生をトリガーにしてポジションを持つストラテジーを組んでみたがって話


命名「狼狽トリガー」

f:id:tsukinowaapp:20180816103044j:plain

いわゆるナイアガラ(突然の大暴落)の発生をトリガーにして
ショートポジションを握った後
反転したところでロングポジションに持ち替えるというストラテジーを組みました。

何か月か前の野崎印刷紙業[7919]でナイアガラが発生したので
それをテストデータにして組みました。

しかし、待っていると起こらないのがナイアガラで
実戦で拾えた試しがないんですよね。

自分には上手く使えそうにないので公開します。

  • 結構リスキーなストラテジーだと思うので、使用の際は自己責任でお願いします。

ストラテジー

[Intrabarordergeneration = true];

inputs: 
	MidAvg(25),
	LongAvg(100),
	TicksVolume(40000000),
	LossCutPrice(100),
	ProfitPrice(200),
	StartTime(0901);
	
vars: 
	Answer(0),
	StartFlgW(0),
	NowDateTime(NULL),
	NewUpTick(0),
	NewDownTick(0),
	UpTriger(false),
	DownTriger(false),
	AnswerSlow(0);

if date > date[1] then begin
	StartFlgW = 0;
	NewUpTick = 0;
	NewDownTick = 0;
	UpTriger = false;
	DownTriger = false;
end;

If TIME >= StartTime and TIME < 1450 then 
begin

	Answer = AverageFC(Close, MidAvg);
	AnswerSlow = AverageFC(Close, LongAvg);

	NowDateTime = BarDateTime.ELDate + BarDateTime.Hour + BarDateTime.Minute + BarDateTime.Second;

	//NewUpTick += UpTicks;
	NewDownTick += DownTicks;

	IF NowDateTime[1] <> NowDateTime then
	BEGIN
		//UpTriger = false;
		DownTriger = false;
		
		//IF (NewUpTick > TicksVolume) then 
		//BEGIN
		//	UpTriger = true;
		//end;
		
		IF (NewDownTick > TicksVolume) then 
		BEGIN
			DownTriger = true;
		end;
	
		//NewUpTick = 0;
		NewDownTick = 0;
	end;

	IF StartFlgW = 0 and MarketPosition = 0 then 
	begin
		//if UpTriger = true then 
		//BEGIN
			//StartFlg = 1;
			//Print(GetSymbolName, "緊急買いスタート", TIME);
			//Buy ( !( "緊急買いスタート" ) ) next bar at market;
		//END;
		
		if DownTriger = true then 
		BEGIN
			StartFlgW = 1;
			Print(GetSymbolName, "緊急空売りスタート", TIME);
			Sellshort ( !( "緊急空売りスタート" ) ) next bar at market;
		END;
	END;
	
	IF StartFlgW = 1 and MarketPosition <> 0 then 
	begin

		IF ContractProfit > ProfitPrice then
		BEGIN
			//if MarketPosition = 1 and Answer < Answer[1] and AnswerSlow < AnswerSlow[1] and Answer < AnswerSlow then 
			//BEGIN
			//	Print(GetSymbolName, "緊急ドテン空売り", TIME);
			//	Sellshort ( !( "緊急ドテン空売り" ) ) next bar at market;
			//END;
	
			if MarketPosition = -1 and Answer > Answer[1] and AnswerSlow > AnswerSlow[1] and Answer > AnswerSlow then 
			BEGIN
				Print(GetSymbolName, "緊急ドテン買い", TIME);
				Buy ( !( "緊急ドテン買い" ) ) next bar at market;
			END;
		END
		ELSE IF ContractProfit < -LossCutPrice then
		BEGIN
			if MarketPosition = 1 then 
			BEGIN
				StartFlgW += 1;
				Print(GetSymbolName, "緊急損切売り抜け", TIME);
				Sell ( "緊急損切売り抜け" ) next bar at market;
			END;
	
			if MarketPosition = -1 then 
			BEGIN
				StartFlgW += 1;
				Print(GetSymbolName, "緊急損切買い戻し", TIME);
				BuyToCover ( "緊急損切買い戻し" ) next bar at market;
			END;
		END;

	END;
	
	IF StartFlgW >= 2 and MarketPosition <> 0 then
	BEGIN
		if MarketPosition = 1 and AnswerSlow < AnswerSlow[1] and Answer < AnswerSlow then 
		BEGIN
			StartFlgW += 1;
			Print(GetSymbolName, "緊急反転売り抜け", TIME);
			Sell ( "緊急反転売り抜け" ) next bar at market;
		END;
	
		if MarketPosition = -1 and AnswerSlow > AnswerSlow[1] and Answer > AnswerSlow then 
		BEGIN
			StartFlgW += 1;
			Print(GetSymbolName, "緊急反転買い戻し", TIME);
			BuyToCover ( "緊急反転買い戻し" ) next bar at market;
		END;
	end;
end;

if TIME >= 1125 and TIME < 1130 then
Begin
	if MarketPosition = 1 then
	BEGIN 
		StartFlgW += 1;
		Print(GetSymbolName, "緊急指定時間売り抜け(午前)", TIME);
		Sell ( "緊急指定時間売り抜け(午前)" ) next bar at market;
	end;
	if MarketPosition = -1 then
	BEGIN
		StartFlgW += 1;
		Print(GetSymbolName, "緊急指定時間買い戻し(午前)", TIME);
		BuyToCover ( "緊急指定時間買い戻し(午前)" ) next bar at market;
	end;
End;

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

チャート設定は1ティックです。

コード解説

現在時間を拾って、下降出来高が一定以上発生したらポジションを獲得するというロジックになってます。
反転は2種類の移動平均を見ています。

コメントアウトの箇所は逆ナイアガラ(一定以上の上昇)なので、必要だと思う人はコメント解除してください。

TicksVolume:発生出来高閾値
LossCutPrice:ロスカット値(1株当たりの損益)
ProfitPrice:利確とする値(1株当たりの損益)

上記は銘柄ごとに調整する必要があります。
特にTicksVolumeはどこが適正値なのか私でも分かりません。orz

使う前にバックテストをみっちりやってください。
なお、どうしても約定までラグが発生するので
シミュレーション通りの利益は出ないと思います。

思惑とは逆の方向に動いた場合の対策として損切ロジックを入れていますが
不要だと思う人は取っ払ってください。(自己責任)

所詮待ちぼうけ戦法

結局はどの銘柄に仕掛けるか?なので
仕手株や決算の情報などアンテナの敏感な人でないと使いこなせないでしょう。
もし上手く使えたらお返事ください。_(:3 」∠)_