Re: como cerrar una orden en MQL4?
Así a primera vista no sabría decirte por qué no se te cierran todas las operaciones de golpe, pero no, no necesitas poner un MagicNumber diferente a cada orden para conseguir que se cierren todas las operaciones. Para que todo está bien para cerrar todas las operaciones. Para ver que pasa deberías ver que código te devuelve el servidor del broker. Haz algo así para registrar el error en el log del EA:
Code:
Código:
result = OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Gold);
if (!result){
Print(???Error closing SELL order: ??? + ErrorDescription(GetLastError()));
}
Respecto al cierre parcial se puede hacer perfectamente, para ello simplemente debes poner el número de lotes que quieres cerrar. Por ejemplo, si quieres cerrar el 30% de una posición y esta es de 1 lote, podrías cerrarla así:
Code:
Código:
OrderClose(OrderTicket(),0.3,Bid,3,Blue);
Nota como he cerrado 0.3 lotes en lugar de 1. Nunca he probado esto pero en teoría, de acuerdo a como funciona Metatrader, debería funcionar.
Lo de ???programar las órdenes para que el take profit esté condicionado al trailing stop??? no sé que quieres decir. ¿Quieres poner un take profit que vaya cambiando con el trailing stop? ¿Algo así como un trailing profit?
Re: como cerrar una orden en MQL4?
Hola, he estado leyendo tu artículo acerca del mágic number y se me ocurre que quizá tenga que identificar cada una de las órdenes con un magic númber diferente, es decir algo como:
Code:
Código:
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 30 * Point,???My order 1???,MagicNumber1,0,Green);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 60 * Point,???My order 1???,MagicNumber2,0,Green);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 90 * Point,???My order 1???,MagicNumber3,0,Green);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,???My order #1???,MagicNumber4,0,Green);
y después en la función que cierra las operaciones ponerlo en las condiciones algo como:
Code:
Código:
double cierraoperacion()
{
for (int i = 0; i < OrdersTotal(); i++)
{//Ejecutamos la funcion OrderSelectif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
//si OrderSelect ha seleccionado alguna orden, comprobamos las condiones que buscamos
if(Symbol() == OrderSymbol())
{
//si el simbolo del grafico actual es igual al simbolo de la orden seleccionada,
//pasamos a la siguiente comprobacion
if(OrderMagicNumber() == MagicNumber1 && OrderMagicNumber() == MagicNumber2 && OrderMagicNumber() == MagicNumber3 && OrderMagicNumber() == MagicNumber4)
{
if(OrderType() == OP_BUY)
{
//se han dado las tres condiciones que hace que la orden seleccionada sea
//la orden que queremos cerrar, asi que la cerramos
OrderClose(OrderTicket(),0.1,Bid,3,Blue);
testcompra=1;
comprados=0;
}
if(OrderType() == OP_SELL)
{
//se han dado las tres condiciones que hace que la orden seleccionada sea
//la orden que queremos cerrar, asi que la cerramos
OrderClose(OrderTicket(),0.1,Ask,3,Blue);
testventa=1;
vendidos=0;
}
}
}
}
}
}
Serviría esto para cerrar todas las operaciones de golpe?
Por último, mi robot se basa en medias exponenciales y en intentar que compre o venda cuando exista tendencia, he visto que tienes un artículo que habla de diferentes indicadores, podrías recomendarme uno que estuviera basado en el volumen o en la volatilidad y que me indicara que la tendencia en la que he entrado tiene fuerza, o tiene continuación o algo así, es para filtrar las entradas e intentar acertar en un porcentaje mayor las entradas. quiero usarlo en gráficos de velas de 30 minutos.
Gracias y espero no agobiarte con mis cuestiones.
Re: como cerrar una orden en MQL4?
Hola, tengo un problema con el código, es el siguiente, quiero lanzan 4 ordenes de compra o de venta cuando se cumplen ciertas condiciones, y cada una de ellas debe tener un take profit diferente, de la siguiente forma:
Code:
Código:
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 30 * Point,???My order #1???,MagicNumber,0,Green);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 60 * Point,???My order #1???,MagicNumber,0,Green);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 90 * Point,???My order #1???,MagicNumber,0,Green);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,???My order #1???,MagicNumber,0,Green);
Una de las condiciones que tiene que cumplirse es la siguiente:
Code:
Código:
vela1=Close[1]-Open[1]; //Si la vela actual y la anterior es >=0 la vela es verde, si es <0, la vela es roja
vela2=Close[2]-Open[2];
if (comprados==1&&vela1<0&&vela2>=0&&Close[1]=0&&vela2<0&&Close[1]>MA_media_1) //si la vela actual es verde y la vela anterior es roja, si estamos vendidos y si el cierra de la vela actual
{ //está por encima de la media de medios, tenemos que cerrar la mitad de las posiciones, o sea 2.
cierraoperacion();
}
Cuando se cumple esto salta a la función:
Code:
Código:
double cierraoperacion()
{
for (int i = 0; i < OrdersTotal(); i++)
{//Ejecutamos la funcion OrderSelectif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
//si OrderSelect ha seleccionado alguna orden, comprobamos las condiones que buscamos
if(Symbol() == OrderSymbol())
{
//si el simbolo del grafico actual es igual al simbolo de la orden seleccionada,
//pasamos a la siguiente comprobacion
if(OrderMagicNumber() == MagicNumber)
{
if(OrderType() == OP_BUY)
{
//se han dado las tres condiciones que hace que la orden seleccionada sea
//la orden que queremos cerrar, asi que la cerramos
OrderClose(OrderTicket(),0.1,Bid,3,Blue);
testcompra=1;
comprados=0;
}
if(OrderType() == OP_SELL)
{
//se han dado las tres condiciones que hace que la orden seleccionada sea
//la orden que queremos cerrar, asi que la cerramos
OrderClose(OrderTicket(),0.1,Ask,3,Blue);
testventa=1;
vendidos=0;
}
}
}
}
}
}
Cuando salta a esta función y tiene por ejemplo 4 órdenes abiertas, debería cerrarlas todas a la vez, sin embargo no lo hace. Cierra 2 o 3, no siempre las mismas. Esto puede deberse a que no le da tiempo a cerrarlas todas cuando salta a la función y se espera al siguiente ciclo para cerrar las que sigue teniendo abiertas?
De qué forma podría cerrarlas todas a la vez?
Es posible abrir sólo una orden e ir cerrándola por lotes, es decir abro una orden y cuando se cumplen 30 ticks cierro el 30 % de la operación, cuando se cumplen otros 30 ticks cierro el otro 30 %, al cumplirse otros 30 ticks cierro otro 30 % y el resto de la operación abierta, que será del 10% seguirá abierta?
Otra pregunta, como puedo programar las órdenes para que el take profit esté condicionado al trailing stop, es decir abrir 4 posiciones y tal y como he puesto en el código anterior y la que el take profit de cada orden sea de 20 pips para la primera, 40 pips para la segunda y 60 pips para la tercera por ejemplo?
Gracias.
Re: como cerrar una orden en MQL4?
Como dicen, yo también quiero un indicador que me diga cuándo va a cambiar la tendencia!! Jeje.
Fuera bromas, indicadores hay muchos. Desde mi punto de vista todos tienen su utilidad, todos son buenos y todos son malos. La clave es la forma de uso y la experiencia del trader. Por eso siempre hay que aprender y entrenarse. Y si vas a programar hay que conocer muy bien que es lo que hace el indicador, su fórmula de cálculo, qué datos tiene en cuenta y que significa su resultado. No es tan simple como se ha planteado aquí, al menos desde mi opinión.
Re: como cerrar una orden en MQL4?
??? Conoces algún indicador que vaya bien para anticiparme al cambio de tendencia y entonces salir de la operació?
Yo también lo quiero saber!!! (junto a unos cuántos miles de personas) :woohoo:
Re: como cerrar una orden en MQL4?
No por favor, no te preocupes cualquier idea o sugerencia será bien recibida. Mi idea para determinar la tendencia es comparar dos valores sucesivos de la EMA, el de la vela recién finalizada y el de la vela anterior, para suavizar la EMA se pueden ir probando valores a ver cual va mejor y de esta forma que determine la tendencia sin esos altibajos.
No se me ocurre otra forma de determinar la tendencia (pero yo soy muy pollo programando sistemas automáticos).
El funcionamiento del sistema que estoy programando es el siguiente:
??? 1º determina tendencia.
??? 2º Si no tenemos tendencia no hace nada.
??? 3º si la tendencia es alcista y la vela que finaliza está por encima de la EMA de altos (será una vela verde) entramos largos y lanza una orden de compra. Si estamos vendidos cierra la orden de venta.
??? 4º Si la tendencia es bajista y la vela que finaliza está por debajo de la EMA inferior (será una vela roja) entramos cortos y lanza una orden de venta. Si estamos comprados cierra la orden de compra.
El problema es que los ticks que consigues cuando estás en tendencia, los pierdes cuando la tendencia se gira, para esto necesito:
??? Cada 5, 10, 15, etc (esto se irá probando), salir y si seguimos en tendencia volver a entrar, es decir si estamos en tendencia alcista y estamos comprados cuando tenga por ejemplo 15 ticks, vender y volver a comprar hasta que tenga de nuevo 15 ticks y así hasta que la tendencia se gira-
??? Si la tendencia es bajista el mismo proceso pero yendo vendido.
La pregunta es:
??? Cómo puedo hacer esto, existe algún boolean que puede darme un true o un false cuando se haya vendido para así usarlo para entrar de nuevo, o cómo puedo hacerlo?
-Conoces algún indicador que vaya bien para anticiparme al cambio de tendencia y entonces salir de la operació?
??? Se admiten sugerencias.
Gracias y perdona por la extensión del comentario, un saludo.
1 Archivos adjunto(s)
Re: como cerrar una orden en MQL4?
Como te dije, tu idea para decidir en algún momento si hay tendencia o no, no me parece muy buena, pero yo pienso desde un punto de vista a medio-largo plazo y creo que tú intentas hacer algo a corto plazo, puede incluso que scalping, ¿no? Entonces puede que valga. De todas formas, ideas de sistemas de trading hay miles, yo no tengo una infalible, de lo contrario ya sería millonario.
Si me pongo muy repelente dime, no quiero que parezca que yo lo se todo, porque no lo sé ni de lejos.
Re: como cerrar una orden en MQL4?
Hola, este sistema como te decia no es rentable por que cuando entra en tendencia sólo me hace una compra o una venta, y si el mercado se gira pierdo lo ganado, por tanto al ponerle el take profit y stop loss, recojo ganancias pero no se como hacer que si sigue en tendencia me vuelva a hacer otra compra de nuevo, te pongo el código para que lo veas.
Code:
Código:
#property copyright ???jose damian cabezas pozo???
#property link ???http://www.metaquotes.net???
//????????????????????????????????????????????????????????????-
//???????????????-cuerpo del programa principal???????????????
//????????????????????????????????????????????????????????????-
#include
extern int MagicNumber = 852745962;
extern int Periodocalctrend = 5; //variable externa que almacena el periodo para calcular la tendencia
extern int PeriodoMA = 5; //periodo de la media alta
extern int PeriodoMM = 5; //periodo de la media de medios
extern int PeriodoMB = 5; //periodo de la media baja
extern double TakeProfit =15;
extern double StopLoss =15;
int testcompra=0;
int testventa=0;
int numordersend, numorderbuy;
int numerodeorden;
int ticket = 0;
int start()
{
//int testcompra=0;
//int testventa=0;
double trend; //variable que almacena la tendencia
double MA_alta_1, MA_baja_1, MA_media_1; //variables que me almacenan el valor de la media alta, media baja y media de medios
//????????????????????????????????????????????????????????????-
//while(Close[1]!=0)
//{
MA_alta_1 = iMA(NULL, 0, PeriodoMA, 0, MODE_EMA, PRICE_HIGH, 1); //valor de media alta para el ultimo tick de la vela anterior
MA_baja_1 = iMA(NULL, 0, PeriodoMB, 0, MODE_EMA, PRICE_LOW, 1);//valor de media baja para el ultimo tick de la vela anterior
MA_media_1 = iMA(NULL, 0, PeriodoMM, 0, MODE_EMA, PRICE_MEDIAN, 1);//valor de media de medios para el ultimo tick de la vela anterior
trend=calctrend(); //saltamos a la funcion que calcula la tendencia
//????????????????????????????????????????????????????????????-
if(trend==0) //si tendencia es 0 no tenemos tendencia
{
Alert(???no tenemos tendencia???);
}
//????????????????????????????????????????????????????????????-
if(trend!=0)
{
//???????????????????????????????????????????????????????????????
if (trend>0)
{
Alert (???la tendencia es alcista, y su valor es de???, trend);
while (Close[1]>MA_alta_1&&testcompra==0)
{
cierraoperacion();
Alert(???enviar orden de compra???);
ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask ??? StopLoss * Point,Ask + TakeProfit * Point,???My order #1???,MagicNumber,0,Green);
testcompra=1;
testventa=0;
Alert(???el valor de la variable ticket una vez ha vendido es???, ticket);
}
}
//????????????????????????????????????????????????????????????-
else
{
if(trend<0)
{
Alert("la tendencia es bajista, y su valor es de", trend);
while (Close[1]
La idea es que una vez estamos en tendencia por ejemplo alcista, funcione como lo hace pero que por ejemplo a 15 ticks recoja beneficios y realice otra compra, cómo puedo conseguirlo, pensaba que utilizando la variable ticket, que tomara un valor y utilizar este valor cuando se vendiera para volver a comprar, pero me da un valor raro, se te ocurre algo. Me he fijado en tus funciones pero no saco nada en claro.
Se te ocurre alguna variación para no perder lo ganado una vez el mercado se gire?
Gracias.
alcista
Re: como cerrar una orden en MQL4?
Me alegro!!! Y si este no te es rentable no pares de echarle imaginación e ir probando diferentes eegias.
Re: como cerrar una orden en MQL4?
Gracias, te debo una paella, ya está el código funcionando, otra cosa es que sea rentable o no, un saludo.