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

 
Valeriy Yastremskiy #:

正确插入代码,alt S或通过图标,提示代码。

为什么你需要一个SaveTick 数组

你只用了数组中的2个元素。如果你在函数中声明它们,就用全局变量或静态变量代替它们。

用一个数组来表示2个变量是不理智的。

而且你似乎在调用FindTick() 函数之前调用了数组,在那里SaveTick 数组的大小被设置。而且有一个超限的阵列。

谢谢你。明白了。
你能告诉我是什么错误吗?在我看来,这个函数没有正确计数。


***
 
makssub #:

谢谢你。明白了。
你能告诉我是什么错误吗?在我看来,这个函数没有正确计数。


正确插入代码,它是答案窗口上面的第13个方框。

而且你可以用文字逐行写出该函数的作用。

它看起来当然不正确。

我不明白Tick 变量 在哪里以及如何分配订单票 的。而不需要根据以下条件检查魔法数和订单类型
_magic < 0 || OrderMagicNumber() == _magic
如果函数被调用时魔法数小于零或魔法数等于所选订单的数量,我们将请求点的大小,如果等于零,我们将在订单符号中寻找一个空值...等等。

哦,记住,订单选择填入订单的数据结构并存储。而只有在下一个订单选择不同的订单号或票据后,这个结构中的数据才会发生变化。

也就是说,OrderSend并不填充订单数据结构,而是返回订单票或减去1。而订单结构只由OrderSelect填入。然后可以从这个结构中获得这个订单的数据。

 
Valeriy Yastremskiy #:

正确插入代码,它是答案窗口顶部的第13个方框。

而且你可以用文字逐行写出该函数的作用。

当然,这似乎是错误的。

而且不清楚Tick 变量 在哪里以及如何分配订单票 的。而不需要根据以下条件检查魔法数和订单类型
_magic < 0 || OrderMagicNumber() == _magic
如果函数被调用时魔法数小于零或魔法数等于所选订单的编号,我们将要求点的大小,如果等于零,我们将在订单符号中寻找一个空值...等等。

哦,记住,订单选择填入订单的数据结构并存储。而只有在下一个订单选择不同的订单号或票据后,这个结构中的数据才会发生变化。

也就是说,OrderSend并不填充订单数据结构,而是返回订单票或减去1。而订单结构只由OrderSelect填入。然后从这个结构中我们可以得到这个订单的数据。

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);
}

在第一个函数中,我们找到所需的订单票据,第二个函数应计算该票据之后关闭的所有订单的利润。那些在它之前的订单的利润对我来说毫无意义。但第二个人没有正确地计算它。当一个订单被打开时,这两个函数被调用,因此它应该等于0,但事实并非如此。
PS接受了你的建议,放弃了数组)
上面的第12个盒子)

 
makssub #:

在第一个函数中,我找到所需订单的票据,第二个函数应计算在此票据之后关闭的所有订单的利润。我对前面那些人的利润不感兴趣。
PS接受了你的建议,我拒绝了数组)
,从上面的第12个方块)

第一个函数找到数字最高的票,如果票随数字增加而增加))在循环的下一次迭代中,下一个最高编号的订单的票与上一个订单的票进行比较。订单选择填充了订单结构,OrderTicket从这个结构中获取票据值。

自己写或读每行代码的作用。

在第二个函数中,OrderSelect将用相同的票据数据填充订单结构)

 
Valeriy Yastremskiy #:

第一个函数找到数字最高的票,如果票数随数字增加而增加))在循环的下一次迭代中,下一个最高编号的订单的票与上一个订单的票进行比较。订单选择填充了订单结构,OrderTicket从这个结构中检索票据值。

自己写或读每行代码的作用。

在第二个函数中,OrderSelect将用相同的票据数据填充订单结构)

拼出来了,但似乎关于这种语言的逻辑性不好。你能告诉我如何确定最后一个开放订单的票据吗?

我如何计算它之后的所有平仓订单的利润?

 
makssub #:

拼出来了,但似乎与这种语言的逻辑关系不好。你能告诉我如何确定最后一个开放订单的票据吗?

我如何计算它之后的所有平仓订单的利润?

在打开订单的时候。它应该是最大的。)而且我们不应该使用订单号。或者我们必须在我们的基础上存储订单号码、票据、订单状态和开/关时间。

 if(OrderSelect(Ticket, SELECT_BY_TICKET)==true) // Если выбор рыночного ордера произошел успешно
        {
         if(OrderCloseTime()==0)              // Если наш рыночный ордер не закрыт           {
            
            //           Alert("Наш рыночный ордер жив, Модифицируем его если нужно ");
            if(Tral_Stop!=0 || Tral_Profit!=0)
          {     ModifyTral(); }
            return;
           }
         if(OrderCloseTime()!=0)              // Если наш рыночный ордер закрылся
         {
Alert("Our market order has closed. The Adviser's work is completed ",
                  " Swap = ", OrderSwap(), " Commission = ", OrderCommission(),"Profit/loss = ",OrderProfit());
         // ..... // получаем профит и считаем общий профит например
         }

而且最好是把逻辑记到最后。那就更容易了。最好从必要的数据开始,而且应该有足够的数据来做决定)

我们有开放的订单时间(非待定)。我们有他们的票。我们有一个开放的价格,每个市场订单的SL和TP。而且有一个秩序关闭的时间。而在订单关闭后,"利润 "字段被填入。

这是我们需要在这些字段中创建逻辑的数据。

完全没有定义 "在最后一个未平仓订单之后的平仓订单 "这一短语。他们可以按编号、按票据和按时间进行。

 
Valeriy Yastremskiy #:

在订单的开放时间之前。它应该是最大的)

你写得很正确,但代码看起来有点复杂 )))))

我会按照你说的方式来做。

int GetTicketLastOpenOrder()
{
   int ticket = -1;
   datetime t = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderType() <= OP_SELL && OrderOpenTime() > t)
      {
         ticket = OrderTicket();
         t = OrderOpenTime();
      }
   }
   return(ticket);
}


ZS: 通过票号的OrderSelect()比通过未平仓订单的简单搜索需要更长的执行时间。

 
Igor Makanu #:

你写得很正确,但代码有点绕口 ))))

就按你想的方式写吧。


S:通过票号选择订单()比简单地枚举未结订单要花更多时间。

谢谢伊戈尔,只是当他们不理解本质的时候,正确的代码不能传达本质的东西,所以我要求把不复杂的算法放到word))))。

 
Valeriy Yastremskiy #:

在订单的开放时间之前。应该是最大的)而且只能是不按订单号,往往开票也没有帮助。或者在你的数据库中记住订单号、票据、订单状态和开/关机时间。

而且最好是把逻辑记住,直到最后。那就更容易了。最好从必要的数据开始,而且应该有足够的数据来做决定)

我们有开放的订单时间(非待定)。我们有他们的票。我们有一个开放的价格,每个市场订单的SL和TP。而且有一个秩序关闭的时间。而在订单关闭后,"利润 "字段被填入。

这是我们需要在这些字段中创建逻辑的数据。

完全没有定义 "在最后一个未平仓订单之后的平仓订单 "这一短语。他们可以按编号、按票据和按时间进行。

非常感谢您的答复。我已经实施了你的一些建议。
,我已经写了一个函数,可以找到正确的勾。
编写了一个函数,在所选函数的预期订单刻度后,计算所有平仓订单的利润。我现在要做的就是根据你的建议进行修正,并增加一个按时间检查等。

tpl = NormalizeDouble(Bid - ProfitLock*Point, Digits);
            ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, "",Magic, 0, Red);


double CalculateProfitHistory()
{
double order=0,op=0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
      if(OrderSelect(Tick,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
         {
            
            
            op += OrderProfit();
            order +=op;
            cnt++;
            
         }
      }
      }
   return(order);
  }

现在唯一让我困惑的是,它的计算方式不正确。如果TP的测试结果是0.02,它就会计算并在Comment中写下0.1300。你能告诉我它有什么问题吗?

 
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.09.02
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...