新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1248

 
jaffer wilson:

@ Artyom Trishkin @ Vladimir Pastushak

在我的情况下不起作用。我不是在要求一个新的职位。我知道它为一种类型的交易计算并返回保证金。但如果交易已经开始,而我想知道某一特定符号的一笔交易所消耗的保证金,那就没有用了。

你能帮助我吗?如果你不理解我的情况,请告诉我。

简单解释一下这个场景。

你在ToolBox中看到这个字段。

这是符号的保证金:AUDJPY、EURUSD和EURTRY。

我知道我可以用AccountInfoDouble(ACCOUNT_MARGIN)得到这个值。但我无法得到一个特定符号的值。例如,我想知道EURUSD消耗了多少保证金。我不能履行任何职能。因此,我想知道如何才能计算出来。

我希望这个解释足够有意义。

//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh> CPositionInfo     m_position;
//+------------------------------------------------------------------+
struct str__
  {
   string            symbol;
   double            margin;
  };
str__ symb[];
//+------------------------------------------------------------------+
void OnTick()
  {

   int total = PositionsTotal(), c = 0;

   ArrayResize(symb, total);

   for(int k = total - 1; k >= 0; k--)
      if(m_position.SelectByIndex(k))
        {
         symb[c].symbol = m_position.Symbol();

         if(m_position.PositionType() == POSITION_TYPE_BUY)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_BUY, m_position.Volume());

         if(m_position.PositionType() == POSITION_TYPE_SELL)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_SELL, m_position.Volume());

         c++;
        }
        
        ArrayPrint(symb,2);
  }
//+------------------------------------------------------------------+
double  SymbolMargin(string aSymbol, ENUM_ORDER_TYPE aType, double aLot = 1.0)
  {

   double margin = 0;

   MqlTick m_tick;
   if(SymbolInfoTick(aSymbol, m_tick))
     {
      if(m_tick.ask != 0.0)
         if(OrderCalcMargin(aType, aSymbol, aLot, m_tick.ask, margin))
            return (margin * aLot);
      if(m_tick.bid != 0.0)
         if(OrderCalcMargin(aType, aSymbol, aLot, m_tick.bid, margin))
            return (margin * aLot);
     }

   return -1;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak :

@Vladimir Pastushak 我会试试的。但让我告诉你,这不是一个可行的解决方案。OrderCalcMargin()给出的值每次都会改变。但保证金的价值并没有改变。如果我关闭任何交易,保证金价值将与我开立交易时相同。但是当我使用OrderCalcMargin()时,我得到的数值发生了变化,与原来的数值完全不一样。

请让我知道你是否也在你那边尝试过这个方法。我知道这行不通。然而,我将按照你的坚持使用它。

 
Vladimir Pastushak :

我在欧元兑美元中开了一笔交易,手数为50。看看我使用你的函数后得到了什么。

(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589500.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589505.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589495.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589490.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589485.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589490.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589485.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589480.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589475.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589470.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589455.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589455.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 

你看,保证金是不断变化的。但已经开启的交易的价值并没有改变。你能告诉我现在该怎么做吗?

 
jaffer wilson:

我在欧元兑美元中开了一笔交易,手数为50。看看我使用你的函数后得到了什么。

你看,保证金是不断变化的。但已经开启的交易的价值并没有改变。你能告诉我现在该怎么做吗?

//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh> CPositionInfo     m_position;
//+------------------------------------------------------------------+
struct str__
  {
   string            symbol;
   double            margin;
  };
str__ symb[];
//+------------------------------------------------------------------+
void OnTick()
  {

   int total = PositionsTotal(), c = 0;

   ArrayResize(symb, total);

   for(int k = total - 1; k >= 0; k--)
      if(m_position.SelectByIndex(k))
        {
         symb[c].symbol = m_position.Symbol();

         if(m_position.PositionType() == POSITION_TYPE_BUY)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_BUY, m_position.Volume(), m_position.PriceOpen());

         if(m_position.PositionType() == POSITION_TYPE_SELL)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_SELL, m_position.Volume(), m_position.PriceOpen());

         c++;
        }

   ArrayPrint(symb, 2);
  }
//+------------------------------------------------------------------+
double  SymbolMargin(string aSymbol, ENUM_ORDER_TYPE aType, double aLot = 1.0, double aOpenPrice = 0)
  {

   double margin = 0;


   if(aOpenPrice != 0.0)
      if(OrderCalcMargin(aType, aSymbol, aLot, aOpenPrice, margin))
         return (margin * aLot);
   if(aOpenPrice != 0.0)
      if(OrderCalcMargin(aType, aSymbol, aLot, aOpenPrice, margin))
         return (margin * aLot);


   return -1;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak :

我已经尝试了上述代码。

我得到了这个。

(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 

但预期的价值是这样的。


 
Vladimir Pastushak :

对于其他符号,保证金值 仍在变化。因此,OrderCalcMargin()不是解决方案。你得到了它。请先在你那边试试。

 
jaffer wilson:

对于其他符号,保证金值 仍在变化。因此,OrderCalcMargin()不是解决方案。你得到了它。请先在你那边试试。

2个订单 5891 * 2 = 11782 如果你需要逐个符号处理数组...这不是一个问题...

 
Vladimir Pastushak :

2个订单 5891 * 2 = 11782 如果你需要逐个处理一个数组的字符...这不是一个问题...

但我只在欧元兑美元上做了一次交易。而且这个功能在其他符号上也不能正常工作。

 

你能告诉我是否有mql5指标的挂钩?要设置两个显示属性。

#property indicator_separate_window
#property indicator_chart_window

并以某种方式绑定不同的输出,每一个都有自己的映射属性。

 
Roman:

你能告诉我是否有mql5指标的挂钩?要设置两个显示属性。

并以某种方式绑定不同的输出,每一个都有自己的映射属性。

没有这样的钩子。不在右边,也不在左边。对MQL5来说,也不是MQL4。

在子窗口的主图上使用你自己的构造。

原因: