無料でロボットをダウンロードする方法を見る
Facebook上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
エキスパート

Money Fixed Risk - MetaTrader 5のためのエキスパート

ビュー:
1272
評価:
(23)
パブリッシュ済み:
2017.03.31 18:11
アップデート済み:
2018.02.15 17:31
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

取引当りのリスクに応じてロット価値を計算する例です。

更新:2016年12月28日 -> バージョン1.001

新しいこと:

計算されたロットを出力(印刷)する2つの方法が追加されました。方法1 - StopLossをゼロに設定する場合。

      //--- バリアント#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 — 下記のコ―ドを参照:

      //--- バリアント#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(m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss))
              {
               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(ピップ単位)パラメータ)を設定します。これは、預金損失可能性パラメータを定義します。

Money Fixed Risk入力 

取引をシミュレートするために次のループが実装されています。

   static long count=-21;
   if(count%980==0) // 980ティックを通過する
     {
      //--- 買いポジションのロットサイズの取得 (CMoneyFixedRisk)

初期値のcount=-21はストラテジーテスタを「準備」するために設定されています。次に、count980(この数はランダムに選択されたものです)で除算した後の余りを計算します。これは、980ティックごとにロットの計算サイクルが開始され、ロットが取引当たりのリスクを考慮して計算されることを意味します。

取引あたりのリスクに応じたロット計算サイクル(買いポジションの計算):

ステップ1

      //--- 買いポジションのロットサイズの取得 (CMoneyFixedRisk)
      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変数に受け取ります。

      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss);

決済逆指値、取引当りのリスクに応じて計算されたロット値、計算時の取引口座残高、計算時の証拠金のパラメータはエキスパートの操作ログに出力されます。

計算が"0.0"を返した場合は終了します。

      if(check_open_long_lot==0.0)
         return;

ステップ 2

その後、十分な資金を持っている買いポジションのロット価値を受け取ります。 この値はCTradeクラスのCheckVolumeメソッドを使用してchek_volime_lot 変数で受け取られます。ここでは、m_symbol.Name()-銘柄名、 check_open_long_lot - 開こうとするポジションの数量(このパラメータは先に計算されたものです)が受け渡しされます。 

      //--- "not enough money(不十分な資金)"エラー(CTrade)を避けるためにOrderSendの前に数量を確認する
      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!=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):

Money Fixed Risk.png 

買いポジションが開かれました(テスタージャーナルから抽出) - 取引当りのリスクに基づいて計算されたロットは2.23です。</ s0>

Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:24   sl=0.0 CheckOpenLong: 0.01, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
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の損失を持って決済逆指値によって決済されました。

Money Fixed Risk 履歴

これは$3000の入金の約10%のリスクに相当します。

MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/17199

Hercules A.T.C. 2006 Hercules A.T.C. 2006

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

The Puncher The Puncher

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

ShowImportantParams ShowImportantParams

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

BigBarSound BigBarSound

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