Re: Vender y comprar si se cumple la condición
Cita:
....Soy un poco nuevo con el tema de programación mql, pero como tengo experiencia en otros lenguajes de programación lo básico de bucles, condiciones, funciones y esas cosas las conozco.....
Hola como según lo que te leo entiendes de programación la regla numero uno de un buen programador es siempre revisar la documentación. Aqui te lo dejo:
Trade Functions - MQL4 Reference
Seguramente así podes avanzar mejor,
Saludo,
Re: Vender y comprar si se cumple la condición
Cita:
Iniciado por
Reload
Gracias nuevamente por tu ayuda y tus consejos.
Si quisiera en un momento, antes de abrir una orden de venta o compra, ¿PUedo verificar si hay alguna abierta primero para cerrarla? Es decir algo como:
Para así no tener que abrir y cerrar operaciones yo manualmente, imagino que tendría esta sintaxis:
¿Ask sería en el caso de un orderclose de venta y bid en un orderclose de compra?
El problema sería verificar si existe ya una operación abierta (O sea, no pendiente, si no que esté ya funcionando) y cerrarla para abrir la nueva para que sólo haya una operación en el par elegido. ¿Quizá con una condición if? Y supongo que en el order_id es el valor de "ticket" , ¿no?
Perdona las molestias y gracias nuevamente.
No te preocupes por las preguntas!
En estos días no debemos salir de nuestros hogares. De manera que tenemos tiempo a favor.
1) Para verificar si previamente tienes una orden ya sea pendiente o disparada, la instrucción es la siguiente:
int OrderType();
Podrá arrojarte seis valores después de tu consulta que son los siguientes: 0, 1, 2, 3, 4, y 5
a continuación su significado:
| OP_BUY |
|
Buy operation |
| OP_SELL |
1 |
Sell operation |
| OP_BUYLIMIT |
2 |
Buy limit pending order |
| OP_SELLLIMIT |
3 |
Sell limit pending order |
| OP_BUYSTOP |
4 |
Buy stop pending order |
| OP_SELLSTOP |
5 |
Sell stop pending order |
nota que las dos primeras corresponden a las órdenes de mercado, es decir, las que ya están disparadas.
Posiblemente necesites colocar dicha instrucción de chequeo dentro de un loop o condición If.
2) La regla es la siguiente:
Si generas una orden de compra OP_BUY... el precio será el Ask
La instrucción OrderClose utilizará el parámetro Bid
Si generas una orden de compra OP_SELL... el precio será Bid
La instrucción OrderClose utilizará el parámetro Ask
3) La variable orden_id está asignada por el programa. Toda orden colocada tiene su propio número que la identifica, es el número largo que ves en la pestaña Trade, (primera columna en la izquierda de órdenes abiertas o pendientes). Mientras que el valor de la variable ticket, previamente creada por ti como usuario, suele ser un número mayor que cero una vez disparada la orden, si mal no recuerdo es un 1. Si el valor es positivo quiere decir que la orden fue disparada correctamente, por el contrario, si no se dispara por error alguno el valor pasa a ser -1.
Saludos de nuevo!
Re: Vender y comprar si se cumple la condición
Cita:
Iniciado por
tonyvaloz
De nada mi estimado amigo...
En relación a tus nuevas dudas te comento lo siguiente:
1) Es correcto, la variante OP_BUY abre una orden de compra al precio actual del mercado, es decir, al más reciente precio Ask recibido desde el servidor. Por lo tanto, no hay que colocar parámetro alguno de precio. Debes dejarlo en blanco dejando la coma correspondiente. Ese será el momento del cierre de tu vela actual.
Si fuese el caso de una OP_BUYLIMIT o OP_BUYSTOP, sí tendrías que colocar tu precio deseado, en el primero por debajo del mercado y en el segundo por encima del mercado.
Ten en cuenta también que toda orden BUY abre la compra por el precio Ask y al momento de su cierre lo hace por el precio Bid. Por supuesto, lo contrario sucede con la orden SELL.
2) La sentencia int ticket=OrderSend(... hace lo siguiente:
- Genera un valor entero en la variable ticket, de hecho, podrá servirte más adelante para comprobar su disparo. Por ejemplo: si ticket > 0 quiere decir que la orden fue disparada.
- Paralelamente, dispara tu orden deseada.
Saludos y éxitos!
Gracias nuevamente por tu ayuda y tus consejos.
Si quisiera en un momento, antes de abrir una orden de venta o compra, ¿PUedo verificar si hay alguna abierta primero para cerrarla? Es decir algo como:
Cita:
Verifico la condición
Cierro cualquier operación abierta en ese par
Ejecuto la compra/venta nueva.
Para así no tener que abrir y cerrar operaciones yo manualmente, imagino que tendría esta sintaxis:
Cita:
OrderClose(order_id,1,Ask,3,Red);
¿Ask sería en el caso de un orderclose de venta y bid en un orderclose de compra?
El problema sería verificar si existe ya una operación abierta (O sea, no pendiente, si no que esté ya funcionando) y cerrarla para abrir la nueva para que sólo haya una operación en el par elegido. ¿Quizá con una condición if? Y supongo que en el order_id es el valor de "ticket" , ¿no?
Perdona las molestias y gracias nuevamente.
Re: Vender y comprar si se cumple la condición
Cita:
Iniciado por
Reload
Tonyvaloz, muchas gracias por responder y tomarte la molestia de darme los tips. Tengo una duda aún, en la siguiente función que expones:
Imagino que el op_buy abre la opción de compra, pero me gustaría saber qué pongo en price para que se abra justo en esa condición. Es decir, qué tengo que poner en el price para que cuando el programa detecte que la condición es correcta abra la posición en ese precio que es el cierre de la vela actual, no sé si me explico. Y en teoría, si no quiero poner stoploss ni take profit, esos valores los dejo a 0 o simplemente pongo la coma sin ningún valor, cierto?
La variable ticket se guarda en un valor entero, pero esa sentencia que expuse arriba abre la posición directamente o simplemente agrega valor a la variable ticket?
De nada mi estimado amigo...
En relación a tus nuevas dudas te comento lo siguiente:
1) Es correcto, la variante OP_BUY abre una orden de compra al precio actual del mercado, es decir, al más reciente precio Ask recibido desde el servidor. Por lo tanto, no hay que colocar parámetro alguno de precio. Debes dejarlo en blanco dejando la coma correspondiente. Ese será el momento del cierre de tu vela actual.
Si fuese el caso de una OP_BUYLIMIT o OP_BUYSTOP, sí tendrías que colocar tu precio deseado, en el primero por debajo del mercado y en el segundo por encima del mercado.
Ten en cuenta también que toda orden BUY abre la compra por el precio Ask y al momento de su cierre lo hace por el precio Bid. Por supuesto, lo contrario sucede con la orden SELL.
2) La sentencia int ticket=OrderSend(... hace lo siguiente:
- Genera un valor entero en la variable ticket, de hecho, podrá servirte más adelante para comprobar su disparo. Por ejemplo: si ticket > 0 quiere decir que la orden fue disparada.
- Paralelamente, dispara tu orden deseada.
Saludos y éxitos!
Re: Vender y comprar si se cumple la condición
Cita:
Iniciado por
tonyvaloz
Estimado amigo,
Cierto lo que comentas, la gran mayoría de los lenguajes de programación tienen las mismas rutinas: bucles, condiciones, funciones, etc. Aquí con el MQL4 no es la excepción, simplemente en cuanto te familiarices con la sintaxis podrás crear fácilmente tus propios scripts o EAs.
Aunque tengo tiempo sin codificar pude buscar la chuleta para un ejemplo de colocación de orden:
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoplos s,takeprofit,"My order",16384,0,clrGreen);
Algunos tips:
Notarás cuando escribas el comando OrderSend, el editor lo presentará en color azul, luego los parámetros en negro. Inmediatamente, al abrir el paréntesis, el mismo editor crea una franja amarilla con todos los parámetros que integran dicho comando. No es necesario que coloques todos, algunos pueden ser dejados en blanco respetando la posición de las comas.
Desde el mismo editor también puedes acceder al último menú "Ayuda" o "Help" y seleccionas "manual de Referencia de MQL4" (o MQL5). Una vez desplegada tal sección, tendrás un menú en la zona izquierda con varias pestañas. Selecciona la pestaña "Indice" y tendrás toda la gama de instrucciones, comandos y funciones que utiliza el MQL4, por supuesto, cada uno de ellos tendrá su explicación en la parte derecha y un ejemplo de sintaxis correcta.
La instrucción OrderSend funciona mejor si le asignas una variable del tipo Integer tal cual como está en el ejemplo denominada ticket, es decir declarándola previamente la primera vez: int ticket.
Veo que tu instrucción IF tiene múltiples condiciones. Yo solía probar cada condición por separado, luego de asegurarme que todas funcionaban, procedía a colocarlas en una sola instrucción.
En tu caso aplica:
If (condición1 es verdadera y condición2 es verdadera y condición3 es verdadera)
int ticket=OrderSend(...
Cordiales saludos y éxitos!
Tonyvaloz, muchas gracias por responder y tomarte la molestia de darme los tips. Tengo una duda aún, en la siguiente función que expones:
Cita:
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoplos s,takeprofit,"My order",16384,0,clrGreen);
Imagino que el op_buy abre la opción de compra, pero me gustaría saber qué pongo en price para que se abra justo en esa condición. Es decir, qué tengo que poner en el price para que cuando el programa detecte que la condición es correcta abra la posición en ese precio que es el cierre de la vela actual, no sé si me explico. Y en teoría, si no quiero poner stoploss ni take profit, esos valores los dejo a 0 o simplemente pongo la coma sin ningún valor, cierto?
La variable ticket se guarda en un valor entero, pero esa sentencia que expuse arriba abre la posición directamente o simplemente agrega valor a la variable ticket?
Re: Vender y comprar si se cumple la condición
Estimado amigo,
Cierto lo que comentas, la gran mayoría de los lenguajes de programación tienen las mismas rutinas: bucles, condiciones, funciones, etc. Aquí con el MQL4 no es la excepción, simplemente en cuanto te familiarices con la sintaxis podrás crear fácilmente tus propios scripts o EAs.
Aunque tengo tiempo sin codificar pude buscar la chuleta para un ejemplo de colocación de orden:
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoplos s,takeprofit,"My order",16384,0,clrGreen);
Algunos tips:
Notarás cuando escribas el comando OrderSend, el editor lo presentará en color azul, luego los parámetros en negro. Inmediatamente, al abrir el paréntesis, el mismo editor crea una franja amarilla con todos los parámetros que integran dicho comando. No es necesario que coloques todos, algunos pueden ser dejados en blanco respetando la posición de las comas.
Desde el mismo editor también puedes acceder al último menú "Ayuda" o "Help" y seleccionas "manual de Referencia de MQL4" (o MQL5). Una vez desplegada tal sección, tendrás un menú en la zona izquierda con varias pestañas. Selecciona la pestaña "Indice" y tendrás toda la gama de instrucciones, comandos y funciones que utiliza el MQL4, por supuesto, cada uno de ellos tendrá su explicación en la parte derecha y un ejemplo de sintaxis correcta.
La instrucción OrderSend funciona mejor si le asignas una variable del tipo Integer tal cual como está en el ejemplo denominada ticket, es decir declarándola previamente la primera vez: int ticket.
Veo que tu instrucción IF tiene múltiples condiciones. Yo solía probar cada condición por separado, luego de asegurarme que todas funcionaban, procedía a colocarlas en una sola instrucción.
En tu caso aplica:
If (condición1 es verdadera y condición2 es verdadera y condición3 es verdadera)
int ticket=OrderSend(...
Cordiales saludos y éxitos!
Vender y comprar si se cumple la condición
Hola chicos,Soy un poco nuevo con el tema de programación mql, pero como tengo experiencia en otros lenguajes de programación lo básico de bucles, condiciones, funciones y esas cosas las conozco. Estoy en la parte del código en la que necesito que si se cumple la condición que pongo, se realice una venta, pongo el código: if(Signal!=Fresh[0]) { if(PopUpAlert){ Alert(Symbol()," ","Vender"); OrderType() == OP_SELL; }}El problema es que no sé si lo tengo bien, ya que no sé abrir posiciones de compra y venta. Agradecería si alguien me echara una mano.Gracias
- - - Updated - - -
Cita:
Iniciado por
Reload
Hola chicos,Soy un poco nuevo con el tema de programación mql, pero como tengo experiencia en otros lenguajes de programación lo básico de bucles, condiciones, funciones y esas cosas las conozco. Estoy en la parte del código en la que necesito que si se cumple la condición que pongo, se realice una venta, pongo el código: if(Signal!=Fresh[0]) { if(PopUpAlert){ Alert(Symbol()," ","Vender"); OrderType() == OP_SELL; }}El problema es que no sé si lo tengo bien, ya que no sé abrir posiciones de compra y venta. Agradecería si alguien me echara una mano.Gracias
perdonad es que no sé editar el mensaje y el código salió muy mal, lo pongo con cota:
Cita:
if(Signal!=Fresh[0])
{
if(PopUpAlert){
Alert(Symbol()," ","Vender");
OrderType() == OP_SELL;
}
}