MT4サンプルコード01

※未検証、勉強の記録として残しているだけです。

以下に、「連続ループ注文+決済+証拠金チェック+pips補正」 を組み合わせたサンプルコードを示します。
これを使うことで、

  1. ループ発注(一定ステップ数まで)
  2. 決済注文(TP設定)
  3. エントリー間隔(EntryStepPips)
  4. 証拠金チェック(必要証拠金の200%確保)
  5. pips計算補正(ZARJPYなど3桁/5桁ペア対応)
    が一通り動くようになります。

統合サンプルコード (MQL4)

//+——————————————————————+

//| ループ決済付きループイフダンEA (証拠金チェック & pips補正付き)    |

//+——————————————————————+

#property strict

// ◆ パラメータ設定 ◆

input double StepPips      = 10.0; // 決済間隔(pips)→ TPの設定に使用

input int    MaxSteps      = 9;    // 最大ステップ数(ペア数)

input double LotSize       = 0.1;  // ロットサイズ

input int    Slippage      = 3;    // 許容スリッページ

input double EntryStepPips = 5.0;  // エントリー間隔(pips) ※ZARJPYなど3桁ペアではpips計算に注意

// ◆ グローバル変数 ◆

int    OrderCount        = 0;  // 何ステップ目かを管理

double LastPairBuyEntry  = 0;  // 前回の買いエントリー価格

double LastPairSellEntry = 0;  // 前回の売りエントリー価格

//+——————————————————————+

//| OnInit: 初期化関数                                              |

//+——————————————————————+

int OnInit()

{

   Print(“◆ ループイフダンEA(証拠金チェック & pips補正) 起動 ◆”);

   return(INIT_SUCCEEDED);

}

//+——————————————————————+

//| OnTick: メイン処理                                              |

//+——————————————————————+

void OnTick()

{

   // — 1) 全決済チェック:ポジションが無ければリセット —

   if(OrdersTotal() == 0)

   {

      OrderCount        = 0;

      LastPairBuyEntry  = 0;

      LastPairSellEntry = 0;

   }

   // — 2) まだMaxStepsに達していない場合、発注を試みる —

   if(OrderCount < MaxSteps)

   {

      double ask = MarketInfo(Symbol(), MODE_ASK);

      double bid = MarketInfo(Symbol(), MODE_BID);

      // 1pipの大きさを通貨ペアの桁数に合わせて補正

      double onePip = CalcPipValue();

      // — 2-1) エントリー条件判定 —

      bool canPlaceBuy  = false;

      bool canPlaceSell = false;

      // 初回は無条件で買い&売りペアを発注

      if(OrderCount == 0)

      {

         canPlaceBuy  = true;

         canPlaceSell = true;

      }

      else

      {

         // 前回買いエントリー価格から「EntryStepPips×onePip」上昇していれば買いOK

         if(ask >= LastPairBuyEntry + (EntryStepPips * onePip))

            canPlaceBuy = true;

         // 前回売りエントリー価格から「EntryStepPips×onePip」下落していれば売りOK

         if(bid <= LastPairSellEntry – (EntryStepPips * onePip))

            canPlaceSell = true;

      }

      // — 2-2) 買い&売りが同時にOKなら発注 —

      if(canPlaceBuy && canPlaceSell)

      {

         // ステップに応じたTP値を計算

         double tpBuy  = ask + (StepPips * (OrderCount + 1) * onePip);

         double tpSell = bid – (StepPips * (OrderCount + 1) * onePip);

         // 証拠金チェック付きで注文発注

         bool buyPlaced  = PlaceOrderWithMarginCheck(OP_BUY,  ask,  tpBuy,  LotSize);

         bool sellPlaced = PlaceOrderWithMarginCheck(OP_SELL, bid,   tpSell, LotSize);

         // 両方の注文が成功したらステップ数をインクリメント

         if(buyPlaced && sellPlaced)

         {

            OrderCount++;

            // エントリー価格を更新

            LastPairBuyEntry  = ask;

            LastPairSellEntry = bid;

         }

      }

   }

}

//+——————————————————————+

//| PlaceOrderWithMarginCheck: 証拠金チェック付き発注関数           |

//+——————————————————————+

bool PlaceOrderWithMarginCheck(int type, double price, double tp, double lot)

{

   // 1) 必要証拠金を計算 (MQL4はOrderCalcMarginが無いので自前計算)

   double marginRequired = CalcMarginRequired(lot, price);

   double freeMargin     = AccountFreeMargin();

   // 2) 必要証拠金の200%を確保できない場合はスキップ

   if(freeMargin < marginRequired * 2.0)

   {

      Print(“■証拠金不足スキップ■ 必要証拠金=”, marginRequired,

            “, フリー証拠金=”, freeMargin);

      return false;

   }

   // 3) 発注

   int ticket = OrderSend(Symbol(), type, lot, price, Slippage, 0, tp, “LoopIfDone”, 0, 0, clrNONE);

   if(ticket < 0)

   {

      Print(“注文失敗 (Type:”, type, “) Error: “, GetLastError());

      return false;

   }

   return true;

}

//+——————————————————————+

//| CalcMarginRequired: 必要証拠金を概算する (MQL4用)                |

//+——————————————————————+

double CalcMarginRequired(double lot, double price)

{

   double contractSize = MarketInfo(Symbol(), MODE_LOTSIZE); // 1ロットあたりの通貨量

   double leverage     = AccountLeverage();                  // 口座のレバレッジ

   // 例: (Lot × コントラクト × 価格) / レバレッジ

   double margin = (lot * contractSize * price) / leverage;

   return margin;

}

//+——————————————————————+

//| CalcPipValue: 通貨ペアの桁数に応じて1pipの値を返す              |

//+——————————————————————+

double CalcPipValue()

{

   // 例: ZARJPYやUSDJPY(3桁/2桁), EURUSD(5桁/4桁)などで処理を分ける

   int    digits = (int)MarketInfo(Symbol(), MODE_DIGITS);

   double point  = MarketInfo(Symbol(), MODE_POINT);

   // 5桁 or 3桁なら Point×10.0, 4桁 or 2桁なら Point×1.0

   if(digits == 3 || digits == 5)

      return point * 10.0;

   else

      return point;

}


ポイント解説

  1. CalcPipValue() 関数
    • ZAR/JPY のように小数点以下3桁で価格が表示される場合、Digits = 3 で Point = 0.001 となり、1pip は 0.01 とみなすことが多いです。
    • そこで digits == 3 なら point * 10.0 して 0.01 を返すようにしています。
  2. エントリー間隔(EntryStepPips)
    • 「前回の買いエントリー価格+(EntryStepPips×onePip)」以上になれば買いOK、
    • 「前回の売りエントリー価格−(EntryStepPips×onePip)」以下になれば売りOK、
    • 初回(OrderCount=0)のみ無条件でペア発注。
  3. 決済注文(TP)
    • 例: 買い注文の場合は「ask + (StepPips×(OrderCount+1)×onePip)」にテイクプロフィットを設定しています。
    • 9ステップ分(最大)まで、段階的に異なるTPを設定できます。
  4. 証拠金チェック
    • MQL4には OrderCalcMargin() がないため、自前で概算 (CalcMarginRequired()) しています。
    • (lot × contractSize × price) / leverage で必要証拠金を計算し、AccountFreeMargin() と比較。
    • freeMargin < marginRequired * 2.0 なら注文をスキップ(必要証拠金の200%を確保できない場合は発注しない)。
  5. 連続発注の制御
    • 価格が条件を満たすと 買いと売りを同時発注 → OrderCount++
    • MaxSteps に達すると新規発注は行わない。
    • 全ポジションが決済された(OrdersTotal()==0)ら、 OrderCount=0 にリセット。

これでできること

  1. ZAR/JPY など桁数が異なる通貨ペアで、想定通り「5pips刻み」や「10pips刻み」の売買が可能
  2. エントリー前に証拠金をチェックし、資金に余裕がない場合は発注をスキップ
  3. 指定ステップ(MaxSteps=9)まで、買い・売りのペア発注を繰り返す
  4. 決済注文(TP)をpips単位で設定する

今後の調整ポイント

必要であれば、MarketInfo(Symbol(), MODE_TICKVALUE) や AccountCurrency() を用いて計算を拡張してください。

損切り(SL)を設定する

例: 「Buyの場合は ask – Xpips、Sellの場合は bid + Xpips」など

連続注文を入れる場合、損失が膨らまないように必ずSLを設定することをおすすめします。

ロジックの変更

「Buy/Sell同時発注」ではなく、「Buyが決済されたら次はSell発注」など、条件を細かく制御したい場合はロジックを変更する必要があります。

レバレッジや口座通貨の違い

もし口座通貨が円以外の場合、さらに通貨換算が必要になるケースがあります。

※プログラミング詳細内容はEAの専門家にお尋ねください。

まとめ

  • 現状のコードは、一気に (MaxSteps) セット分の注文を連続で出す仕様 なので、一度に複数ポジションが持たれます。
  • これはコード通りの正常動作です。
  • 「ループイフダン」でよくイメージされる「1セット決済 → 次の1セット発注」を実現したい場合は、決済ロジック(TP/SL設定)と『決済後に再注文』のフロー を組み込む必要があります。

MT4へのEA実装手順

  1. EAをMT4に導入する
  2. MT4の設定を調整
  3. EAをチャートに適用
  4. 動作確認
  5. 調整・最適化

1. EAをMT4に導入する

(1) コードをMQL4フォルダに保存

  1. MT4を開く
  2. 「ファイル」 → 「データフォルダを開く」 をクリック
  3. MQL4Experts フォルダを開く
  4. mt4_loop_ifdan.mq4 をこのフォルダにコピー
  5. MT4を 再起動

(2) エディタ(MetaEditor)でコンパイル

  1. MT4の「ナビゲーター」ウィンドウ「エキスパートアドバイザー」 を展開
  2. mt4_loop_ifdan が表示されていることを確認
  3. 表示されていなければ、MetaEditor(MQL4エディタ)を開き、EAファイルをコンパイル
    • MT4の「ツール」 → 「MetaQuotes Language Editor」
    • mt4_loop_ifdan.mq4 を開く
    • 「コンパイル」ボタンをクリック

コンパイルが成功すれば、エラーなくEAが実行可能になります。


2. MT4の設定を調整

(1) 自動売買を許可

  1. 「ツール」 → 「オプション」 → 「エキスパートアドバイザー」
  2. 「自動売買を許可する」にチェックを入れる
  3. 「DLLの使用を許可する」にもチェックを入れる(必要な場合)

3. EAをチャートに適用

  1. ナビゲーターウィンドウ から mt4_loop_ifdanドラッグ&ドロップ でチャートに適用
  2. パラメータを設定
    • StepPips(値幅) → 例: 20
    • MaxSteps(最大ステップ数) → 例: 9
    • LotSize(ロットサイズ) → 例: 0.1
  3. 「OK」を押して適用

4. 動作確認

  1. 「自動売買」ボタンが緑色になっているか確認
  2. チャートに「LoopIfDone EA 起動」と表示される
  3. 価格変動時に、設定した値幅ごとに注文が発生しているか確認

5. 調整・最適化

  • 値幅(StepPips)を増やすと注文頻度が減る
  • MaxStepsを変更すると最大保有ポジション数が変わる
  • バックテスト(ストラテジーテスター)で動作確認可能

補足:バックテストの方法

  1. 「表示」 → 「ストラテジーテスター」
  2. エキスパートアドバイザーに mt4_loop_ifdan を選択
  3. 通貨ペア、時間足、期間を選択
  4. 「スタート」ボタンを押してテスト開始

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です