命名「狼狽トリガー」
いわゆるナイアガラ(突然の大暴落)の発生をトリガーにして
ショートポジションを握った後
反転したところでロングポジションに持ち替えるというストラテジーを組みました。
何か月か前の野崎印刷紙業[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 」∠)_