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

 
Natashe4ka:
Las órdenes se cierran en serie, pero si no hay condiciones de cierre, las órdenes se recogen durante un día o dos, etc.

Si la serie se cierra prácticamente durante un ciclo, digamos, durante la vida de una barra, entonces podemos tomar el criterio de la serie por el tiempo de cierre más una barra. Es decir, todas las órdenes cuya hora de cierre sea inferior a esta deben ser descartadas.

Sin embargo, nos preocupa que esto sólo funcione en el probador; cualquier intervención manual dará lugar a un cálculo incorrecto de los beneficios (sólo se tendrá en cuenta el beneficio del EA, mientras que la operación manual no lo hará).

 
Vitalie Postolache:
Si la serie se cierra prácticamente durante un ciclo, digamos, durante la vida de una barra, entonces podemos tomar el criterio de la serie por el tiempo de cierre más una barra. Es decir, todas las órdenes con una hora de cierre inferior a esa deben ser descartadas.

Es decir

if ((op<0||OrderType()==op) && (t==OrderCloseTime() ||  t==OrderCloseTime()+60)) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}

(t==OrderCloseTime()||t==OrderCloseTime()+60)?

 
Natashe4ka:

Es decir

if ((op<0||OrderType()==op) && t==OrderCloseTime()+60) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}

+60 ?

PeriodSeconds() sería más correcto. ¿O va a trabajar sólo en la M1?

Algo así:

double lastloss()
{
double lastlos=0.0,op=0.0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
         {
            if(cnt==0) time=OrderCloseTime();
            op=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()+PeriodSeconds()<time && op>0.0) break;
            lastlos+=op;
            if(cnt!=0) cnt++;
         }
      }
}
return(lastlos);
}
 
Vitalie Postolache:

Algo así:

Esto añade un nuevo valor al valor anterior. Pero cada nuevo cierre, un nuevo valor del beneficio.
 

Y también se pueden numerar los pedidos en el comentario, para aquellos DC que no sobrescriben el comentario. Y al probarlo el número del comentario, tan pronto como el número no está en orden - la serie ha terminado.

Ejemplo: Serie de pedidos número 1,2,3,4,5. Cerrado en el orden 5,4,3,2,1 - el bucle ve 1 e interrumpe. Cerrando en orden 1,2,3,4,5 y 1 (el número de orden de la serie anterior) - el bucle ve la diferencia 5-1>1 y aborta. Tengo que pensar cómo traducir esto en código ))))

 
Natashe4ka:
Así que se añade un nuevo valor al anterior. Y cada nuevo cierre, un nuevo valor de beneficio.
No sé, no me cuadra.
 
Vitalie Postolache:
No sé, no me cuadra.

Pon la información y verás que suma.

color ProfitColor;

   if(lastloss()<0) ProfitColor=Red;
   if(lastloss()>0) ProfitColor=LimeGreen;
   if(lastloss()==0)ProfitColor=DarkGray;
   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(lastloss(),2)),10,"Arial",ProfitColor);
 
Natashe4ka:

Pon la información y verás lo que se suma inmediatamente.

Hmm, sí, efectivamente... Sigamos pensando ))))
 
Entiendo que esto es una prueba en el probador....
 
Vitalie Postolache:
Hmm, sí, efectivamente... Sigamos pensando ))))

También me pareció que contaba como debía.
No debería haber puesto esta información en el código y la vida habría sido más fácil))

¡¡¡Y ahora es desconcertante cómo la función no funcionó correctamente todo este tiempo!!!