私たちのファンページに参加してください
- ビュー:
- 1459
- 評価:
- パブリッシュ済み:
- 2017.03.31 18:11
- アップデート済み:
- 2018.02.15 17:31
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
取引当りのリスクに応じてロット価値を計算する例です。
更新:2016年12月28日 -> バージョン1.001
新しいこと:
計算されたロットを出力(印刷)する2つの方法が追加されました。方法1 - StopLossをゼロに設定する場合。
sl=0.0;
check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
Print("sl=0.0",
" CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
", Balance: ", DoubleToString(m_account.Balance(),2),
", Equity: ", DoubleToString(m_account.Equity(),2),
", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
方法2 — 下記のコ―ドを参照:
sl=m_symbol.Bid()-ExtStopLoss;
check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
Print("sl=",DoubleToString(sl,m_symbol.Digits()),
" CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
", Balance: ", DoubleToString(m_account.Balance(),2),
", Equity: ", DoubleToString(m_account.Equity(),2),
", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
また、取引操作の結果が確認されるようになりました。
{
if(m_trade.ResultDeal()==0)
count--;
}
else
count--;
第1のチェック:Buyメソッド操作の終了が "true"を返したのにResultDeal()メソッドが "0"を返した場合(これはリクオートの場合に起こる可能性があります) は"count"カウンターを1つ減らされるべきです。
第2のチェック:Buyメソッドの終了が"false"を返した場合、"count"カウンタは1つ減らされるべきです。
なぜ"count"を1つ減らす必要があるのでしょうか?この場合、980ティックをもう一度待たずに、次のティックで参入することができるからです。
動作法:
取引あたりのリスク比率(% riskパラメータ)と決済逆指値(StopLoss(ピップ単位)パラメータ)を設定します。これは、預金損失可能性パラメータを定義します。
取引をシミュレートするために次のループが実装されています。
if(count%980==0) // 980ティックを通過する
{
//--- 買いポジションのロットサイズの取得 (CMoneyFixedRisk)
初期値のcount=-21はストラテジーテスタを「準備」するために設定されています。次に、countを980(この数はランダムに選択されたものです)で除算した後の余りを計算します。これは、980ティックごとにロットの計算サイクルが開始され、ロットが取引当たりのリスクを考慮して計算されることを意味します。
取引あたりのリスクに応じたロット計算サイクル(買いポジションの計算):
ステップ1
double sl=0.0;
double check_open_long_lot=0.0;
//--- バリアント#1:StopLoss=0.0
sl=0.0;
check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
Print("sl=0.0",
", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
", Balance: ", DoubleToString(m_account.Balance(),2),
", Equity: ", DoubleToString(m_account.Equity(),2),
", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
//--- バリアント#2:StopLoss!=0.0
sl=m_symbol.Bid()-ExtStopLoss;
check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
Print("sl=",DoubleToString(sl,m_symbol.Digits()),
", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
", Balance: ", DoubleToString(m_account.Balance(),2),
", Equity: ", DoubleToString(m_account.Equity(),2),
", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
if(check_open_long_lot==0.0)
return;
次に、CMoneyFixedRisk クラスのCheckOpenLongメソッドを使用して、決済逆指値を考慮したBuyポジションの計算されたロット値をcheck_open_long_lot変数に受け取ります。
決済逆指値、取引当りのリスクに応じて計算されたロット値、計算時の取引口座残高、計算時の証拠金のパラメータはエキスパートの操作ログに出力されます。
計算が"0.0"を返した場合は終了します。
return;
ステップ 2
その後、十分な資金を持っている買いポジションのロット価値を受け取ります。 この値はCTradeクラスのCheckVolumeメソッドを使用してchek_volime_lot 変数で受け取られます。ここでは、m_symbol.Name()-銘柄名、 check_open_long_lot - 開こうとするポジションの数量(このパラメータは先に計算されたものです)が受け渡しされます。
double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);
ステップ3
CheckVolumeメソッドが "0.0"以外の値を返した場合、リスクに応じて計算されたロットのポジションを開くのに十分な金額を持っているかどうかを確認します。
if(chek_volime_lot>=check_open_long_lot)
m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss);
else
Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
", CTrade lot = ",DoubleToString(chek_volime_lot,2));
十分な資金がある場合はポジションを開きます。そうでない場合は、取引当りのリスクによって計算されたロット価値(DoubleToString(check_open_long_lot,2))と、資金がカバーできるロットの値(DoubleToString(chek_volime_lot,2))がエキスパート操作ログに印刷されます。<分節0297>.
例(ストラテジテスターでテストする場合は、EURUSD、M1、テスト期間は2016.11.28から、入金$ 3000):
買いポジションが開かれました(テスタージャーナルから抽出) - 取引当りのリスクに基づいて計算されたロットは2.23です。</ s0>
Money Fixed Risk (EURUSD,M1) 2016.11.28 00:03:24 sl=1.05942 CheckOpenLong: 2.23, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade 2016.11.28 00:03:32 instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 (1.06042 / 1.06076 / 1.06042)
Trades 2016.11.28 00:03:32 deal #2 buy 2.23 EURUSD at 1.06076 done (based on order #2)
Trade 2016.11.28 00:03:32 deal performed [#2 buy 2.23 EURUSD at 1.06076]
Trade 2016.11.28 00:03:32 order performed buy 2.23 at 1.06076 [#2 buy 2.23 EURUSD at 1.06076]
Money Fixed Risk (EURUSD,M1) 2016.11.28 00:03:32 CTrade::OrderSend: instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 [done at 1.06076]
Money Fixed Risk (EURUSD,M1) 2016.11.28 00:48:32 sl=0.0 CheckOpenLong: 0.01, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1) 2016.11.28 00:48:32 sl=1.05899 CheckOpenLong: 2.60, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1) 2016.11.28 00:48:32 CMoneyFixedRisk lot = 2.60, CTrade lot = 0.43
Trade 2016.11.28 00:53:15 stop loss triggered #2 buy 2.23 EURUSD 1.06076 sl: 1.05942 tp: 1.06142 [#3 sell 2.23 EURUSD at 1.05942]
Trades 2016.11.28 00:53:15 deal #3 sell 2.23 EURUSD at 1.05942 done (based on order #3)
Trade 2016.11.28 00:53:15 deal performed [#3 sell 2.23 EURUSD at 1.05942]
Trade 2016.11.28 00:53:15 order performed sell 2.23 at 1.05942 [#3 sell 2.23 EURUSD at 1.05942]
2番目のポジションを開くには資金が不十分だということが判明しました。
決済逆指値が指定されていない場合(StopLoss=0.0)は、計算されたロットは許容される最小ロット値と等しいことにご注意ください。
その結果、1番目のポジションは298.82の損失を持って決済逆指値によって決済されました。
これは$3000の入金の約10%のリスクに相当します。
MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/17199

このエキスパートアドバイザーは、移動平均ブレイクアウトを取引します。2つのiMA(移動平均、MA)、iRSI(相対強度指数、RSI)、2つのiEnvelopes(エンベロープ)が使用されます。

iStochastic(ストキャスティクス)とiRSI(相対力指数、RSI)指標を用いた取引です。

重要な銘柄パラメータと口座パラメータを表示します。

このエキスパートアドバイザーは、ローソク足のサイズが一定値を超えた場合にアラート音を鳴らします。