OrderCalcMargin

この関数は、現在未決算の注文と未決済ポジションを考慮せずに、現在の口座で、指定された注文の種類に現在の市場環境で必要な証拠金を預金通貨で計算します。これは、計画された取引操作のための証拠金の評価を可能にします。値は口座の預金通貨で返されます。

bool  OrderCalcMargin(
  ENUM_ORDER_TYPE      action,          // 注文の種類
  string                symbol,          // 銘柄名
  double                volume,          // ボリューム
  double                price,            // 始値
  double&               margin           // 証拠金取得に使用される変数
  );

パラメータ

action

[in] ENUM_ORDER_TYPE 列挙のいずれかの値を持つ注文の種類

symbol

[in]  銘柄名

volume

[in]  取引操作のボリューム

price

[in]  始値

margin

[out]  関数の実行が成功した場合にリクエストされた証拠金の値が配置される変数。計算は、現在未決算の注文と未決済ポジションを考慮せずに行われます。証拠金の値は多くの要因に依存し、市場環境によって異なることがあります。

戻り値

成功の場合は true、それ以外の場合は false。エラー情報を取得するには、GetLastError() 関数が呼ばれます。

例:

#define   VOLUME     1.0   // 注文量
#define   DEVIATION 100   //予約注文を設定するための距離
#define   STOP_LIMIT 50   // ストップリミット注文の距離
 
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
  string currency=AccountInfoString(ACCOUNT_CURRENCY);
  int array_types[8]={ORDER_TYPE_BUY,
                      ORDER_TYPE_SELL,
                      ORDER_TYPE_BUY_LIMIT,
                      ORDER_TYPE_SELL_LIMIT,
                      ORDER_TYPE_BUY_STOP,
                      ORDER_TYPE_SELL_STOP,
                      ORDER_TYPE_BUY_STOP_LIMIT,
                      ORDER_TYPE_SELL_STOP_LIMIT };
                     
//--- 注文タイプによるループ
  for(int i=0; i<(int)array_types.Size(); i++)
    {
    //--- 注文タイプに応じて、ORDER_TYPE_BUYまたはORDER_TYPE_SELLタイプを取得する
    ENUM_ORDER_TYPE type=MarketOrderByOrderType((ENUM_ORDER_TYPE)array_types[i]);
     
    //--- 注文タイプに応じて、価格を取得する
    double price=PriceByOrderType(_Symbol, type);
     
    //--- actionで指定された注文タイプに必要な証拠金の金額を取得する
    double margin=EMPTY_VALUE;
    ResetLastError();
    if(!OrderCalcMargin(type, _Symbol, VOLUME, price, margin))
       {
        Print("OrderCalcMargin() failed. Error ",GetLastError());
        continue;
       }
    //--- 結果を操作ログに出力する
    PrintFormat("Margin required for %.2f %s order at price %.*f on %s symbol: %.2f %s", VOLUME, OrderTypeDescription((ENUM_ORDER_TYPE)i), _Digits, price, _Symbol, margin, currency);
    }
  /*
   結果:
  Margin required for 1.00 Buy order at price 1.31668 on GBPUSD symbol: 1316.68 USD
  Margin required for 1.00 Sell order at price 1.31661 on GBPUSD symbol: 1316.61 USD
  Margin required for 1.00 Buy Limit order at price 1.31568 on GBPUSD symbol: 1315.68 USD
  Margin required for 1.00 Sell Limit order at price 1.31761 on GBPUSD symbol: 1317.61 USD
  Margin required for 1.00 Buy Stop order at price 1.31768 on GBPUSD symbol: 1317.68 USD
  Margin required for 1.00 Sell Stop order at price 1.31561 on GBPUSD symbol: 1315.61 USD
  Margin required for 1.00 Buy Stop Limit order at price 1.31718 on GBPUSD symbol: 1317.18 USD
  Margin required for 1.00 Sell Stop Limit order at price 1.31611 on GBPUSD symbol: 1316.11 USD
  */
 }
//+------------------------------------------------------------------+
//| BuyまたはSellの注文タイプを返す                                         |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE MarketOrderByOrderType(ENUM_ORDER_TYPE type)
 {
  switch(type)
    {
    case ORDER_TYPE_BUY  : case ORDER_TYPE_BUY_LIMIT  : case ORDER_TYPE_BUY_STOP  : case ORDER_TYPE_BUY_STOP_LIMIT  :
      return(ORDER_TYPE_BUY);
    case ORDER_TYPE_SELL : case ORDER_TYPE_SELL_LIMIT : case ORDER_TYPE_SELL_STOP : case ORDER_TYPE_SELL_STOP_LIMIT :
      return(ORDER_TYPE_SELL);
    }
  return(WRONG_VALUE);
 }
//+------------------------------------------------------------------+
//| 注文タイプによる始値を返す                                              |
//+------------------------------------------------------------------+
double PriceByOrderType(const string symbol, const ENUM_ORDER_TYPE order_type)
 {
  int     digits=0;
  double point=0;
  MqlTick tick={};
 
//--- 銘柄のPoint値を取得する
  ResetLastError();
  if(!SymbolInfoDouble(symbol, SYMBOL_POINT, point))
    {
    Print("SymbolInfoDouble() failed. Error ", GetLastError());
    return 0;
    }
   
//--- 銘柄のDigits値を取得する
  long value=0;
  if(!SymbolInfoInteger(symbol, SYMBOL_DIGITS, value))
    {
    Print("SymbolInfoInteger() failed. Error ", GetLastError());
    return 0;
    }
  digits=(int)value;
 
//--- 銘柄ごとの最新価格を取得する
  if(!SymbolInfoTick(symbol, tick))
    {
    Print("SymbolInfoTick() failed. Error ", GetLastError());
    return 0;
    }
   
//--- 注文タイプに応じて価格を返す
  switch(order_type)
    {
    case ORDER_TYPE_BUY              : return(tick.ask);
    case ORDER_TYPE_SELL             : return(tick.bid);
    case ORDER_TYPE_BUY_LIMIT        : return(NormalizeDouble(tick.ask - DEVIATION * point, digits));
    case ORDER_TYPE_SELL_LIMIT       : return(NormalizeDouble(tick.bid + DEVIATION * point, digits));
    case ORDER_TYPE_BUY_STOP         : return(NormalizeDouble(tick.ask + DEVIATION * point, digits));
    case ORDER_TYPE_SELL_STOP        : return(NormalizeDouble(tick.bid - DEVIATION * point, digits));
    case ORDER_TYPE_BUY_STOP_LIMIT   : return(NormalizeDouble(tick.ask + DEVIATION * point - STOP_LIMIT * point, digits));
    case ORDER_TYPE_SELL_STOP_LIMIT  : return(NormalizeDouble(tick.bid - DEVIATION * point + STOP_LIMIT * point, digits));
    default                          : return(0);
    }
 }
//+------------------------------------------------------------------+
//| 注文タイプの説明を返す                                                 |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE order_type)
 {
  switch(order_type)
    {
    case ORDER_TYPE_BUY              : return("Buy");
    case ORDER_TYPE_SELL             : return("Sell");
    case ORDER_TYPE_BUY_LIMIT        : return("Buy Limit");
    case ORDER_TYPE_SELL_LIMIT       : return("Sell Limit");
    case ORDER_TYPE_BUY_STOP         : return("Buy Stop");
    case ORDER_TYPE_SELL_STOP        : return("Sell Stop");
    case ORDER_TYPE_BUY_STOP_LIMIT   : return("Buy Stop Limit");
    case ORDER_TYPE_SELL_STOP_LIMIT  : return("Sell Stop Limit");
    case ORDER_TYPE_CLOSE_BY         : return("Close By");
    default                          : return("Unknown order type");
    }
 }

参照

OrderSend()注文プロパティ取引操作の種類