¿Cómo codificar? - página 303

 

otra pregunta de principiante

Hola, soy nuevo en la programación pero no en el trading. Llevo un tiempo sin publicar nada y ahora, desde que empecé a desarrollar mi EA, tengo muchas preguntas. Empecé con la construcción de un indicador primero, y una vez que hace lo que quiero voy a ir más allá. He leído todos los manuales que he podido encontrar, así que ahora es el momento de avanzar con la codificación.

Lo siento, si es un hilo incorrecto - por favor, hágame saber donde debo publicar tales preguntas entonces.

Tengo 2, probablemente, preguntas básicas por ahora, por favor:

1. En muchos indicadores que utilizan MAs veo líneas que comprueban cuántas barras hay en el gráfico. Entonces, si necesito MA200 y el gráfico sólo tiene, digamos, 100 barras, ¿funcionaría entonces iMA200? Creo que sí - lo he comprobado y cualquier MA se dibuja sin problemas en cualquier gráfico, por lo que creo que se trata de un antiguo error que Metaquotes ha corregido ahora. Entonces, ¿hay que comprobar cuántas barras hay en el gráfico para dibujar la MA o utilizar la función iMA?

2. ¿Cuál es la diferencia entre Close y iClose? Entiendo que Close puede devolver un cierre de las barras en el gráfico actual solamente, y iClose puede devolver cualquier cierre de cualquier par de divisas y cualquier marco de tiempo. Y en ambos casos, para obtener la última barra cerrada tengo que utilizar el índice [1]. ¿Lo veo bien?

Gracias.

 

Ya lo he hecho. Ver el rojo resaltado abajo:

//--- 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);

}

}

}

Sigue completamente en blanco.

Me estoy rascando la cabeza. Sé que tu ayuda es limitada porque no he pegado el código, pero ¿te parece que el código de arriba está bien?

También con la primera línea de abajo, ¿necesito hacer referencia a LastOpenTicket con () después?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

 

...

Si se llama a esa función con el número de ticket del último ticket abierto como argumento, entonces el código después de la línea azul nunca se ejecutará (el OrderSelect() falla si el número de LastOpenTicket es -1 (que en ese momento equivale al resultado de la función LastOpenTicket()), y el código no llega a ejecutar el bloque después de la línea azul)

crsnape@btinternet.com:
Ya lo he hecho. Ver el rojo resaltado abajo:

//--- 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);

}

}

}

Sigue completamente en blanco.

Me estoy rascando la cabeza. Sé que tu ayuda es limitada porque no he pegado el código, pero ¿te parece que el código de arriba está bien?

También con la primera línea de abajo, ¿necesito hacer referencia a LastOpenTicket con () después?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
 

No estoy seguro de entender.

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

Entonces, como estoy llamando a la función LastOpenTicket() en la línea anterior, el resto de esa función no se ejecuta y el OrderSelect() falla. ¿Estoy entendiendo bien?

 

...

Supongamos lo siguiente :

- no tenía órdenes anteriores

- LastOpenedTicket() devuelve como resultado -1 (ningún pedido anterior)

- se llama a la función con ese resultado

OrderSelect() falla ya que el ticket de la orden -1 no existe y no se ejecuta ningún código detrás de la selección de la orden. Incluso en el caso de que LastOpenTicket sea > -1, la "condición de la línea azul" de que LastOpenTicket() == -1 nunca puede ser verdadera ya que la única forma de llegar a esa parte del código es cuando LastOpenTicket es > -1

Por eso sugerí el "3er estado: el "Na", ya que de hecho tienes 3 estados debido al estado inicial "sin órdenes previas"

crsnape@btinternet.com:
No estoy seguro de entender.

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

Entonces, como estoy llamando a la función LastOpenTicket() en la línea anterior, el resto de esa función no se ejecuta y el OrderSelect() falla. ¿Estoy entendiendo bien?
 

algunas preguntas de codificación, probablemente para principiantes

Hola, soy nuevo en la programación pero no en el trading. Estoy construyendo mi EA pero empecé con la construcción de un indicador primero, y una vez que hace lo que quiero voy a ir más allá. He leído todos los manuales que he podido encontrar y ahora lo estoy codificando.

Apreciaría cualquier consejo - todos ustedes empezaron donde yo estoy ahora...

Tengo 2, probablemente, preguntas básicas por ahora, por favor:

1. En algunos indicadores que utilizan MAs veo líneas que comprueban cuántas barras hay en el gráfico. Entonces, si necesito MA200 y el gráfico sólo tiene, digamos, 100 barras, ¿funcionaría entonces iMA200? Creo que sí - lo he comprobado y cualquier MA se dibuja sin problemas en cualquier gráfico, así que creo que es un problema antiguo que Metaquotes ha solucionado ahora. Entonces, ¿hay que comprobar cuántas barras hay en el gráfico para dibujar la MA o utilizar la función iMA?

2. ¿Cuál es la diferencia entre Close y iClose? Tengo entendido que Close puede devolver un cierre de las barras en el gráfico actual solamente, y iClose puede devolver cualquier cierre de cualquier par de divisas y cualquier marco de tiempo. Y en ambos casos, para obtener la última barra cerrada tengo que utilizar el índice [1]. ¿Es eso correcto?

Gracias.

 

¿Así?

//--- 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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

if (LastOpenTicket() == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

}

O ESTO? cambia en rojo.

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

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, 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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

}

 

Ah, por fin se ha hecho clic, no puedo utilizar OrderSelect en un número de billete que es -1 porque -1 no existe. Los tickets van de 0 en adelante.

Tengo que declarar LastOpenTicket fuera de la función Order Send ¿verdad?

 

...

Prueba así:

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

//

//

// if LastTicket == -1 no need even to try to execute the code bellow

// you already have exited for case when it is -1, so the code bellow

// will be executed properly

//

//

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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}
 

Gracias mladen, ¿el código de abajo equivale básicamente a lo mismo que el tuyo? ¡Escribí esto mientras publicabas lo último! :-)

EDITADO-

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

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, 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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

Razón de la queja: