关闭订单的利润计算 "HELP" - 页 7

 
Sergey Gritsay:
那么这些东西都存在哪里呢? 你是把它写在某个变量或数组中吗? 先告诉我你把它储存在哪里,然后你就可以知道接下来该怎么做了。
哪儿都不行。你需要有能力地创造这一切,并收集利润数据。
 
Natashe4ka:

好吧,那我们来分解一下:有一个订单的关闭时间,有一个与关闭时间相吻合的票据或订单数量。我们如何合并和计算这些订单的利润
这似乎很容易,但我还是不明白。

到目前为止,没有人能够弄清楚哪些是用红色突出显示的。我们需要准确的标准来找到这些订单。因此,尽量解释,就像他们说的,在手指上,用图片等。
 
Sergey Gritsay:
到目前为止,没有人能够弄清楚哪些是用红色突出显示的。我们需要准确的标准来找到这些订单。所以尽量解释,就像他们在手指上说的那样,用图片等等。

?

为什么没有 能够理解这一点,你可能是指你自己?

很久以来,这一点已经很清楚了。

夫人只想自己做,不炫耀她的方案细节。

 
Sergey Gritsay:
到目前为止,没有人能够理解哪些是用红色突出显示的。我们需要准确的标准来寻找这些订单。出于这个原因,尽量解释,就像他们在手指上说的那样,用图片等等来解释

是的,我已经给出了一个100%的工作条件,并将其作为现成的代码附上。你还应该注意到,该代码使用的方法不受终端重启的影响,当终端被打开时,没有任何东西会丢失,会继续工作。但在这里,他们发明了一个只能在测试器中工作的轮子。

谢尔盖,还要注意的是,在原来的TS代码中,当你关闭一系列的5个头寸时,关闭中的订单也会被删除,这反过来也不会在实际交易中带来什么好结果。一般来说,除了TS之外,所有人都很清楚一切。

 
我想我明白娜塔莉亚想得到什么了
//+------------------------------------------------------------------+
//|                                                   Natashe4ka.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   color ProfitColor=0;

// START //
   LastProfitCL_1(Profit,TimeCurrent(),-1);
  
   if(Profit<0)ProfitColor=clrRed;
   else if(Profit>0)ProfitColor=clrLimeGreen;
   else ProfitColor=clrDarkGray;
  
   ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
   ObjectSet("Last Profit",OBJPROP_CORNER,1);
   ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
   ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //

  }
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();

   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderCloseTime()!=timecurent)continue;
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Вариант 2                                                               |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
     {
      timecurents=OrderCloseTime();
     }
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderCloseTime()<timecurents)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
....
 

纠正了第二个版本的函数

bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                    datetime timecurent,// текущее время
                    int op=-1//"op" позиция (-1 любая позиция)                
                    )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()!=op && op!=-1)continue;  
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
      if(OrderCloseTime()<timecurents)continue;

      profit+=OrderProfit()+OrderCommission()+OrderSwap();
      cnt++;
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }

..........

 
Sergey Gritsay:

纠正了第二个版本的函数

谢谢你的帮助。
变体1不能正常工作
变体2能正常工作。
我的变体也能正常工作,但如果订单结转到另一天或更长时间,数值就不清楚了 利润190,而它应该是4.27。

请看屏幕截图 #3https://www.mql5.com/ru/forum/162930/page3

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
  datetime t=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
       if (t<OrderCloseTime()) {t=OrderCloseTime();}
       if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 
事实证明,问题不在于订单的数量,而在于将订单转移到另一天或更长时间。
 
Natashe4ka:
事实证明,问题不在于订单的数量,而在于将订单转移到另一天或更长时间。
你是串联关闭还是什么?如果你在一个周期内关闭所有的订单,那么转移是什么?
 
Vitalie Postolache:
那么,你是在一个系列中关闭还是什么?如果你在一个周期内关闭所有的订单,那么结转率是多少?

订单按系列关闭,但如果没有关闭的条件,订单会聚集一两天,等等。
虽然,订单的数量也会影响到利润值。
如果有3个以上的订单,则只计算最后关闭的订单的数值。