FXやその他投資についてのつれづれです
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんばんは(*'-')
今回はEAによくついている機能のマネーマネージメント(MM)を追加してみました。 あとは、マジックナンバーを判定して自分のエントリーだけを操作するようにしてみましたよ(・∀・) 対応したソースはこちら→ダウンロード(mq4) MM機能の実現にむけて、いくつかフリーで出ているEAを調べてみました。 いくつかのEAでは、口座残高に対していくつレバッジをかけるかでロット数を 決定していたので、私もそれで実装してみましたよ。 上から順に変更部分の解説 まずは外部パラメータの追加です --------------------------------------------------- // マジックNo extern int iMagicNo = 307004; //マネーマネージメント用 extern bool bMM = false; extern int iRisk = 1; extern double dVs_Usd = 0.01; extern double dMax_Lots = 50.0; extern double dMin_Lots = 0.1; --------------------------------------------------- マジックNoは、「このEAが出した注文はこれですよ」ってのを特定するID みたいなものですね。これを判定して自分が出した注文か特定するようにします(・∀・) MM用としては、まずMM機能を使うかどうかのフラグをbMMとして宣言します つきのiRiskは、1万ドルに対してレバッジをいくつにするかの数値です 口座残高が1万ドルでiRiskが1のときに0.1ロットの注文をだすんですね。 dVs_Usdってのは・・・私は121証券に口座があって、そこでは円口座なわけです でも、MT4対応の業者は海外でドル建ての口座になるので、ロジック変更無しで 対応したいなと思って追加しました。1ドルに対しての比率を入れます。 円建て口座の場合は0.01くらいにしておくと、100万円で0.1ロットになるようにします また、ドル建て口座の場合は1にしておきます dMax_Lotsと、dMin_Lotsはそれぞれ名前のとおり、これ以上(以下)になったら そこまでに収めるための値です 次に、計算したロット数を格納するを内部変数にします --------------------------------------------------- //ロット数(実態) double dEntry_Lots=0.1; --------------------------------------------------- MMで計算したロット数を格納します。 詳しくはロジックで('∇') MM機能を呼び出すロジックの追加です --------------------------------------------------- //ロット数の計算 MM(); --------------------------------------------------- まあ、関数の名前のセンスはあれですが、MM自体を関数化したのでねw 注文時のパラメータ変更 --------------------------------------------------- OrderSend(Symbol(), OP_BUYSTOP, dEntry_Lots, Ask + dEntryPip, iSlip, dStopOrder, dLimitOrder, "売り注文", iMagicNo, 0, CLR_NONE); --------------------------------------------------- ここで外部パラメータのiMagicNoを使用します。 また、dLotsからdEntry_Lotsへ変更しています。 次にマジックNoでの判定を追加です --------------------------------------------------- bool bSelected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(bSelected == true && OrderMagicNumber() == iMagicNo){ --------------------------------------------------- 注文を特定するロジック(トレーリングストップや、クローズ処理など) でOrderSelect後にOrderMagicNumber()と、注文を出したときのiMagicNo が一致するかどうか判定を追加しています 最後にMM機能の関数を追加です --------------------------------------------------- double MM(){ if(bMM == true){ dEntry_Lots = AccountEquity()*dVs_Usd/100000*iRisk; dEntry_Lots = MathMin(dMax_Lots,MathMax(dMin_Lots,dEntry_Lots)); dEntry_Lots = NormalizeDouble(dEntry_Lots,1); }else{ dEntry_Lots = dLots; } return(dEntry_Lots); } --------------------------------------------------- 関数の最初でMM機能を使うかどうか判定します。 使わなければ、外部パラメータのdLotsを使用します MMを使う場合、まずAccountEquity()で口座残高を取得します 口座残高をドルだとどれくらいになるかdVs_Usdで計算します。 あとはそれを10万で割って(1万ドルで0.1ロットになるように)からiRiskを掛ければ、 基本的なロット数が出てきます 2行目ではMathMaxを使って、計算して出た結果か、最小ロット数か大きいほうを出しています 口座残高が1万円とかだと0.001ロットになるので、そういう場合は0.1ロットになります 次にMathMinをつかって、最大ロット数と比較し、小さい方を出しています。 3行目では、計算で出すと0.113とかになってしまうので、小数第1位で 四捨五入しています で、結果をdEntry_Lotsに格納して、いざトレードのときのロット数にしているわけですね(・∀・) このEAでMM機能をONにしてiRisk を1に設定してバックテストしました 下の緑の線はロット数を意味してるのですが、後半で長くなっていますね 15000ドルを超えたところで見事に0.2ロットでエントリーしていますヽ( ゚∀゚)/ めでたく機能追加完了(・∀・) 次はどんな機能を追加しましょうかねぇ・・・(*'-') PR |
カレンダー
カウンター
プロフィール
投資は自己責任・自己判断で実施するようお願いいたします。
ここの情報を見て損失が発生しても責任は負えませんのでご注意してください
HN:
Aki
性別:
男性
最新コメント
[06/06 fxjol]
[02/18 FXに人生を賭ける男]
[01/01 Aki]
[01/01 Aki]
[12/31 FXに人生を賭ける男]
最新記事
ブログ内検索
最新トラックバック
アクセス解析
|