今回は、MT4のEAサンプルソース(FX用)を公開します。
証拠金維持率からロット数を調整する関数となっておりますので、是非使ってみて下さい。
はじめに
FXをやっていると、証拠金維持率が気になって微妙なロット数でエントリーしちゃったりしていませんか?
EAも同じく、取り合えず1ロット固定で・・・みたいにしていませんか?
口座残高が500万円で、何ロットでエントリーしたら証拠金維持率200%になるの?口座残高が600万円で、何ロットでエントリーしたら証拠金維持率500%になるの?
証拠金維持率をある一定の%に保ちつつロット(Lot)数を調整しながらトレードしたい場合、都度計算しなければいけません。
何ロットでエントリーしたらいいかを自分で計算するのは面倒なので、今回はMT4でロット数を自動計算するMQL4プログラムを作りました。
ソースコード
証拠金維持率を一定に保つための、ロット数を返す関数(証拠金維持率保持関数)です。
//+------------------------------------------------------------------+
//|【関数】証拠金維持率に対してのロット数を取得する
//|
//|【引数】 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%前後で推移するロット数でエントリーできています。
主な使用関数
AccountInfoDouble();
アカウント情報を返す。
AccountInfoDouble(ACCOUNT_BALANCE)を使って自分の口座残高を取得します。
MarketInfo();
マーケット情報を返す。
MarketInfo(Symbol(),MODE_MARGINREQUIRED)で取引通貨の1ロット分の必要証拠金を返します。
MarketInfo(Symbol(),MODE_MAXLOT));で取引通貨の最大ロット数を返します。
NormalizeDouble();
少数点以下の桁数を四捨五入した値を返す。
NormalizeDouble(x, 2)で0.01の形にまで四捨五入した値を返します。
さいごに
以上、証拠金維持率からロット数を調整したい場合の処理でした。
関数化しておくと、簡単に色んなEAに展開できるため便利です。もしよければ皆さんも使ってみて下さい。
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント
初めまして。
MQL4の勉強を始めて数週間の初学者です。
サンプルソース集が非常に参考になり、本当にありがたいです。
もし可能でしたら、1トレード当たり全体証拠金のN%のリスクを取るようなロットサイズを計算する関数?をこちらのサイトでご教授お願い致します。
これからもよろしくお願いします。
グレープドラゴンさん
はじめまして、参考にして頂き有難うございます!
全体証拠金といいますとどんな感じでしょう。
例えば口座資金50万円(余剰証拠金50万円)あって、米ドル/円の10万通貨の必要証拠金が5万円の場合、
N%を10%とすると結果【Lot=1.0(10万通貨)】となるような関数でしょうか?
お返事ありがとうございます!
ご丁寧にありがとうございます!
例えば50万円があって、始めに1トレード10%(5万円)失ってもいい(許容損失額)と逆指値幅を決定してから適正ロットを計算すると言うことです!
そういう事ですね。
出来ると思いますので、近々記事にしますね。
返信ありがとうございます!
楽しみに記事の更新を待ちますっ!
お待たせしました。
記事が書けましたのでまた参考にしてみてください。