[¡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 60

 
7777877: ¿transferencia de parámetros por referencia?

aquí está la transferencia de parámetros por referencia, hacer un script como este:

int start(){
   int res = 999;
   Print("func = ",func(res)," , res = ",res);
return(0);
}
//__________________________
int func(int &a){
   a = 10;
   return(a*10);
}

la pestaña Experto mostrará el siguiente registro: 2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10

y tratar de responder a la pregunta de por qué asignamos res = 999; y el registro obtuvo res = 10

 

¿Puede decirme cómo conectar las bibliotecas? Están presentes en los archivos mqh, pero al copiarlos dan

'strlib.mqh' - no se puede abrir el archivo de programa

 
IgorM:

aquí está la transferencia de parámetros desde el enlace, hacer una secuencia de comandos como este:

la pestaña Experto mostrará la siguiente entrada: 2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10

Y tratar de responder a la pregunta de por qué hemos asignado res = 999; pero en el registro obtuvo res = 10


Esta es mi explicación:

La función Print llama a la función de usuario func. El parámetro res=999 se pasa a la función func. Cuando se evalúa la propia función func, se utiliza el parámetro a=10. El valor a*10=100 se pasa al lugar donde se llama a la función func. Dado que terminamos con res=10, deduzco de esto que pasar un parámetro por referencia significa lo siguiente: puedes pasar CUALQUIER valor del tipo correspondiente (en este caso, res=999) a la función llamada (en este caso, a func), pero la propia función se evaluará ya con ese valor (es decir(es decir, en nuestro caso con a=10), que se inicializará dentro de la propia función (que en un caso particular también puede coincidir con el valor pasado a la función llamada, es decir, en este caso, a func). Y al transferir el valor calculado en la función (en este caso, a func) de vuelta a la cadena de llamada a la función, la variable (en este caso, res) ya tendrá un valor diferente al anterior, es decir, el valor que recibió cuando se calculó la función func (es decir, en este caso, res=10). Entonces: al pasar un parámetro a una función por referencia, dentro de una función evaluada, el valor del parámetro puede cambiar, y además, después de que el valor calculado sea devuelto en la cadena de llamada a la función, este parámetro tendrá un valor CAMBIADO (en un caso particular, el mismo), que recibió durante el cálculo de la función llamada.

¿He acertado?

 
7777877: Cuando se pasa un parámetro a una función por referencia, el valor del parámetro puede cambiar dentro de la función evaluada
sí lo hace
 
IgorM:
Así es.

¡¡¡Grosse danke schoen!!!
 

Por favor, díganme, quiero hacer una modificación de la orden, para que el EA cambie el valor del stop-loss en el momento que yo indique, pero empieza a hacer trampa.

aquí está mi código

extern int tp = 350; // valor de beneficio takeprofit
extern int sl = 400; // valor de pérdida stoploss

int ticket;

int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // la orden se abre a las 2:00 hora de la terminal
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red);

//----

if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // aquí establezco una condición para que la orden con el ticket seleccionado se modifique a las 3h00 de la terminal. tiempo.

{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // aquí he especificado la selección de la orden, trade
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // modificar la orden con la entrada seleccionada, desde el precio de la posición abierta, cambiar el valor del SL en puntos, el TP se deja sin cambios


}
//--

}


Hay un problema durante las pruebas: el Asesor Experto empieza a hacer muchas modificaciones inútiles en el tiempo, desde las 3 horas 00 minutos hasta las 3 horas 59 minutos. ¡EA está haciendo el tonto y haciendo modificaciones a cada segundo! ¿Por qué? ¿Qué tiene de malo el código?

 
oleg_felix:

Por favor, díganme, quiero hacer una modificación de la orden, para que el EA cambie el valor del stop loss a la hora que yo le indique, pero empieza a hacer el tonto.

aquí está mi código

extern int tp = 350; // valor de la ganancia
extern int sl = 400; // valor de stop loss

int ticket;

int inicio()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // la orden se abre a las 2:00 hora de la terminal
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red);

//----

if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // aquí he especificado una condición para que la orden con el ticket seleccionado se modifique a las 15 horas según la hora del terminal.

{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // aquí he especificado la selección de la orden, trade
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // modificar la orden con el ticket seleccionado, desde el precio de la posición abierta, cambiar el valor del SL en puntos, dejar el TP sin cambios


}
//--

}


Al hacer la prueba, surge un problema: el Asesor Experto empieza a hacer un montón de modificaciones inútiles dentro del tiempo, desde las 3 00 minutos hasta las 3 59. El Asesor Experto está jugando y haciendo modificaciones cada segundo. ¿Por qué? ¿Qué tiene de malo el código?



¡¡Por qué en el tiempo..... en el beneficio!!

 

Cómo escribir la función correcta para modificar una orden abierta en una cuenta ECN, en la que no se puede colocar el stop y el beneficio a la vez, sino que hay que hacerlo mediante una modificación.

El problema es que algo está mal, por favor ayúdenme a encontrar el error.

extern int tp = 350; // valor de beneficio takeprofit
extern int sl = 400; // valor de pérdida stoploss

int ticket;
int start()
{
//----
if (OrdersTotal()==0 && Close[1]<Open[1] && High[1]<Bid) )==0) // la orden se abre en condiciones
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0t,",123,0,Red);
//----
if (OrdersTotal()==1 ) // aquí he puesto una condición que modifica una orden con una sola orden seleccionada.
{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // aquí he especificado la selección de la orden, las transacciones
OrderModify(ticket, OrderOpenPrice(), Ask+sl*Point,Ask-tp*Point,0,Blue); // modificar la orden con la entrada seleccionada, desde el precio de la posición abierta, cambiar el valor de SL en puntos, dejar TP sin cambios
}
}

 
oDin48:
  • Chicos, ¿cómo conecto las bibliotecas? Cuando intento compilar el EA me da

  • 'strlib.mqh' - no se puede abrir el archivo de programa

A encontrar la línea:
#include <strlib.mgh>

y reemplazarlo por:

#include <stdlib.mgh>
 
7777877:

Por favor, expliquen de forma sencilla qué es la transferencia de parámetros por referencia. He leído la documentación, pero sólo he entendido que es posible y que después de la identificación de la variable es obligatorio poner un modificador &. Sería estupendo que la explicación fuera acompañada de un pequeño programa con explicaciones... ¿Cuál es la diferencia entre el paso de parámetros habitual y el paso de parámetros por referencia?

El sentido general de pasar parámetros por referencia no es pasar una variable en sí, sino su dirección. En el caso contrario, se pasa una copia de la variable al parámetro.
Razón de la queja: