¿Cómo codificar? - página 302

 

...

Sí se puede

La única limitación es que no te encuentres con "llamadas circulares" cuando terminaría con un bucle muerto. Aparte de eso, no hay ninguna limitación para las llamadas a funciones

crsnape@btinternet.com:
Buen punto. Il tener una mirada en eso.

Una pregunta sobre las funciones, ¿es posible llamar a una función dentro de otra función? Por ejemplo, tengo esta función

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

si (... etc

Luego lo llamo:

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)
 

He introducido este código para recuperar el último pedido abierto:

//--- Función para calcular el número de ticket del último pedido abierto

int ÚltimoPedidoAbierto()

{

datetime lastTime = 0;

int ultimoTicket = -1; // Ninguno abierto.

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Sólo mis pedidos w/

&& OrderMagicNumber() == MagicNumber // mi número mágico

&& OrderSymbol() == Symbol() // y mi par.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

return (lastTicket);

}

Es una función que se llama desde mi función GetLots - el compilador es libre de errores, pero cuando backtest la sección de resultados es completamente claro. No hay operaciones. ¿Esto se debe a que la primera operación no tiene ninguna operación anterior a la que llamar en el código anterior?

En el diario llega a cargar las variables externas (de las cuales carga el número mágico 42, pero en mi código es 42552...) pero luego nada.

 

...

Cuál es la declaración de su número mágico ( debería ser int MagicNumber; )

crsnape@btinternet.com:
He introducido este código para recuperar la última orden abierta:

//--- Función para calcular el número de ticket del último pedido abierto

int UltimoTicketAbierto()

{

datetime lastTime = 0;

int ultimoTicket = -1; // Ninguno abierto.

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Sólo mis pedidos w/

&& OrderMagicNumber() == MagicNumber // mi número mágico

&& OrderSymbol() == Symbol() // y mi par.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

return (lastTicket);

}

Es una función que se llama desde mi función GetLots - el compilador es libre de errores, pero cuando backtest la sección de resultados es completamente claro. No hay operaciones. ¿Esto se debe a que la primera operación no tiene ninguna operación anterior a la que llamar en el código anterior?

En el diario llega a cargar las variables externas (de las cuales carga el número mágico 42, pero en mi código es 42552...) pero luego nada.
 

Sí, es int MagicNumber = 42557

 

...

Entonces no puedo decir desde el código que ha publicado por qué está haciendo mal (por qué está recibiendo MagicNumber mal, por ejemplo). El código debería funcionar si hay alguna orden abierta con el MagicNumber especificado (va a hacer un bucle a través de las órdenes abiertas) Si no hay órdenes abiertas o los MagicNumbers y los símbolos no coinciden, devolverá -1 (como se espera que lo haga) por lo que el código es correcto (lo he probado ahora, y funciona como debería)

Lo siento, pero eso es todo lo que puedo hacer desde el código que has publicado

crsnape@btinternet.com:
Sí, es int MagicNumber = 42557
 

¿Qué ocurriría en el caso de que no se hubiera abierto ningún pedido anterior y éste fuera el primero? Sé que devuelve -1 pero el código EA fallaría al ejecutarse porque mi función GetLots se basa en llamar al último número de ticket de pedido abierto.

 

Si depende de la existencia de al menos una orden abierta previamente, entonces fallará

Añada algo como esto en su condición:

if (LastOpenOrder()==-1)

... entonces puede abrir la orden si se cumplen el resto de condiciones

si no

... comprueba la última orden abierta como antes más el resto de las condiciones

(sólo estoy adivinando cómo escribiste las condiciones de tu EA)

crsnape@btinternet.com:
¿Qué pasaría en el caso de que no se hubiera abierto ninguna orden anterior y ésta fuera la primera? Sé que devuelve -1 pero el código EA fallaría al ejecutarse porque mi función GetLots se basa en llamar al número de ticket de la última orden abierta.
 

Hola Mladen,

¿Sabes cómo establecer el comercio abierto cuando la línea estocástica cruza en el nivel 20 o 80?

Por ejemplo

Cuando el estocástico se cruza en el nivel 20 (sobreventa), Largo

Cuando el estocástico se cruza en el nivel 80 (sobreventa), Short

Saludos

Ryan

 

He añadido algunas líneas a este código - esto es lo que utiliza la función LastOpenTicket() pero todavía no le gusta. He añadido la opción -1. ¿Te parece que algo está mal aquí?

//--- Determina si la orden de venta anterior es rentable

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() > 0 && OrderType() = OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}

 

...

¿Por qué no añadir un resultado más posible de esa función: soomething como cuando LastOpenTicket() == -1 entonces WinLossPreviousShort="Na"

crsnape@btinternet.com:
He añadido algunas líneas a este código - esto es lo que utiliza la función LastOpenTicket() pero todavía no le gusta. He añadido la opción -1. ¿Te parece que algo está mal aquí?

//--- Determina si la orden de venta anterior es rentable

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() > 0 && OrderType() = OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}
Razón de la queja: