お役立ち集

【MQL4】実効レバレッジ計算方法

MQL4 - How To Calculate Effective Leverage お役立ち集
この記事は約6分で読めます。
※当サイトは、アフィリエイト広告を利用しています。

MQL4で実効レバレッジを「ざっくり」計算する方法 のサンプルコードです!

WEB上にあるかなと思ったのですが、見当たらなかったので自作して公開しました。

なぜ「ざっくり」なのかも後述しています!

スポンサーリンク

【サンプルコード】

結論のソースコードから載せていまいますが、

Canaryは以下で『ざっくり実効レバレッジ』を取得しています。

何と実質1行!!
#これだけならマクロにしてもイイかもw

/* ------------------------------------------------------------------
 * [Function] ざっくり実効レバレッジ取得API
 * ------------------------------------------------------------------ */
double GetRoughEffectiveLeverage() {
  return AccountMargin() * AccountLeverage() / AccountEquity();
}

※括弧の位置やインデントがMQLのデフォルトと異なるのは、こだわりなのでご容赦ください💧

ただし上記だけでは問題があるケースがありますので、以降も御覧ください

後述の『課題②』になりますが、対策版コードも載せております。

スポンサーリンク

【解説】

まず最初に言いたいことは、実効レバレッジを取得する関数はMQL4では用意されていません! と言うことです。

Canary
Canary

「用意しとけよ」と言う感じ…💧

そして、実効レバレッジの計算式は以下となります。

$$[実効レバレッジ]=[取引総額]\div[有効証拠金]$$

これをどうやってプログラムすればよいでしょうか。

課題①:取引総額をどうやって取得すればいい?

有効証拠金は AccountEquity 関数を呼び出すだけで取得できますが、取引総額が問題になります。

というのも、MQL4で取引総額を直接取得する関数は用意されていないのです。

単純にfor文で全ポジションをなめて現在額を足していけばいいんじゃね? と思われるかも知れませんが、下記コラムのような課題があるため断念しました。

正攻法で行った場合の課題とは?

正攻法での課題とは、とあるポジションの取引額を「口座の通貨ベースで」取得する関数がMQL4では用意されていない ため、これを自分で実現しなければいけないことにあります。


「日本円 (JPY) ベースの口座」を例に上げて説明します。

通貨ペアベース通貨取引額の算出方法
USDJPYJPY現在評価額 × ロット数
EURUSDUSD現在評価額 × ロット数 × ドル円の現在評価額
【「日本円 (JPY) ベースの口座」における取引額の算出方法】

ベース通貨がJPYの通貨ペアは簡単。 単純に評価額とロット数を掛け算すればOKですよね。

これに対し、ベース通貨がUSDの通貨ペアの場合「USDベースであることの検出」と「ドル円の現在評価額の乗算」 が必要になりますが、以下の問題があります。

  • OANDAなどでは「USDJPY」と「USDJPY-a」の両方が存在し、どちらを参照すべきか判定できない。

Canary
Canary

「精度を気にしなければ、どっちを使ってもいいんじゃ」

って話もありますが気持ち悪い…

と言うことで、Canaryは 取引総額を別の方法でざっくり取得すること を考えました。

それは・・・

$$[取引総額]\simeq[取引証拠金総額]\times[口座のレバレッジ]$$

です!!

厳密にはイコールにはなりませんが、実効レバレッジは大まかにつかめればOK と考えてこの方法を採用しました。

※新興国通貨などは取引証拠金が高めに設定されている場合があり、その際は実効レバレッジは高めに出ると思います。

従って、実効レバレッジは以下のように近似が可能になります。

$$[実効レバレッジ]\simeq[取引証拠金総額]\times[口座のレバレッジ]\div[有効証拠金]$$

これは上述のサンプルコードのリターン値である AccountMargin() * AccountLeverage() / AccountEquity() になりますね。

課題②:AccountLeverage関数が正しく動作しないブローカーがある

サクソバンク証券のMT4口座はレバレッジが25倍ですが、何とAccountLeverage関数が「100」を返してきます💢💢💢

  • 下のスクリーンショットのように、MyfxbookやReal Tradeでも100倍に表示されてしまいますが、根本原因は同じと考えています。
【Myfxbookでサクソバンクがレバレッジ100倍表示】
RealTradeでサクソバンクのレバレッジが100倍?
【RealTradeでサクソバンクがレバレッジ100倍表示】

対策ですが、どうしようもないので 場合分けでハードコーディング (→固定値を返すように) しました。
#カコワルイけど…

/* ------------------------------------------------------------------
 * [Function] 「本当の」口座レバレッジ取得API
 * ------------------------------------------------------------------ */
int GetTrueAccountLeverage() {
  //--- ウソの値を返してくるサーバは固定値を返却
  const string serverName = AccountServer();
  if (StringCompare(serverName, "SaxoBank-Live") == 0) { return 25; }

  //--- 正しい値を返すサーバはAccountLeverageの値を使用
  return AccountLeverage();
}

/* ------------------------------------------------------------------
 * [Function] 「ざっくり実効レバレッジ」取得API
 * ------------------------------------------------------------------ */
double GetRoughEffectiveLeverage() {
  return AccountMargin() * GetTrueAccountLeverage() / AccountEquity();
}

同様の挙動が他のFX業者であった場合は、上記コードの7行目のように場合分けを適宜追加して頂ければと思います。

スポンサーリンク

【まとめ】

MQL4における実効レバレッジの計算方法 をご紹介しました。

適宜コピー等して頂いて問題ありませんが、ご自分でも動作確認されることを推奨致します。

  • 特に、サクソバンクのようなレバレッジを正しく返さないブローカーの場合、上述の修正が必要になりますので。

なお、FXTFの実口座 (ロット数:0.85=85000通貨、通貨ペア数:5) にて検証したところでは、以下のようにほぼ同じ値となりました。※ご使用の口座や取引通貨で差が出るケースがあると思います。

算出方法実効レバレッジ
GetEffectiveLeverage関数5.5321
Excelによる手計算5.5326
Canary
Canary

前回のGMTオフセットと同様、これもMQL4側で

用意して貰えるといいな~って感じですよね😂

ではでは~

スポンサーリンク
\Canaryも愛用中のコスパ最強の国内VPS!! ご契約は是非ここから↓ <(_ _)>/

コメント

  1. 河合 より:

    仮想通貨取引所 Bitterz(ビッターズ) – IB(アフィリエイト)のご提案

    初めまして。   

    突然のご連絡失礼致します。

    私はBitterz(https://bitterz.com)のマーケティングマネージャーの河合と申します。

    このたびはサイトを拝見させて頂き、ご連絡差し上げました。

    貴殿のサイトは有益な情報が多く影響力をお持ちであると認識致しました。

    結論から言いますと、このご連絡は弊社におけるアフィリエイトプログラムのご提案です。

    初期費用なしで固定した報酬が見込まれる可能性が高いので

    是非内容をご確認頂き、弊社とご提携いただけるチャンスを頂けましたら幸いです。

    弊社は、Bitterz LLCという海外法人(セントビンセントおよびグレナディーン諸島)にて、Bitterzという仮想通貨取引所を運営しております。

    https://bitterz.com

    他社との差別化を考えた魅力のある以下のようなサービスを提供をしております。

    ・海外の仮想通貨取引所でありながらの日本製サイト

    ・万全のサポート体制(日本人スタッフによる業界最速サポート)

    ・デューリングとセキュリティ(24時間監視体制)

    ・最大レバレッジ888倍

    ・コールドウォレット運用

    ・トレーダーを保護するゼロカットシステム

    ・MetaTrader5対応で高速のレスポンス

    一般ユーザーへBitterzのご紹介をして頂き、IB報酬活動をして頂けないかと思っております。

    参考といたしまして、業界で有名な「クリプト○○」のIBプログラムでは報酬が最大20%となっておりますが、弊社Bitterzは最大50%となっております。

    またスプレッドは比較的大きめになっておりますので「クリプト○○」よりも高報酬の期待が持てます。

    BitterzではIB報酬ランクが4段階ございますが、

    この度はこのようにお願いに参りましたので、スタート時からダイヤモンドの最高ランク(報酬50%)でご利用して頂ければと思っております。
    (※因みに、「クリプト○○」では10%からスタートし10名以上の実入金のお客様のトレードを前提としております。)

    https://bitterz.com/ja/about/ib/reward

    ■IBパートナー登録フォームはこちらから可能となっております。

    https://partner.bitterz.com/ja/register

    *登録後、登録メールにてその旨(報酬50%スタート)をお知らせ下さい。

    ib_support_ja@bitterz.com

    Bitterzは2020年9月にサービスを開始してから会員数は約10万人です。

    これから数百万人規模のサービスを見込んで邁進して参りますので、

    是非この機会に一度ご検討頂けましたら幸いです。

    IB報酬活動(アフィリエイト)において、弊社の方でも全力のサポートをさせて

    頂きたく思いますので、何卒宜しくお願い申し上げます。

    ご丁寧に最後まで長文をお読み頂きまして誠に有難うございます。

    どんな些細な事でも、ご遠慮なくご質問下さいませ。

    ib_support_ja@bitterz.com

    マーケティングマネージャー 河合