[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 203

 
Hola, ¿podríais darme un comando (si lo hay) para seleccionar aleatoriamente un número ya sea 0 o 1, gracias de antemano?
 
hoz:


Bueno, para empezar, acostúmbrate a poner los soportes donde los necesites. Así:

De hecho, debería tener un rango de tiempo, no un valor fijo. Su lógica no es correcta en absoluto. ¡¡¡No 1 hora O 3 horas, sino de 1 hora a 3 horas!!!
Gracias. Lo entendí mal.
 
stater:
Hola, ¿podríais darme un comando (si lo hay) para seleccionar aleatoriamente un número ya sea 0 o 1, gracias de antemano?
int x =MathRand() % 2;
 

Durante las pruebas del Asesor Experto he encontrado errores de ejecución de código:
- La ejecución del bucle for(i=0;i<OrdersTotal();i++) se interrumpe con el siguiente tick (abajo en Negrita),
- Las órdenes de compra se seleccionan y cierran en cualquier orden.

¿Pueden decirme, por favor, cómo encontrar la causa y solucionarlo?
Aquí está el código del programa y el informe del registro del probador.

Código del programa.

//+------------------------------------------------------------------+
//|Poligon1.mq4 |
//| Copyright 2012, MetaQuotes Software Corp.
//| Prueba del operador de bucle.|
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#enlace de la propiedad ""
//+------------------------------------------------------------------+
//Variables declaradas|
//+------------------------------------------------------------------+
int Mn=357;//Número mágico
int i;//Índice del contador de iteraciones
doble PriTP;/Serie TP
int Tick;/Contador de ticks
//+------------------------------------------------------------------+
//| función de inicialización de expertos|
//+------------------------------------------------------------------+
int init()
{
//----Ordenes de ajuste
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,Bid-350*Point,Ask+350*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1,Ask,0,Bid-250*Point,Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-150*Point,0,Bid-400*Point,
Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_SELLSTOP,3,Ask-300*Point,0,Bid+150*Point,
Ask-750*Point,NULL,Mn,0,CLR_NONE);//
//----
PriTP=Bid;//PriTP
Print("Kc0:",OrdersTotal=",OrdersTotal());//
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto|
//+------------------------------------------------------------------+
int inicio()
{
//----Contador de tics
Tick++;//Tick
//----Cerrar órdenes de COMPRA
for(i=0;i<OrdersTotal();i++)//inicializar el bucle
{
Print("Kc1:"," Tick=",Tick," i=",i);//Mensaje
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Seleccionar orden i
{
if(OrderSymbol()==Symbol())//Symbol
{
if(OrderMagicNumber()==Mn)//Número de identificación
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//El tipo de transacción de la orden actualmente seleccionada
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);/Cierre de la posición
}/Cerrado if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}// Cerrado if(OrderMagicNumber()==Mn)
}// Cerrado if(OrderSymbol()==Symbol()
}// Cerrado if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}// Cerrado for(i=0;i<OrdersTotal();i++)
//----
return(0);
}

Anotaciones en el cuaderno de bitácora del probador.

2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=5 i=1
2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=5 i=0
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=4 i=1
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=4 i=0
2013.03.01 12:12:03 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=3 i=1
2013.03.01 12:12:03 2012.09.03 00:00 Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at 1.25770
2013.03.01 12:12:09 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=3 i=0
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=2 i=2
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=2 i=1
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 at price 1.25768
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=2 i=0
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=3
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: cerrar #5 comprar 3.50 EURUSD a 1.25773 sl: 1.25616 tp: 1.25923 a 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=2
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: cerrar #3 comprar 1.50 EURUSD a 1.25773 sl: 1.25616 tp: 1.25923 a 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=1
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: close #1 comprar 0.50 EURUSD a 1.25773 sl: 1.25416 tp: 1.26123 a 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=0
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc0: OrdersTotal=7
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.25473 sl: 1.25916 tp: 1.25023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.25623 sl: 1.25366 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.25773 sl: 1.25416 tp: 1.26123 ok
2013.03.01 12:11:21 PM Prueba de Poligon1 iniciada
2013.03.01 12:11:21 18 18:30 Poligon1 EURUSD, M15: cargado con éxito

Saludos. Shurkin

 
Shurkin:

Al probar el Asesor Experto, hemos detectado algunos errores en el código:
- La ejecución del operador de bucle for(i=0;i<OrdersTotal();i++) se interrumpe con el siguiente tick (mostrado en negrita a continuación),
- Las órdenes de compra se seleccionan y cierran en orden aleatorio.

Saludos. Shurkin


1. No se pueden abrir órdenes en la función init() (en el Probador de Estrategias, pero no funcionará en la demo)

2. Cuando cierres las órdenes, cuenta desde el final hasta el principio, y no al revés, como has hecho.

 
Shurkin:

Al probar el Asesor Experto, se detectaron errores de ejecución de código:
- la ejecución de la sentencia de bucle for(i=0;i<OrdersTotal();i++) se interrumpe con el siguiente tick (resaltado en negrita a continuación),
- las órdenes de compra se seleccionan y cierran en orden aleatorio.

¿Pueden decirme, por favor, cómo encontrar la causa y solucionarlo?
Aquí está el código del programa y el informe del diario del probador.

El código del programa.

//+------------------------------------------------------------------+
//|Poligon1.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| Prueba de operador de bucle.|
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#enlace de propiedad ""
//+------------------------------------------------------------------+
//|Variables declaradas|
//+------------------------------------------------------------------+
int Mn=357;//Número mágico
int i;//Contador de iteraciones
double PriTP;/Serie TP
int Tick;/Contador de ticks
//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{
//----Set orders
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,Bid-350*Point,Ask+350*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1,Ask,0,Bid-250*Point,Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-150*Point,0,Bid-400*Point,Point,
Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_SELLSTOP,3,Ask-300*Point,0,Bid+150*Point,Point,
Ask-750*Point,NULL,Mn,0,CLR_NONE);//
//----
PriTP=Bid;//PriTP
Print("Kc0:"," OrdersTotal=",OrdersTotal());//PriTP
//----
return(0);
}
//+------------------------------------------------------------------+
//| función experta de desinicialización|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int start()
{
//----Contador Tick
Tick++;//Tick
//----Close BUY Orders
for(i=0;i<OrdersTotal();i++)//inicializar bucle
{
Print("Kc1:"," Tick=",Tick," i=",i);//Enviar mensaje
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Seleccionar orden i
{
if(OrderSymbol()==Symbol())//Symbol
{
if(OrderMagicNumber()==Mn)//Número de identificación
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//El tipo de operación de la orden actualmente seleccionada
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);/Cierre de la posición
}/Cerrado if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}/Cerrado if(OrderMagicNumber()==Mn)
}// Cerrado if(OrderSymbol()==Symbol()
}// Cerrado if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}// Cerrado for(i=0;i<OrdersTotal();i++)
//----
return(0);
}

Entradas de registro de los probadores.

2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=5 i=1
2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=5 i=0
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=4 i=1
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=4 i=0
2013.03.01 12:12:09 2012.03 03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=3 i=1
2013.03.01 12:12:09 2012.09.03 00:00 Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25770
2013.03.01 12:12:09 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=3 i=0
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=2 i=2
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=2 i=1
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD a 1.25773 sl: 1.25516 tp: 1.26023 al precio 1.25768
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=2 i=0
2013.03.01 12:11:21 2012.09.03 03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=3
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=2
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 al precio 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=1
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: close #1 comprar 0.50 EURUSD a 1.25773 sl: 1.25416 tp: 1.26123 a 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc1: Tick=1 i=0
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: Kc0: OrdersTotal=7
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.25473 sl: 1.25916 tp: 1.25023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.25623 sl: 1.25366 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD a 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD a 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00:00 Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.25773 sl: 1.25416 tp: 1.26123 ok
2013.03.01 12:11:21 Poligon1 test started
2013.03.01 12:11:21 Poligon1 EURUSD,M15: loaded successfully

Saludos. Shurkin

No he visto todo tu lío (tienes que usar el botón SRC encima del campo de entrada para adjuntarlo) - no es agradable rascar todo el código sobre la página, pero lo primero que me llamó la atención fue una línea for(i=0; i<OrdersTotal() ; i++) . Para cerrarlo, utilice el bucle inverso: for(i=OrdersTotal()-1; i>=0; i -- )
 
Roger:
int x =MathRand() % 2;


¿Por qué iba a devolver 0 o 1 en lugar de otro número? Según la ayuda,MathRand() devuelve un entero pseudoaleatorio entre 0 y 32767
 
hoz:

¿Y por qué devolvería 0 o 1 en lugar de otro número? Después de todo, segúnMathRand() devuelve un entero pseudoaleatorio en el rango de 0 a 32767.

¡Este es el resto de la división! ¡Mira en los pasos de aritmética y en tu impresora!

Póngalo y sólo verá dos resultados alternados:

  int x =MathRand() % 2;
  Print("x =",x);
 
¡Saludos a todos! Quiero saber cómo detener el Asesor Experto, cuando se cumplen las condiciones para entrar en el mercado, comienza a escribir en el archivo de registro "¡Orden activada!" y lo hace varias docenas de veces por minuto, como resultado el archivo de registro se vuelve cósmicamente enorme. Cómo puedo hacer que escriba sólo una vez, y no antes de que se cierre la posición, porque puede colgarse durante unas horas...
 
Allis:
¡Saludos a todos! Quiero saber cómo detener el Asesor Experto, cuando se dan las condiciones para entrar en el mercado, empieza a escribir en el archivo de registro "¡Orden activada!" y lo hace unas cuantas docenas de veces por minuto, como resultado el archivo de registro se vuelve cósmicamente enorme. Cómo hago para que escriba sólo una vez, y no antes de cerrar la posición, porque puede colgarse durante unas horas...
¡Hola, Allis! La impresión debe ser prescrito, donde no hay lectura por las garrapatas! Puse en la impresión, si hay un error, y si se abrió, y así se escribirá en la revista que se abrió, y sólo una vez!
Razón de la queja: