初学者的问题 MQL4 MT4 MetaTrader 4 - 页 250

 

如果是简单的,要快速检查,是这样的。

   double profit = 0;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if(OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                  if(profit>max)
                    { 
                    cnt=OrdersTicket();
                    break;
                    }                  
                 }
              }
           }
        }
     }

订单通常在时间上彼此相继,但这并不保证。因此,应检查年表。但对于实验来说,这就可以了。

 
Aleksei Stepanenko #:

如果是简单的,要快速检查,是这样的。

订单通常在时间上彼此相继,但这并不保证。因此,应检查年表。但这可以做为实验。

我同意,时间是无法保证的。 这就是为什么我想按票面增加的方向去看所有已关闭的订单。我知道订单票,并试图从中计算,但有些地方出错了)正确的方法是什么?

 
Aleksei Stepanenko #:

如果是简单的,要快速检查,是这样的。

订单通常在时间上彼此相继,但这并不保证。因此,应检查年表。但这可以做为实验。

如果我们翻阅历史记录,最好是翻阅那些在重新计算的时刻会关闭的从小到大的订单,因为市场订单是由大到小考虑的,这样我们就可以正确考虑那些在同一时刻打开和关闭的订单。我想是的)

Aleksei Stepanenko#:

如果是简单的快速检查,那么就是这样的事情。

根据经验,订单在时间上是相互跟随的,但这并不保证。因此,以一种好的方式,应该检查年表。但它可以用来做实验。

阿列克谢的代码不也是这样的吗?

 
Valeriy Yastremskiy #:

在历史记录中,最好是通过从小到大的订单来考虑那些将在重新计算时关闭的订单,我们正是通过从大到小的市场订单来正确计算在同一时刻的开仓和关闭。我想是的)

阿列克谢的代码是否也计算错误?

我还没有试过。我现在就去试试。我会让你知道的。

 
Aleksei Stepanenko #:

如果是简单的,要快速检查,是这样的。

订单通常在时间上彼此相继,但这并不保证。因此,应检查年表。但它可以用来做实验。

我检查了一下,在编译过程中出现了很多错误,我把它们都修好了,除了.NET的错误。

if(profit>max)

这句话,我不太明白。你能解释一下吗?

 
makssub #:
这个想法是在你达到一定的利润后改变票价

最大是指利润的极限,超过这个极限,票就会改变。该值由你设定。

 
Aleksei Stepanenko #:

最大是指利润的极限,超过这个极限,票就会改变。它的值由你来设定。

如果我理解正确的话,问题是不同的。有1、2和3个订单。我不知道公开价格是如何形成的。订单3被关闭,总利润等于订单3的利润。也就是说,我们需要计算在订单3之前开出的订单的票。那么订单2是封闭的。我们应该找到在订单2之前打开的订单的票据。总利润等于订单2和3的利润。

我不明白为什么,但这似乎是一种逻辑)。

 
瓦莱里,我不完全理解这两句话的逻辑。
 
Aleksei Stepanenko #:
瓦莱里,我没有完全理解这两句话的逻辑。

关于交易、自动交易系统和策略测试的论坛

初学者的常见问题 MQL4 MT4 MetaTrader 4

makssub, 2021.09.01 16:38

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   
   
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return(tick); 
   }              
int TickF = FindTicket();
int CalculateProfitHistory() 
{
  double _point;
  int    i, _ototal = OrdersHistoryTotal(), _profit=0;
  for   (i = 0; i < OrdersHistoryTotal(); i++) 
  {
    if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
      if (OrderSymbol() == Symbol())
      {
        if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0) 
           {
              if (StringFind(OrderSymbol(), "") < 0) 
                 _point = 0.0001; 
              else _point = 0.01;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
  return(_profit);
}

我应该用第一个函数找到所需的订单票据,第二个函数应该计算该票据后所有平仓订单的利润。我对之前的利润不感兴趣。但第二个人没有正确地计算它。当一个订单被打开时,这2个函数被调用,因此它应该等于0,但它不是。
PS接受了你的建议,放弃了数组)
上面的第12个盒子)


 

我已经想好了一切,并根据你的提示做出了自己的选择)

任务是用其他获利的订单来弥补一个亏损的订单。

我们已经实施了它。我们记住了输掉的那张订单 后开出的;这就是我们的报告点。在这一点上,我们开始计算亏损订单的利润和它之后的封闭订单的利润。让我提醒你,第一笔订单是开放的,当它达到盈利时,我们就关闭它。

如果 ( (CalculateProfitHistory() + FirstProfit() >= Profit)

{

CloseFirst()。

打印("关闭第一个亏损订单")。

}


double CalculateProfitHistory() 
{
   double profit = 0;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderMagicNumber() == Magic )
               {
                  if (Ticket !=0)
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return(profit);
}