Cálculo de beneficios de las órdenes cerradas "AYUDA" - página 7

 
Sergey Gritsay:
¿Y dónde existe todo esto? ¿Lo escribes en alguna variable o en un array? Muéstrame primero dónde lo almacenas, y entonces podrás ver qué hacer después.
No en cualquier lugar. Hay que crearlo todo de forma competente y recoger los datos de los beneficios.
 
Natashe4ka:

Bien, entonces desglosémoslo: hay una hora de cierre de los pedidos, hay un ticket o número de pedidos que coincide con la hora de cierre. ¿Cómo combinamos y calculamos el beneficio de estos pedidos?
Parece que es fácil, pero sigo sin entenderlo.

Hasta ahora nadie ha podido averiguar cuáles son los que están resaltados en rojo. Necesitamos los criterios exactos para encontrar estos pedidos. Por lo tanto, trate de explicar, como se dice, en los dedos, con imágenes, etc.
 
Sergey Gritsay:
Hasta ahora nadie puede averiguar cuáles son los que están resaltados en rojo. Necesitamos los criterios exactos para encontrar estos pedidos. Así que trata de explicarlo, como dicen en los dedos, con imágenes y demás.

?

¿Por qué nadie puede entender esto, probablemente te refieres a ti mismo?

Está claro desde hace mucho tiempo.

La señora sólo quiere hacerlo por su cuenta, sin alardear de los detalles de su programa.

 
Sergey Gritsay:
Hasta ahora nadie puede entender cuáles son los que están resaltados en rojo. Necesitamos criterios precisos para encontrar estos pedidos. Por eso, intenta explicar, como dicen en los dedos, con imágenes y demás

Sí, ya he dado una condición de funcionamiento al 100% y la he adjuntado como código listo. También hay que tener en cuenta que el código utiliza un método que no se ve afectado por los reinicios del terminal, y no se perderá nada cuando se encienda el terminal y seguirá funcionando. Pero aquí inventan una rueda que sólo funcionará en el probador.

Sergey, ten en cuenta también que en el código original de TS cuando cierras una serie de 5 posiciones, la orden en medio del cierre también se borra, esto a su vez no llevará a nada bueno en el trading real. En general, todo está claro para todos, excepto para la ST.

 
Creo que entiendo lo que Natalia quiere conseguir
//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+
....
 

Corregida la segunda versión de la función

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:

Corregida la segunda versión de la función

Gracias por su ayuda.
La variante 1 no funciona correctamente
La variante 2 funciona correctamente.
Mi variante también funciona correctamente, pero si las órdenes se trasladan a otro día o más, el valor no es claro Beneficio 190, mientras que debería ser 4,27.

Ver la captura de pantalla #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);
   }
 
Resulta que el problema no es el número de pedidos, sino el traslado de los mismos a otro día o más.
 
Natashe4ka:
Resulta que el problema no es el número de pedidos, sino el traslado de los mismos a otro día o más.
¿Cierras en serie o qué? ¿Cuál es la transferencia si se cierran todos los pedidos en un ciclo?
 
Vitalie Postolache:
¿Cierras en una serie o qué? ¿Cuál es la prórroga si se cierran todos los pedidos en un ciclo?

Las órdenes se cierran por series, pero si no hay condiciones para el cierre, las órdenes se recogen durante un día o dos, etc.
Aunque el número de pedidos también afecta al valor de los beneficios.
Si hay más de 3 pedidos, el valor se calcula sólo para el último pedido cerrado.

Razón de la queja: