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

 
Vitalie Postolache:
Los ciclos deben contarse en orden inverso, desdeOrdersTotal()-1 hasta 0.
Al cerrar en un bucle.
 
Vitalie Postolache:
Los bucles deben contar hacia atrás, desdeOrdersTotal()-1 hasta 0.
Estas son las funciones de Kim y funcionan sin fallar, el problema es otro
 
Así que accidentalmente encendiste varios asesores en el mismo símbolo, mucha gente lo ha hecho.
 
Neron_76:
Hola! He instalado mi robot de Forex en mi cuenta de demostración y ha estado funcionando durante el segundo mes. Hoy abro el terminal y tengo dos órdenes abiertas por una señal, aunque antes sólo he puesto una orden. Tengo una restricción en el número de pedidos. ¿Cuál puede ser la razón?

A juzgar por el código, parece que tienes una orden pendiente en lugar de una orden de mercado.

La restricción del número de órdenes abiertas sólo se aplica a las órdenes de mercado.

Por eso no hay ningún error y, por tanto, ningún problema.

 
Renat Akhtyamov:

A juzgar por el código, parece que tienes una orden pendiente en lugar de una orden de mercado.

El límite del número de órdenes abiertas sólo se aplica a las órdenes de mercado.

Por lo tanto, no hay ningún error y, por lo tanto, no hay ningún problema.

Esta limitación se aplica a las órdenes abiertas y pendientes. Este es el segundo caso que me encuentro en mes y medio; todos los demás casos son correctos.
 
Neron_76:
La restricción se aplica a las órdenes abiertas y pendientes. Es la segunda vez en un mes y medio, todos los demás casos están como deben estar.

Inténtalo de esta manera:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
 
Vitaly Muzichenko:

Inténtalo de esta manera:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
He sustituido las funciones, funciona bien en la prueba. Vamos a ver cómo será en el comercio en la demo. Pero por alguna razón, me parece que en mi caso, tanto estas como estas funciones realizan la misma tarea, es decir, responder a la pregunta de si hay órdenes y posiciones.
 
Neron_76:
Las funciones han sido reemplazadas, va bien en la prueba. Vamos a ver cómo será en el comercio en la demo. Pero por alguna razón me parece que en mi caso ambas funciones realizan la misma tarea, es decir, responden a la pregunta de si hay órdenes y posiciones.
Si repito la doble fijación de la orden, entonces habría que reconsiderar la función"SetOrder", tal vez da dos peticiones, después de la primera petición no hay salida de la función, y tiene tiempo para enviar la segunda.
 
Vitaly Muzichenko:
Si se repite la fijación doble de la orden, entonces hay que revisar la función"SetOrder", tal vez da dos peticiones, después de la primera petición no hay salida de la función, y logra enviar la segunda.
Si este es el caso, ¿por qué no ocurre siempre, algo pasa entre los ticks? No soy muy bueno en esto.
 
Neron_76:
Si es así, ¿por qué no ocurre siempre, algo entre tics? No soy muy bueno en esto.
Entre los ticks de un símbolo puede haber ticks de otro símbolo. Si el EA es multidivisa, ve los ticks de otro símbolo. Además, los eventos del temporizador - los eventos OnTimer() y OnChartEvent() pueden ocurrir entre ticks - casi escribí "eventos de eventos"... sería un montaje...