【2025.07.04】アメリカ休場

MT4対応:スワップ自動計算のインジケーターをMQL4で作る方法

記事内に商品プロモーションを含む場合があります
スポンサーリンク

MT4で自動売買や裁量トレードをしていると、 スワップポイント(通貨間の金利差調整金)の管理 は意外と見落としがちです。

FXではポジションを翌日に持ち越すとスワップが発生し、利益にも損失にも影響します。特に長期保有の場合は積み重なったスワップで大きな差が出るため、きちんと把握しておく必要があります。

今回は MQL4でスワップを自動計算し、チャートに表示できるインジケーター の作り方を初心者〜中級者向けにわかりやすく解説します。
完成品のダウンロードファイル・サンプルコード・導入方法まで網羅していますので、ぜひ参考にしてください。

MQL4でスワップ自動計算インジケーターを作った理由

私自身、スワップ管理を怠り痛い目を見たことがあります。
特に 水曜日から木曜日のスワップ3倍デー にマイナススワップで一気に10pips以上削られた経験がありました。

こうしたリスクを防ぐため、 スワップを常に意識できるように 自動で計算・表示するインジケーターを作りました。

インジケーターの仕様と機能

MT4が使えるほとんどのFX業者はスワップ値をプログラムで取得できます。
このインジケーターは、その値を元にチャート左上に買いスワップ・売りスワップを表示します。

  • デフォルトは10万通貨分のスワップ計算(パラメータで変更可能)
  • 実際のスワップ値はロールオーバー時の仲値レートを元にしているため、実際の値と多少の誤差が生じることがあります。
  • 特定のレート(インジケーター追加時や曜日変わり時のレート)を基準に計算しています。

インジケーターのダウンロード

スワップポイントを表示する自作インジケータです。ダウンロードしてご利用下さい。

※動作確認や公式スワップ額との照合をお願いします

“CHK_Swap.ex4” をダウンロード CHK_Swap-1.ex4 – 2185 回のダウンロード – 9.51 KB

インジケーターのソースコード

//+------------------------------------------------------------------+
//|                                                      CHK_swap.mq4 |
//|                                     Copyright 2020, pfx Software |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software"
#property link      "https://fx-prog.com/"
#property version   "1.10"
#property indicator_chart_window

input double Tuuka_Tani = 10;     //10万通貨の場合10

input int display_X = 5;      //表示位置X
input int display_Y = 30;     //表示位置Y

string objectName = "SHOW_SWAP_POINT";

int prevWeek;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

//---
   //ラベルオブジェクトの作成
   if(!ObjectCreate(0, objectName, OBJ_LABEL, 0, 0, 0))
   {
      return(INIT_FAILED);
   }
   // 座標のアンカー位置
   ObjectSetInteger(0, objectName ,OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
   // X位置
   ObjectSetInteger(0, objectName, OBJPROP_XDISTANCE, display_X);
   // Y位置
   ObjectSetInteger(0, objectName, OBJPROP_YDISTANCE, display_Y);
   // 色
   ObjectSetInteger(0, objectName, OBJPROP_COLOR, clrWhite);
   // 読み取り専用
   ObjectSetInteger(0, objectName, OBJPROP_READONLY, true);
   // 選択不可
   ObjectSetInteger(0, objectName, OBJPROP_SELECTABLE, false);
   // フォント名
   ObjectSetString(0, objectName, OBJPROP_FONT, "MS ゴシック");
   // フォントサイズ
   ObjectSetInteger(0, objectName, OBJPROP_FONTSIZE, 8);

   return(INIT_SUCCEEDED);
  }
  
void OnDeinit(const int reason)
{
   ObjectDelete(0,objectName); 
}  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   static int prevDayOfWeek = -1;

   // 曜日が変わったら更新
   int currentDay = DayOfWeek();
   if(currentDay == prevDayOfWeek) return(0);
   prevDayOfWeek = currentDay;

   double lotsize   = MarketInfo(Symbol(), MODE_LOTSIZE);
   double point     = MarketInfo(Symbol(), MODE_POINT);
   double swapLong  = MarketInfo(Symbol(), MODE_SWAPLONG);
   double swapShort = MarketInfo(Symbol(), MODE_SWAPSHORT);
   int    swapType  = MarketInfo(Symbol(), MODE_SWAPTYPE);
   double rate      = MarketInfo(Symbol(), MODE_ASK);
   double unit      = Tuuka_Tani * 10000;

   double resultLong = 0;
   double resultShort= 0;
   string message;

   // 計算パターン
   switch(swapType) {
      case 0:
         resultLong  = lotsize * swapLong * point * Tuuka_Tani / 10;
         resultShort = lotsize * swapShort * point * Tuuka_Tani / 10;
         break;
      case 1:
         resultLong  = rate * swapLong * Tuuka_Tani / 10;
         resultShort = rate * swapShort * Tuuka_Tani / 10;
         break;
      case 2:
         resultLong  = unit * (swapLong / 100.0 / 360.0) * rate;
         resultShort = unit * (swapShort / 100.0 / 360.0) * rate;
         break;
      default:
         message = "スワップ計算できませんでした";
         break;
   }

   if(swapType != 4) {
      message = StringFormat("%.0f万通貨 買いスワップ:%.0f円 売りスワップ:%.0f円", Tuuka_Tani, resultLong, resultShort);
   }

   // ラベルに表示
   ObjectSetString(0, objectName, OBJPROP_TEXT, message);

   Print("スワップ更新:", Symbol(), " ", message);

   return(rates_total);
}
スポンサーリンク

解説

スワップタイプはMarketInfo(Symbol(),MODE_SWAPTYPE)で取得。

タイプは以下4種類:

  • 0: pips(ポイント)
  • 1: 決済通貨
  • 2: 金利(パーセント表示)
  • 3: 証拠金通貨(未対応)

スワップタイプごとに計算方法を変えています。タイプ3の業者はまだ未確認(対応業者が無い)のため、「スワップ計算できませんでした」と表示します。

このスワップタイプが違うとスワップの計算方法が変わってきますので各FX業者のスワップタイプを参照し、計算方法をわけています。

ポイントとなっていれば0、USD等通貨名が書いてあれば1、パーセント表示となっていれば2です。私が利用している、FX業者で3が無いので3は未対応です。
※今後出てきたら追加します

MT4へのインストール手順

ダウンロードしたファイルをMT4に展開し、チャート上に反映するだけで使用可能です。

  1. MT4を起動し、「ファイル」→「データフォルダーを開く」をクリック。
  2. 「MQL4」フォルダを開き、その中の「Indicators」フォルダにダウンロードした CHK_Swap.ex4 ファイルをコピー。
  3. MT4を再起動するか、ナビゲーターで右クリックして「更新」を選択。
  4. チャートにインジケーターをドラッグ&ドロップして適用。

MT4への展開、反映手順が全くわからない場合はこちら👇

パラメータ入力

パラメータの入力値として「Tuuka_Tani」と「display_X」「display_Y」を設けています。

パラメータ説明デフォルト値
Tuuka_Taniスワップ計算に使う通貨単位。10万通貨なら1010
display_X表示位置のX座標(0が左端、数値が大きいほど右)5
display_Y表示位置のY座標(0が上端、数値が大きいほど下)30
スポンサーリンク

注意点と動作確認済みのFX業者

スワップ計算の注意事項

MT4にはスワップ計算タイプというものが4種類あり、FX業者毎に違うようです。
(0:pips, 1:決済通貨, 2:金利, 3:証拠金通貨)

スワップタイプ計算タイプが3のFX業者にまだ巡り合えていないので、3の業者だった場合は『スワップ計算できませんでした』という文言が出るようになっています。巡り合えたら更新しようと思います。※多分1と同じ?

また、基本的には対円(USDJPY,GBPJPY)やドルストレート(EURUSD,AUDNZD)等の通貨に対して動作確認済ですが、XMのGOLDも一応対応済です。(2024/03/28)

※参考情報
OANDA JAPANのデモ口座でスワップ値の動作確認(公式サイトのスワップ額と照らし合わせ)していたのですが、どうやらデモ口座はスワップの値がデタラメ?なのか公式サイト上のスワップ額と全く合いませんでした。

スワップ計算方法が(MODE_SWAPTYPEが0の場合)特殊なんだろうか?全くわからん!と思って諦めかけていたんですが、先日口座開設したのでライブ口座で確認したところ、適切なスワップ値を取ることできました。なので計算も問題ありません。

結局デモ口座で確認していたのがまずかったようです。なので、デモ口座で確認される方は注意してください。

動作確認済のブローカー一覧

現在、以下のFX業者で動作確認済です。

  • OANDA JAPAN(タイプ0)
  • FOREX EXCHANGE(タイプ0)
  • FXTF(タイプ1)
  • 外為ファイネスト(タイプ2)
  • デューカスコピージャパン(タイプ0)
  • XM(タイプ0)
  • Titan(タイプ0)
  • 楽天FX(取得不可。HP参照のみ)

スポンサーリンク

まとめ

以上、『スワップ自動計算のインジケーターをMQL4で作る方法』でした。まとめと、注意点としては

  • スワップ計算はブローカーの提示値に注意
  • MT4のMarketInfoで自動取得できる
  • サンプルコードをベースに応用できる
  • 他のインジケーターと組み合わせるとより実践的

もし、このインジケータを実際に使われる場合はご利用のFX業者の公開しているスワップ値と合っているか軽く確認してから使われるようお願いします。



※ オススメ記事(EAが使える国内FX業者の一覧)

コメント

  1. とっとと より:

    シンプルなスワップ表示のインジケーターを探していてたどり着きました
    理想としていたインジでとてもいいのですが、表示位置の変更ってできないんでしょうか?
    使ってるEAのコメントが同じ場所に表示されるので判読できない時がちょくちょくあるんです
    せっかくいいものを見つけたので解決策などあればお教え願えませんでしょうか?

    • りょう りょう より:

      とっととさん
      パラメータ設定で表示位置を変更できるようにしました。
      (display_X)で左右位置、(display_Y)で上下位置を変更できます。

      display_の値を60ぐらいにして頂くと少し下に表示されるようになり文字被りを防げると思いますので最新のファイルを同一ボタンからダウンロードして試してみてください。
      ※ダウンロードファイルを最新に差し替えました

  2. 小栃洞運國斎 より:

    難平の回数によって、
    売買判断のマルチタイムフレームの枠を変えていくEAを作ったら、
    驚きの結果が出ました、。
    作ってもらえませんか?

  3. けいじ より:

    素晴らしいインジで有難く使わせていただいてるんですが、時々表示がずっと0のままの時があります
    対処法などありましたらご教授願えますか?

    • りょう りょう より:

      けいじさん

      初めまして、ご利用有難うございます。

      ずっと0の場合は、スワップを表示しているチャートの時間足を5分足→15分足等に変えて頂くと再読み込みしますのでもしかしたら数値が出てくるかもしれません。

      あと、利用しているMT4はどこのMT4を利用されていますか?もしかしたら想定外のスワップ計算方法を採用している可能性があるので、その場合はずっと0になってしまうかもしれません。

      • けいじ より:

        XMのゴールドがほとんど表示されないんですよね
        何度か表示されてるところを見たことはあるんですが。。。

        • りょう りょう より:

          なるほど、ゴールドですか。
          通貨名称を(USDJPY等)基本6文字で考えていました。XMのゴールドを見たことろGOLDとなっており、ここで問題が起きてそうです。多分直せるので直してみますね。

        • りょう りょう より:

          ゴールドも表示されるように対応しました。