【MT4】注文ツールを作成しようとしている話 その3~特殊注文・戻成行・戻指値①~【mql4】

【MT4】注文ツールを作成しようとしている話 その3~特殊注文・戻成行・戻指値①~【mql4】

戻成行・戻指値とは

前回の続きの記事になります。

聞いたことのない注文方法だなと思った方はお察しの通り、「完全オリジナルの注文方法」になります。
長年実現したいと思っていた注文方法の一つです。

一言でいうと「目標とするラインをタッチしたときに注文を執行」します。
通常の指値や逆指値と変わらないと思うかもしれませんが、どこが違うのかというと、タッチしただけではなく「タッチ後に〇本以内に戻る」のならばという条件つきです。

少し名前にセンスがないので呼称に関してはもう少し検討中になります。

戻成行

分かりづらいのでもう少し戻り成行注文を掘り下げて説明すると
①現在USDJPYが99.8円です。
②100円で売りたいと思います。
③通常の指値の場合は100円にタッチしたらすぐにショート注文が約定されます。
④戻り成行の場合は100円にタッチした後に「5本以内に100円以下に戻るのならばショート注文」を約定させます。

上記の通り、この注文方法の構想は逆張り時のリスクを減らす注文方法となっております。
指値というものは絶対的に逆張りの注文となるため、指値をそのまま突き抜けてしまうといった事故が起こることが間々あります。
そのリスクを通常の指値注文よりも抑えるために実現したいと思っていた注文方法となります。

戻指値

同様に戻り指値注文に関してですが上記「④のタイミングで指値を配置する」ことができます。

例えば100円ラインをブレイクした際に99.2円まで戻るのならば場合買いたいと思っている場合、ブレイクラインを100円に設定、指値を99.2円に設定する。
この場合は順張りの注文となり、100円にタッチ後「5本以内に100円以下に戻るのならば99.2円に買い指値を配置」の様なよりリスクを抑えた通常ではできない様な注文方法を実現できます。
こちらは順張りの押し目買い、戻り売りをしたいときの注文方法になります。

実際の処理

世界中調べたわけではありませんがおそらく完全オリジナルな注文方法のため、テストしつつ実装している段階です。
現在の物は少し不都合があったため修正予定になりますが、Rボタンを押下すると戻成行用のエントリーラインをセットすることができます。

OnTickの中でエントリーラインと指定時間足の現在値を比較し、エントリーラインをCloseが超えた場合には買い注文フラグを立てます。
フラグが立っている状態で〇本以内にエントリーライン以下に戻るのを待ち戻った場合は注文を執行。
もしくは設定本数以上ローソク足が進んだ場合は期限切れキャンセルとなります。


もう一つの注文キャンセル方法としては、エントリー時に設定をしたslをエントリーラインを下回る前に超えた場合には注文キャンセルという処理を検討しております。
こちらについては現在実装前のため、構想のみです。


開発中のため変数設定もわかりづらいですがここで利用している「ReverseLimit」についてはローソク足の指定本数になります。

簡単にまとめると

①トリガーラインを超えたローソク足の時間を変数に入れる。

②ローソク足が進むごとに繰り返し、指定したローソクの本数を過ぎるまたはslを超えた場合に設定解除。

キャンセル処理に関しては最初の分岐点がオブジェクトの有無のため、オブジェクトの削除と注文方法のフラグのリセットだけになります。

   if(ObjectFind("reMarket") != EMPTY)
     {
      objrm = NormalizeDouble(ObjectGetDouble(0,"reMarket",OBJPROP_PRICE1),MarketInfo(Symbol(),MODE_DIGITS));
      if(High[1] < objrm && High[0] > objrm)
        {
         ReverseOrderFlag = -1;
         rm_time = iTime(Symbol(),5,0);
        }
      if(Low[1] > objrm && Low[0] < objrm)
        {
         ReverseOrderFlag = 1;
         rm_time = iTime(Symbol(),5,0);
        }
      rm_bars_shift = iBarShift(Symbol(),5,rm_time,true);
      if(ReverseLimit > rm_bars_shift && rm_bars_shift != -1 && rm_bars_shift != 0)
        {
         if(ReverseOrderFlag == -1)
           {
            for(int i = 1; i < ReverseLimit; i++)
              {
               if(Close[i] < objrm)
                 {
                  BtnOrderType = "Market";
                  lotSize = RoundDown(StringToDouble(ObjectGetString(0,"reMarkettext",OBJPROP_TEXT)),2);
                  OpenShortOrder();
                  ObjectDelete("reMarket");
                  ObjectDelete("reMarkettext");
                  ReverseOrderFlag = 0;
                 }
              }
           }
         else
            if(ReverseOrderFlag == 1)
              {
               for(int i = 1; i < ReverseLimit; i++)
                 {
                  if(Close[i] > objrm)
                    {
                     BtnOrderType = "Market";
                     lotSize = RoundDown(StringToDouble(ObjectGetString(0,"reMarkettext",OBJPROP_TEXT)),2);
                     OpenLongOrder();
                     ObjectDelete("reMarket");
                     ObjectDelete("reMarkettext");
                     ReverseOrderFlag = 0;
                    }
                 }
              }
        }
      else
         if(ReverseLimit <= rm_bars_shift)
           {
            ObjectDelete("reMarket");
            ObjectDelete("reMarkettext");
            ReverseOrderFlag = 0;
           }
     }

戻指値に関しても同様の処理となっていますが、同じ様に作成したため現在1本のラインがトリガーライン、エントリーラインを兼任しています。
当然ですが指値の場合はエントリーラインが執行時価格以上になるためエラーとなりますよね。
トリガーラインとエントリーラインを分けないといけないことを失念していたため、使いやすい様にGUI操作側での根本的な修正を検討しております。

今回のまとめ

言葉で説明するにはいまいち分かりづらい注文方法のため簡単に動画にまとめてお見せできないことが残念です。
私の中ではこれだけでも優位性があり面白い注文方法だと考えているため是非実装したく思っております。
もう少し仕様が煮詰まってきましたら再度解説と動画でお見せしてみたいと思います。
戻指値に関しては丸々処理の変更があると思いますので主に戻指値に関しての解説として検討しています。

それでは今回はこのあたりで終わります。

インジケーター・EA・bot開発カテゴリの最新記事