Vaya por delante que llevo apenas unas horas tomando contacto con la programación del Metatrader, y seguramente en mi código haya cometido 37 aberraciones (por lo menos). Os pido ayuda a los que tengáis experiencia para acelerar mi aprendizaje.
La idea del sistema que quiero hacer es que lance dos órdenes de compra/venta sobre un mismo punto ("lineabajo"), y cuando éstas se ejecuten, también se cierre la posición con mejor profitloss de las que estén ya abiertas. Además, todas las posiciones abiertas deben llevar un stoploss fijo.
Para que veais que me lo he intentado currar, os dejo el código que he chapurreado hasta ahora, copiando y pegando de otros sistemas, y trasladando código también desde el Ninja Trader. El caso es que compilar compila, pero no tengo ni idea de cómo empezar a tapar goteras, porque el sistema no hace nada.
Os dejo el código en la imagen adjunta, porque por alguna extraña razón, el código se cambia al pegarlo, osea que os adjunto la imagen con el código escrito.
Como os comentaba, puede que haya cometido muchísimos errores...
Fijaos que sólo lanzo las operaciones una vez... para que las órdenes permanezcan en mercado hasta que se ejecuten (hasta que lleguen a "lineabajo" ¿debo dejar la variable "operar" en "true" siempre, o con lanzarla una vez ya se queda hasta que se ejecute?
Otra cosa, para lanzar las órdenes, podéis ver que tengo estos comandos:
OrderSend(Symbol(),OP_SELL,OrderLots(),lineabajo,3,lineabajo+perdida,0,"",MAGICMA,0,Red);
OrderSend(Symbol(),OP_BUY,OrderLots(),lineabajo,3,lineabajo-perdida,0,"",MAGICMA,0,Blue);
¿Están bien formulados? (El MAGICMA lo tengo declarado al principio del código como "#define MAGICMA 20090225" ).
Y por último, ¿cómo puedo saber que las órdenes de entrada han sido ejecutadas, para cerrar la mejor posición? (para poner ejecutadas=true, vamos). En el sistema tengo esta línea:
if (lineabajo<High>Low[0]) ejecutadas=true;
¿Voy bien? La cuestión es que el sistema no hace nada de nada...
Saludos, y gracias por vuestra ayuda.
Edito: Tengo declaradas las variables como:
Lots: 0.1
perdida:0.001
Ayuda con el "Expert Advisor"
Ayuda con el "Expert Advisor"
- Adjuntos
-
- ejemplo_ea1.jpg (76.89 KiB) Visto 786 veces
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."
Aristóteles.
Aristóteles.
Una pregunta muy tonta... has activado Allow Live Trading cuando insertas el EA? Estás trabajando con un Metatrader estándar o uno que pudiera tener capado el funcionamiento de EAs? Has probado otro EA para ver si realmente lanza órdenes?
Saludos,
X-Trader
Saludos,
X-Trader
Última edición por X-Trader el 26 Feb 2009 09:25, editado 1 vez en total.
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Yo ya veo un error que puede hacer que no te rule.
Si lanzas 2 órdenes al mismo tiempo, una de compra y otra de venta no pueden tener el mismo precio en ejecución instantánea. Debes poner Ask y Bid en vez de lineabajo.
Si lo que quieres es lanzar 2 órdenes concicionadas debes cambiar OP_BUY y OP_SELL por OP_BUYSTOP y OP_SELLLIMIT si el precio se encuentra por debajo del punto de entrada. En caso de encontrarse por encima del punto de entrada debes poner OP_BUYLIMIT y OP_BUYSTOP.
Al meter órdenes instantáneas deberías controlar los requotes para que te relance la orden si no se ejecuta. También puedes poner un slipage de 1 pipo para asegurarte que entra.
Si lanzas 2 órdenes al mismo tiempo, una de compra y otra de venta no pueden tener el mismo precio en ejecución instantánea. Debes poner Ask y Bid en vez de lineabajo.
Si lo que quieres es lanzar 2 órdenes concicionadas debes cambiar OP_BUY y OP_SELL por OP_BUYSTOP y OP_SELLLIMIT si el precio se encuentra por debajo del punto de entrada. En caso de encontrarse por encima del punto de entrada debes poner OP_BUYLIMIT y OP_BUYSTOP.
Al meter órdenes instantáneas deberías controlar los requotes para que te relance la orden si no se ejecuta. También puedes poner un slipage de 1 pipo para asegurarte que entra.
- nostrasladamus
- Mensajes: 313
- Registrado: 09 Feb 2009 13:27
- Ubicación: Sistema Referencia Inercial
pero Ojo
por cada tick en el que operar=false, o sea, que el precio todavia no ha llegado a "lineabajo", estas lanzando ordenes de ejecucion instantanea, como dice Spirit, que te daran error si hay diferencia con el ask o bid. Si pones las ordenes limitadas, tambien estaras lanzando un monton de ordenes, y cuando el precio llegue alli, te compraran un monton
creo que tienes que separar tanto if dentro del otro
mete "Print" en cada if, para, leyendo el archivo log, saber si realmente ha saltado ese if.
En el print mete el ask, bid, "lineabajo" etc para ver donde falla y que puntos toca y cuales no....
por cada tick en el que operar=false, o sea, que el precio todavia no ha llegado a "lineabajo", estas lanzando ordenes de ejecucion instantanea, como dice Spirit, que te daran error si hay diferencia con el ask o bid. Si pones las ordenes limitadas, tambien estaras lanzando un monton de ordenes, y cuando el precio llegue alli, te compraran un monton
creo que tienes que separar tanto if dentro del otro
mete "Print" en cada if, para, leyendo el archivo log, saber si realmente ha saltado ese if.
En el print mete el ask, bid, "lineabajo" etc para ver donde falla y que puntos toca y cuales no....
Si vis pacem, para bellum.
Dios me libre de los mansos, que de los fieros ya me libro yo.
Dios me libre de los mansos, que de los fieros ya me libro yo.
Si te ha gustado este hilo del Foro, ¡compártelo en redes!