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

保証金あたりのリスクからロットサイズを計算する機能 - MetaTrader 5のためのエキスパート

ビュー:
113
評価:
(4)
パブリッシュ済み:
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

price_open - 取引開始価格;

price_stoploss - 損切りレベルの価格;

risk_percent_equity - 取引ごとのリスクを保証金のパーセンテージで指定します;

double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity)
  {
   double volume = {};
   double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100;
   double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);
   double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);
   double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
   double delta_stoploss = MathAbs(price_open - price_stoploss);
   double margin_risk_1lot = delta_stoploss / tick_size * tick_value;
   volume =  margin_risk / margin_risk_1lot;
   volume = MathFloor(volume / lot_step) * min_lot;
   if(volume == 0)
      volume = min_lot;
   if(volume > max_lot)
      volume = max_lot;
   return volume;
  }

この関数でランダムに取引されるExpert Advisorの例

input int stoploss_points = 100;//損切りはpips単位
input double risk_percent_equity = 1;//預金に対するリスクの割合
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE order_type = ORDER_TYPE_BUY;
double equity_open = {};
double profit_expected = {};
bool pos_open = false;
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!pos_open)
     {
      MqlTradeRequest request;
      MqlTradeCheckResult result_check;
      MqlTradeResult result_trade;
      ZeroMemory(request);
      ZeroMemory(result_check);
      ZeroMemory(result_trade);
      double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
      if(order_type == ORDER_TYPE_BUY)
         order_type = ORDER_TYPE_SELL;
      else
         order_type = ORDER_TYPE_BUY;
      if(order_type == ORDER_TYPE_BUY)
        {
         request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
         request.type = ORDER_TYPE_BUY;
         request.sl = request.price - tick_size * stoploss_points;
         request.tp = request.price + tick_size * stoploss_points;
        }
      else
        {
         request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
         request.type = ORDER_TYPE_SELL;
         request.sl = request.price + tick_size * stoploss_points;
         request.tp = request.price - tick_size * stoploss_points;
        }
      double volume = GetVolByRisk(request.price, request.sl, risk_percent_equity);
      request.action = TRADE_ACTION_DEAL;
      request.symbol = Symbol();
      request.volume = volume;
      request.deviation = 5;
      profit_expected = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100;
      equity_open = AccountInfoDouble(ACCOUNT_EQUITY);
      if(OrderCheck(request, result_check))
        {
         OrderSend(request, result_trade);
         pos_open = true;
        }
     }
  }
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     {
      HistoryDealSelect(trans.deal);
      ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
      if(deal_entry == DEAL_ENTRY_OUT)
        {
         Print("==========");
         Print("volume= ", trans.volume);
         Print("equity_open= ", equity_open);
         Print("equity_close= ", AccountInfoDouble(ACCOUNT_EQUITY));
         Print("profit expected= +/- ", profit_expected);
         Print("profit real= ", HistoryDealGetDouble(trans.deal, DEAL_PROFIT));
         Print("==========");
         pos_open = false;
        }
     }
  }
//+------------------------------------------------------------------+
double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity)
  {
   double volume = {};
   double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100;
   double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);
   double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);
   double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
   double delta_stoploss = MathAbs(price_open - price_stoploss);
   double margin_risk_1lot = delta_stoploss / tick_size * tick_value;
   volume =  margin_risk / margin_risk_1lot;
   volume = MathFloor(volume / lot_step) * min_lot;
   if(volume == 0)
      volume = min_lot;
   if(volume > max_lot)
      volume = max_lot;
   return volume;
  }
//+------------------------------------------------------------------+


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

    ATR Cycles ATR Cycles

    速いATR、中間のATR、遅いATRの3つのATRに基づくボラティリティ・フィルター。

    KA-Gold Bot MT5 KA-Gold Bot MT5

    KA-Goldボットは、ケルトナーチャネル戦略と2つの指数移動平均(EMA)-10期間EMAと200期間EMA-の強力な組み合わせを利用した、金専用に設計された高度なトレーディングアドバイザーです。動作原理10期間EMAは、ケルトナー・バンドの上方/下方を切り下げる平均価格を表し、上昇トレンド/下降トレンドを確認します。価格が200期間EMAの上にあることは、上昇トレンド/下降トレンドをサポートします。これは、過去50期間のボラティリティを考慮すると、上昇トレンド/下降トレンドが過去10期間よりも強いことを示している:M15

    MathTicker - 数学モードの目盛りジェネレータ MathTicker - 数学モードの目盛りジェネレータ

    リアル・ティック・モードでティックを記録し、数学モードでティックごとにストラテジーを呼び出す。

    SAR ADX Signal SAR ADX Signal

    モバイル通知機能付きSAR ADXシグナル、MT4版からリライト(ソースが見つからなくなりました)。 再描画可能なインジケーターですので、ご使用の際はご注意ください。