[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 562

 
Ekburg:

¿Puede decirme qué puede estar mal en este código? Es un trailing stop, pero al probarlo da error 1, en la modificación. ¿Por qué no se modifica la orden?

Cuando estaba corrigiendo este error (hasta ahora sin éxito), al compilar el código principal del Asesor Experto en la función de impresión, comenzó a devolver un error, diciendo que necesita comillas, pero todo allí es correcto, y para corregir este error tengo que quitar y poner una nueva coma invertida...

bool trailingstop()
{
if ((OrderMagicNumber()==11111)==true)
{
Print("Mantener posición de compra");
while(OrderCloseTime()==0)
{
si ((Bid-OrderStopLoss())>(StopLevel*Point))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
Print("Stop Loss de la orden con el número ",OrderTicket()," y el número mágico ",OrderMagicNumber()," cambiado con éxito a ",OrderStopLoss());
else Print("El nivel de Stop Loss de la orden con el número ",OrderTicket()," y número mágico ",OrderMagicNumber(),". Error ",GetLastError());
}
}
si (OrderCloseTime()>0)
{
Print("La orden con el número ",OrderTicket()," y el número mágico ",OrderMagicNumber()," cerró al precio ",OrderClosePrice()," con un beneficio/pérdida ",OrderProfit());
return(true);
}
}
si no
{
if ((OrderMagicNumber()==22222)==true)
{
Print((Posición de venta);
while(OrderCloseTime()==0)
{
si ((OrderStopLoss()-Ask)>(StopLevel*Point))
{
if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
Print("Stop Loss de la orden con el número ",OrderTicket()," y el número mágico ",OrderMagicNumber()," cambiado con éxito a ",OrderStopLoss());
else Print("El nivel de Stop Loss de la orden con el número ",OrderTicket()," y número mágico ",OrderMagicNumber(),". Error ",GetLastError());
}
}
si (OrderCloseTime()>0)
{
Print("La orden con el número ",OrderTicket()," y el número mágico ",OrderMagicNumber()," cerró al precio ",OrderClosePrice()," con un beneficio/pérdida ",OrderProfit());
return(true);
}
}
si no, return(false);
}
}


El error 1 no es un error. significa que la orden ya ha sido modificada. inserte la comprobación de los parámetros de modificación antes de OrderModify() (si la orden stoploop no es igual a stoploop , ( ND( Bid-StopLevel*Point)o ND(Ask+StopLevel*Point)), entoncesOrderModify(), en caso contrario retorne).
 
rigonich:

El error 1 no es un error. Significa que la orden ya ha sido modificada. Inserte la comprobación de los parámetros de modificación antes de OrderModify()(si el stop loss de la orden no es igual al stop loss, (ND(Bid-StopLevel*Point) oND(Ask+StopLevel*Point)), entoncesOrderModify(), en caso contrario retorna).


Esta comprobación está por encima: si ((Bid-OrderStopLoss())>(StopLevel*Point)), o me he equivocado

Y lo probé en un movimiento brusco, incluso visualmente, es claramente visible que el stop loss de la orden y la expresión no son iguales

 
Usual_Trader:


A simple vista, lo que veo en la función de cierre de órdenes, necesitas seleccionar la orden por el ticketOrderSelect(Ticket, SELECT_BY_TICKET), el número de lotes no lo indica la variable Lts, porque se recalcula cada vez, sino que usas OrderLots() Y otra cosa, sigues trabajando en la barra 0, respectivamente, los criterios en una barra pueden desaparecer, tus órdenes pueden no abrirse donde te gustaría. Sustituya la barra 0 por la 1 y la 1 por la 2 en los parámetros del indicador



Muchas gracias por la respuesta), pero el criterio no funciona como me gustaría (no todos los cruces de estocásticos muestran órdenes ( ) y me gustaría abrir órdenes en la barra 0, pero supongo que necesito una condición adicional: después de abrir una orden en la barra actual no tengo que hacer nada hasta que la barra se cierre, pero no tengo ni idea de cómo hacerlo (¿puede ser usando arrays de series temporales?) Por favor, aconsejen.
Archivos adjuntos:
 
Ekburg:


Esta comprobación está por encima: si ((Bid-OrderStopLoss())>(StopLevel*Point)), o te he entendido mal.

Lo he comprobado en un movimiento brusco donde se ve claramente que el stop loss de la orden y la expresión no son iguales


El problema es el siguiente: al no tener OrderSelect() en esta función, se debe utilizar en alguna parte del bucle con la búsqueda de pedidos. Si este bucle organiza la búsqueda desde el orden cero hasta el último, entonces después de la modificación del primer orden, o si ya se ha encontrado algún orden, cuando se llame a OrderSelect() la próxima vez, el orden de la orden cambia y la función puede seleccionar un orden que ya ha sido modificado. Por tanto, debemos comprobar si el valor de la orden StopLoss es igual al que enviamos a la función OrderModify()

if(ND(Bid-StopLevel*Point)==OrderStopLoss())return(true);
 

abeiks:

Desde hace algún tiempo he estado intentando rehacer el bloque de cierre de compra para cerrar sólo las dos últimas posiciones de compra, pero falla. ¿Puede decir cómo rehacer el bloque?

//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void Close_2buy()
   {
   bool     result;
   int      Count=2,Ticket=-1,error;
   datetime time=0;
   while(Count>0)
      {
      for (int f=OrdersTotal()-1; f>=0; f--) // 
         {
         OrderSelect(f, SELECT_BY_POS);
         if (OrderSymbol()==Symbol() &&(OrderMagicNumber()==magic ) 
         && (OrderType() == OP_BUY )) 
            {
            if(OrderOpenTime()>time)
               {
               time=OrderOpenTime();Ticket=OrderTicket();
            }
         }
      }
      if(OrderSelect(Ticket,SELECT_BY_TICKET)==True);
         {
         result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),0,CLR_NONE);
         if(result!=TRUE){error=GetLastError();Print("LastError = ", error);}
      }
      else{error=GetLastError();Print("LastError = ", error);} 
      Ticket=-1;time=0;Count--;
   }
   return;
} 
 
ametist444:

¡Hola!

¿Puedes decirme qué archivos hay que descargar y dónde instalarlos en mt4 para conseguir esta ventana?

No entiendo cómo hacerlo en laSimulación en diferentes marcos temporales del instrumento bajo prueba

Quiero ver sólo tres gráficos diarios, de cuatro horas y horarios

Quiero ver tres gráficos diarios, de cuatro horas y de una hora. Por favor, ayúdenme, no he conseguido hacerlo en toda la noche.



Las ventanas como (visual) se abren cuando se prueba el EA en modo visual.


 
peshihod:

¿Qué tipo de StopLoss?

Debo haberme expresado mal :(

Tenemos un algoritmo para abrir órdenes.

Necesito que abra la siguiente orden en otra dirección (cuando aparezcan las condiciones), si la última orden se cerró de alguna manera.

Todo funciona, pero si he cerrado por un stop loss, por ejemplo, para vender, y las condiciones para abrir una venta en esta dirección, la apertura continúa. Lo que necesitamos es esperar a que se den las condiciones para comprar.

Es decir, hay que comprobar la última orden cerrada, para que no coincida con la de apertura (alternancia compra-venta-compra-venta). Sólo está en funcionamiento una orden o espera de señal.

Entiendo que probablemente deberíamos usar OrdersHistoryTotal(), pero ¿cómo se vería en un EA que funcione?

Gracias.

 
delf:

Existe un algoritmo de apertura de órdenes.

Necesitamos cualquier variante de la última orden para abrir la siguiente en una dirección diferente (cuando aparezcan las condiciones).

Es decir, hay que comprobar la última orden cerrada para que no coincida con la de apertura (alternancia compra-venta-compra-venta). Sólo hay una orden o señal esperando a ser abierta.

¿Esta alternancia se produce siempre en cualquier caso, y sólo hay un orden en funcionamiento?

Entonces es más fácil añadir el control sobre el número de pedidos a la condición:

if(OrdersTotal()==0)
{
	if(OldOrder==OrderBuy)
		{
		...
		}
	else
		{
		...
		}
}
 
rigonich:


El problema es el siguiente: al no tener OrderSelect() en esta función, parece que se utiliza en alguna parte del bucle con una búsqueda de pedidos. Si este bucle organiza la búsqueda desde el orden cero hasta el último, entonces después de la modificación del primer orden, o si algún orden ya ha sido enterrado en este tic, cuando se llame de nuevo aOrderSelect(), la secuencia de órdenes de pedido cambia y la función puede seleccionar un orden que ya ha sido modificado. Por tanto, debemos comprobar si el valor de la orden StopLoss es igual al que enviamos a la función OrderModify()


No, el problema de cambiar el número de orden de posición cuando una de ellas está cerrada se ha solucionado, lo he comprobado más de una vez pensando que podría haber un error ahí, pero todo está bien ahí, la orden requerida está seleccionada y el stoploss se calcula correctamente para ella, pero la orden no quiere ser modificada...
 

delf:

La última orden debe cerrarse en cualquier dirección y la siguiente debe abrirse en la otra dirección (cuando se cumplan las condiciones, respectivamente).

Opción más estricta

#define OrderBuy  0
#define OrderSell 1
int NewOrder;
int RezultatSend; 

int start()
{
... 
... 

if(OrdersTotal()==0)
{
if(NewOrder==OrderBuy)
   {
   if(/*Условие для Buy*/)
      { RezultatSend=OrderSend(/*...buy*/);     //Ставим Buy
        if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла
      }
   }
 else
   {
   if(/*Условие для Sell*/)
      { RezultatSend=OrderSend(/*...*/);       //Ставим Sell
        if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла
      }
   }
}

...
...

}  
Razón de la queja: