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

 
Renat Akhtyamov:

No, esta línea se elimina. Esto es un cálculo de beneficios, no funcionará así.

¿Dónde está el comando de cierre en el código - hay

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

y en la condición de cierre

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

El 1 no cuenta, el 2 cuenta correctamente, el 3 no cuenta 0.

 
Natashe4ka:
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

y en la condición de cierre

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 no cuenta, 2 cuenta correctamente, 3 no cuenta 0

y eso es todo.

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

Y una cosa más.

¿Sus pedidos están cerrados según el ticket?

Así que hay que recordar la hora de inicio para cerrar la serie antes

Es decir, cuando se acaba de tomar la decisión de cerrar una serie, no importa si realmente se va a cerrar o no

 
Natashe4ka:
//+----------------------------------------------------------------------------+

Entiendo tu insistencia, pero te he dado una versión que funciona, con una buena función de cierre de una serie de posiciones para el comercio real, no funciona en el probador.

Cuenta y recuerda todo, incluso si se reinicia el terminal.

Aquí hay una prueba, sólo ejecútela en el probador, y compare los resultados con el historial de operaciones

PS. Me olvidé de escribir el código - aquí está la solución

Archivos adjuntos:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

Entiendo tu insistencia, pero te he dado una versión que funciona, con una buena función de cierre de una serie de posiciones para el comercio real, no funciona en el probador.

Cuenta y recuerda todo, incluso si se reinicia el terminal.

Aquí hay una prueba, sólo ejecútela en el probador, y compare los resultados con el historial de operaciones

¿Cómo puedo aplicar esto a mi código?

El valor deLastProfitCL determina miacción posterior

 
Renat Akhtyamov:

pero por lo demás

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

Una cosa más.

¿Sus pedidos se cierran con un billete?

Así que hay que recordar el momento del cierre de la serie incluso antes

Es decir, cuando se acaba de formar la decisión de cerrar una serie, no importa si habrá un cierre real o no

Si la orden es cerrada por el stop, entonces{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} ya se perderá el valor del beneficio
 
Natashe4ka:

¿Cómo puedo aplicar esto a mi código?

Tengo el valor deLastProfitCL quedetermina la acción posterior

Así que está claro, sólo hay que aplicarlo como se necesita en esta forma

  double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit")));
  
  Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );

Declare"LastProfit" una vez y utilícelo donde sea necesario

 
Natashe4ka:
Si la orden se cierra por un stop, entonces{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} ya se perderá el valor del beneficio

Sí, lo hará.

Puede comprobar en cada momento cuántos pedidos vivos quedan.

Si es el mismo, entonces debe recordar la hora del tic anterior.

Entonces obtendrá lo que necesita.

Pero las paradas no suelen producirse en los autómatas

 
Natashe4ka:
Si se cierra en un stop,{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} ya se perderá el valor del beneficio

Sólo contará los cerrados en último lugar en el tiempo, y no depende del importe de cierre.

En general, la tarea no está del todo clara, así que no hay más discusión.

//---------------------------------------------------------

Aquí ves la descripción, ya no entiendo el problema:

Archivos adjuntos:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

Aquí está todo dispuesto, ya no entiendo la tarea:

Bien, gracias.
 

Esto también es correcto si "cnt" se pone a cero, pero entonces el valor es de nuevo incomprensible como en la captura de pantalla 3 (debería ser un valor de beneficio de 4,27)

double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  int cnt=0;
  double LastProfit=0;
   for(i=0;i<OrdersHistoryTotal();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 ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
       }
  return(LastProfit);
   }

Razón de la queja: