Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 287

 
Por la tarde. Ayuda con esta función por favor, suma la pérdida de órdenes cerradas, cuando se utiliza con la función de cierre de órdenes metatrader se bloquea, creo que hay algún tipo de error en esta función.
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal();
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("¡Error en el historial!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
Si(OrderProfit()<0)i++;
}
If(i<0)
summa=OrderProfit()+summa;
}
If(OrderProfit()>summa)
summa=OrderProfit()+summa;
return(summa);
}
 
Lowech:
Hola. Por favor, ayúdenme con esta función, resume las pérdidas de las órdenes cerradas, metatrader se bloquea cuando se utiliza con la función de órdenes cerradas, creo que hay algún tipo de error en esta función.

Es mejor mirar los ya hechos y ajustarlos si es necesario. GetProfitFromDateInCurrency()

 
Lowech:
Por la tarde. Ayuda con la función por favor, resume la pérdida de órdenes cerradas, cuando se utiliza con la función de cierre de órdenes metatrader se bloquea, creo que hay algún tipo de error en esta función.

¿Qué quiere decir que Metatrader se bloquea? ¡¡¡El programa compila con errores!!!

En tres lugares en lugar de si con minúscula dice Si con mayúscula

un par de corchetes es claramente innecesario: el primero después de int orders=OrdersHistoryTotal(); y su par después de summa=OrderProfit()+summa; - pero esto no tiene importancia

también hay...

 
Lowech:
Por la tarde. Ayuda con esta función por favor, resume la pérdida de órdenes cerradas, cuando se utiliza con la función de cierre de órdenes Metatrader se bloquea, creo que hay algún tipo de error en esta función.

Prueba esto:

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
He llegado 2 minutos tarde a escribir... Consideremos esta parte con cuidado:
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

Compilado con la directiva #property strict - es la última línea: 'i' - identificador no declarado. La cuestión es que la variable se declara en un bucle y sólo es válida en el bucle. Sin la directiva #property strict compila sin errores, pero esto es malo. La directiva debe ser utilizada.

Es más fácil escribir if( OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) en lugar de if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). Ahora el siguiente paso es un break - es la salida del bucle. Pero tenemos que procesar los otros pedidos. Sin embargo, en la historia, esto no es necesario. El error se produce en las órdenes de mercado y pendientes, si en el momento de procesar la orden, ésta se ha cerrado y falta. La regla general es if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) continuar; - continuar procesando los siguientes pedidos

Por la misma razón, sustituya if(OrderProfit()>0) break; por if(OrderProfit()>0) continue;

Y aquí está la razón del error: if(OrderProfit()<0)i++; - if(OrderProfit()>0; - el índice se incrementa. Y la cabecera del bucle for(int i=órdenes-1;i>=0;i--) lo disminuye. El procesamiento de la misma orden se repite y el programa entra en un bucle. Probablemente, así es como debería ser:

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
2 minutos de retraso al escribir... Consideremos esta parte con cuidado:

Compilado con la directiva #property strict - es la última línea: 'i' - identificador no declarado. La cuestión es que la variable se declara en un bucle y sólo es válida en el bucle. Sin la directiva #property strict compila sin errores, pero esto es malo. La directiva debe ser utilizada.

Es más fácil escribir if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) en lugar de if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). Ahora el siguiente paso es un break - es la salida del bucle. Pero tenemos que procesar los otros pedidos. Sin embargo, en la historia, esto no es necesario. El error se produce en las órdenes de mercado y pendientes, si en el momento de procesarlas, la orden se ha cerrado y falta. La regla general es if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) continuar; - continuar procesando los siguientes pedidos

Por la misma razón if(OrderProfit()>0) break; sustituir por if(OrderProfit()>0) continue;

Y aquí está la razón del error: if(OrderProfit()<0)i++; - if(OrderProfit()>0; el índice se incrementa. Y la cabecera del bucle for(int i=órdenes-1;i>=0;i--) lo disminuye. El procesamiento de la misma orden se repite y el programa entra en un bucle. Probablemente, así es como debería ser:


Gracias, se acabaron las caídas de metatrader) Respecto a

if(OrderProfit()>0) break; sustituir por if(OrderProfit()>0) continue;

Quiero que esta función no tenga en cuenta este beneficio cuando una orden se cierre con beneficios. Sólo quiero que incluya el importe de la pérdida antes de que la primera orden se cierre con beneficios. Es decir

if(OrderProfit()>0) break;


¿Debería parar el contador si la orden se ha cerrado en beneficio, lo veo correctamente?
 
Lowech:

Gracias, se acabaron las caídas de metatrader) Lo que necesito es que si una orden cierra en beneficio, la función no tenga en cuenta este beneficio, sólo el importe de la pérdida y hasta la primera orden cerrada en beneficio. Es decir
¿Debería parar el contador si la orden se ha cerrado en beneficio, lo veo correctamente?
Su razonamiento es casi correcto. No se garantiza la colocación de ningún pedido en el historial. Para ti puedes, pero para vender - mal.
 
STARIJ:
Su razonamiento es casi correcto. No hay garantía de ningún arreglo de orden en la historia. Para ti - sí, pero para vender - mal.
¿El bucle basado en el orden no calcula los pedidos en orden?
 
STARIJ:

Si hay una fuente - DROW_NONE - no hay dibujo

No ayudó, todavía muestra los números en la esquina

 
Lowech¿El bucle de pedidos no cuenta los pedidos en orden?

Por orden de la lista. Pero no hay garantía de ningún orden en esta lista

Razón de la queja: