証拠金維持率からロット数を調整したい場合(処理)

EA
スポンサーリンク

FXをやっていると、証拠金維持率が気になって微妙なロット数でエントリーしちゃったりしていませんか?

EAも同じく、取り合えず1ロット固定で・・・みたいにしていませんか?

口座残高が500万円で、何ロットでエントリーしたら証拠金維持率200%になるの?口座残高が600万円で、何ロットでエントリーしたら証拠金維持率200%になるの?証拠金維持率をある一定の%に保ちつつロット(Lot)数を調整しながらトレードしたい場合、都度計算しなければいけません。

何ロットでエントリーしたらいいかを自分で計算するのは面倒なので、今回はMT4のEAで自動で計算するMQL4プログラムを作りました。

もしよかったら使ってみてください。

主な使用関数

AccountInfoDouble();

アカウント情報を返す。

AccountInfoDouble(ACCOUNT_BALANCE)を使って自分の口座残高を取得します。

MarketInfo();

マーケット情報を返す。

MarketInfo(Symbol(),MODE_MARGINREQUIRED)で取引通貨の1ロット分の必要証拠金を返します。

MarketInfo(Symbol(),MODE_MAXLOT));で取引通貨の最大ロット数を返します。

NormalizeDouble();

少数点以下の桁数を四捨五入した値を返す。

NormalizeDouble(x, 2)で0.01の形にまで四捨五入した値を返します。

ソースコード

証拠金維持率を一定に保つための、ロット数を返す関数(証拠金維持率保持関数)です。


//+------------------------------------------------------------------+
//|【関数】証拠金維持率に対してのロット数を取得する
//| 
//|【引数】 SyoukoIji:証拠金維持率  (200%に設定したい場合、200)
//|       SaidaiLot:最大ロット数を設定する (0設定で、自動取得) 
//|
//|【戻値】ロット数(1000通貨=0.01) 
//| 
double funcLotGet(int SyoukoIji,int SaidaiLot)
{
   double Kekka=0;
      
   //最大ロット数確認
   double server_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
      
   if(SaidaiLot == 0 || SaidaiLot > server_Lot){
      SaidaiLot = server_Lot;
   }
      
   //口座残高
   double KouzaMoney = AccountInfoDouble(ACCOUNT_BALANCE);
       
   //利用可能金額算出
   Kekka = KouzaMoney / SyoukoIji * 100;
       
   //必要証拠金(1ロット分)で割る
   Kekka = Kekka / MarketInfo(Symbol(),MODE_MARGINREQUIRED);
       
   //少数点を0.01単位までにする
   Kekka = NormalizeDouble(Kekka, 2);
       
   //最大ロット数を超えている場合は、最大ロット数にする
   if(Kekka > SaidaiLot){
      Kekka = SaidaiLot;
   }
    
   return Kekka;   
}

解説

引数

引数1は証拠金維持率を、%の値で渡す形にしています。※200%なら200

引数2は最大ロット数を、ロット数の値で渡す形にしています。0を設定すると、ブローカーの最大ロット数を自動で取得するようにしています。また、ブローカーの最大ロット数よりも大きい値が引数2にセットされていた場合も、ブローカーの最大ロット数にするようにしています。
※FX業者によって最大ロット数は決められており、10ロットまでしか対応していない場合、11ロットでエントリーしようとしてもエラーでエントリーできないため

(例)引数2に5をセットした場合で、ブローカーの最大ロット数が10の場合
   最大5ロットでエントリーします

   引数2に15をセットした場合で、ブローカーの最大ロット数が10の場合
   最大10ロットでエントリーします。

戻り値

引数1に設定した証拠金維持率になる、ロット数を返します。 ※1ロット=10万通貨
(引数2に設定した値を超えることはありません)

処理内容

まず自分の口座の口座残高を取得し、証拠金維持率で割っています

(5,000,000円 / 200%) * 100 = 2,500,000円

次に、2,500,000円を必要証拠金(1ロット10万通貨分)で割っています。

2,500,000円 / 430,000円 = 5.81395・・・

※補足情報・・・MarketInfo(Symbol(),MODE_MARGINREQUIRED)については、USDJPY以外にEURUSDやEURGBP等でも確認しましたが、どれも問題なく必要証拠金が取れてました

次に、四捨五入でロット数を出しています。

5.81395・・・小数点第三位を四捨五入 = 5.81

最後に、引数で渡している最大ロット数を超えている場合は最大ロット数にしています。(FXTFだと10ロットまでしか対応していない等のため)

証拠金維持率保持関数の使用例

      // 新規エントリー注文
      int CNo = OrderSend(
               NULL,                // 通貨ペア
               OP_BUY,              // オーダータイプ[OP_BUY / OP_SELL]
               funcLotGet(200,10),  // ロット[0.01単位](証拠金200%維持、FXTFは最大10Lot)
               Ask,                 // オーダープライスレート
               ・・・

OrderSend()関数のロット数のところに書き込む感じです。あとは、funcLotGet()関数をソース内にそのまま貼り付けてください。

使用した結果はこんな感じで、証拠金維持率は常に200%前後で推移するロット数でエントリーできています。

 

※ EAのサンプルソースを一覧表にまとめました


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


※ 1からEAの作り方を学びたい人はこちら

コメント

タイトルとURLをコピーしました