【MT4】注文ツールを作成しようとしている話 その0~準備編・自動建値~【mql4】

【MT4】注文ツールを作成しようとしている話 その0~準備編・自動建値~【mql4】

はじめに

※注意事項※

現在注文ツールを作成しており、技術的な部分を含めて不定期更新しようかと思っております。

作成中の記事につきバグなどがある可能性が十分にあるため、そのままのコードを利用したい場合は注意してください。

また、今までに作成したコードをそのまま利用していたり、ほかサイトのコードを参考に作成している場合があるためコーディングの仕方が統一されていない場合があります、ご了承ください。

何をしたかったのか?

もとはといえば何がしたかったのかというと、「全ての通貨ペアポジション」に対する「ポジション管理機能」が欲しかっただけ。

エントリー後のポジション管理が甘く利益になったポジションを損失にしてしまうことが多かったため、強制的に「自動建値」を入れる機能があればマイナスは防げるかなと思ったからです。

ググっても自分の理想とする挙動のものが見つからないため、自分で作成しようと思いました。

そこからですが、紆余曲折あり今までにやりたかった機能を実装して注文ツールとして形にしようと考えています。

自動建値の処理

メインの処理

  • エントリー位置から「設定閾値」を超えた場合に「設定建値値幅」にslを移動する機能。
  • 同時にロット数が「0.01」以上ならば半分利確する機能。
void OrderBuyEven(double point)
  {
   if(MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice() >= BeslAt * point)
     {
      if(OrderStopLoss() < OrderOpenPrice() && OrderStopLoss() != OrderOpenPrice() + Besl * point)
        {
         Print("建値+", Besl, " pips");
         if(OrderLots() > 0.01)
           {
            ticket = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / Trades, NormDigit), MarketInfo(OrderSymbol(),MODE_BID), slippage, CLR_NONE);
            Print("半利しました ",OrderSymbol()," - ",iClose(OrderSymbol(),0,0));
           }
        }
     }
void OrderSellEven(double point)
  {
   if(OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK) >= BeslAt * point)
     {
      if(OrderStopLoss() > OrderOpenPrice() && OrderStopLoss() != OrderOpenPrice() - (Besl + spread)  * point)
        {
         Print("建値+", Besl, " pips");
         if(OrderLots() > 0.01)
           {
            ticket = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / Trades, NormDigit), MarketInfo(OrderSymbol(),MODE_ASK), slippage, CLR_NONE);
            Print("半利しました ",OrderSymbol()," - ",iClose(OrderSymbol(),0,0));
           }
        }
     }

欲しかった機能

通貨ペアごとに違う設定の閾値と、sl幅を設定できるようにしています。

現実的な用途を考えた場合ボラティリティが違うのに同一設定では使いづらいからという考えのもと設定値を増やしております。

細かくこれがこの設定と言うまで細分化はしてませんが、ある程度の区分けとして低ボラ通貨ペア、並ボラ通貨ペア、高ボラ通貨ペア、超ボラ通貨ペアと分けられるようにしています。

細かい処理は省きますが、簡単に説明します。

  • 設定値に変数としてカンマ区切りの通貨ペアを設定。
  • カンマ区切りにした変数を分割し配列に入れる。
  • 全ての注文状況を確認する。
  • それぞれオーダーの通貨ペアが配列の通貨ペアと一致した場合には予め設定してある個別設定を利用する。

という少し面倒な処理をしています。

            for(int i=0; i<ArraySize(PairList); i++)
              {
               if(OrderSymbol() == PairList[i])
                 {
                  BeslAt= BeslAt_Low * 10;
                  Besl= Besl_Low * 10;
                 }
              }

今回のまとめ

簡潔ですが今回はこのあたりまで。

まだ最終的な完成形ではないですが、少し違う形で機能ごとに無料公開を考えております。

もし詳細な情報を知りたい場合はこちらの記事やTwitter・Discordで質問をしていただくか、またはDiscordではリアルタイムで悩みながらコーディングをしているためそちらを参考にしていただければと思います。

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