En lugar de ver programas de televisión como su segunda función se debe considerar para leer y entender el Libro. ;-)
Lo que usted está tratando de lograr es sencillo y se utiliza en muchas estrategias, pero su código - y sus historias - son confusas y parcialmente erróneas - al menos el código.... no estoy seguro de las historias.
//Pseudo codeif(NewBar) ResetSignals(); //Set all SignalxExecuted to falseif(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
SignalBuy1Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
SignalBuy2Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
SignalBuy1=CheckForOpenBull42(); //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62(); //Check for Signal2 condition is true
if(OpenOrders()>0)CheckForClose(); //Check any order needs to be closed
//and so on.....
¿Por qué no intenta implementar una sola señal por el momento y concentrarse en la codificación de las funciones necesarias? Si tienes un buen código para una señal, probablemente sea fácil implementar las otras señales y muchas funciones ya están ahí.
Más adelante podrías utilizar Arrays y otras funciones para simplificarlo, pero la simplificación de tu código anterior no debería ser tu mayor problema en este momento.
Kronin¡Sí!me entiendes:), muchas de las estrategias en un EA . Tengoque escribir150políticasydebencaminar al mismo tiempoen el mismo gráfico, yejecutartodas las estrategiasa la vez. Cuando ejecute 150 EA al mismo tiempo miPCva aexplotar-creo que sí.
Despuésno tiene sentidoporquesolopuedes tener unEA de estrategia y muchos ya dentro.
Porsupuesto,laestrategiano puedeinterferir entre sí a cabo y cuando se ejecuta uno el segundo puede ejecutar también, y puedo haber ejecutado strategie 1, y 3 y 5. y strategie (1,3,5) que se ejecuta en el mismo momento.
No voy aescribirmáshistorias:)
Micódigo estámal -se sabe, tratéde poner lasdos estrategiasen un soloEA, el códigofuncionabien, pero latotalidadno estáfuncionando bien
Tu códigoes muyinteresante,loestudiaré, por favordamealgo de tiempo
Holaamigos,después de un largotrabajoen el código ya través dela informacióndeKronincódigo estáestructurado yopera. Elcódigopresentados estrategiasen un soloEA
1.Para unescenario decompra de velaspequeñas está marcado conuna fl echa azul,sondos opciones de COMPRA 2. Para elescenario decompra develasmediasestá marcado conuna flecha roja,sontres opciones de COMPRA
Tengo unasituación tambiéndonde 1punto=1 pipes conveniente(para resolverel problema espara más adelante) Noutilizar las opcionessi (NewBar)ResetSignals()porque creo que no sonla causadel error
Si eliminasla función PART 2 en start()azuluna estrategia funcionará , yfunciona bien Siejecuta elcódigoPART1yPART2que contienedos estrategias de lanzamiento,pero se superponen. este es el error
¿Podría echar un vistazoKronin
//+------------------------------------------------------------------+//+------------------------------------------------------------------+#define MAGICMA 20050610//+------------------------------------------------------------------+//| Check NEW BAR WORK AT BARS M15 |//+------------------------------------------------------------------+/*
bool New_Bar = false;
bool Fun_New_Bar()
{
static datetime New_Time=0;
New_Bar=false;
if(New_Time!=Time[0])
{
New_Time=Time[0];
New_Bar=true;
}
}
*///+------------------------------------------------------------------+//| Calculate open positions HOW MEANY OF THIS |//+------------------------------------------------------------------+int OpenOrders(string symbol)
{
int buys=0,sells=0;
//----for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
}
}
//---- return orders volumereturn(buys);
}
//+------------------------------------------------------------------+//| Calculate candle These is condidion |//+------------------------------------------------------------------+// scenario 1 / EA 1 / startegy 1 / bluebool BULL4()
{
if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
return(true);
}
// scenario 2 / EA 2 / startegy 2 / redbool BULL6()
{
if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
return(true);
}
//+------------------------------------------------------------------+//| Check for open order conditions |//+------------------------------------------------------------------+// Check for open for scenario 1 / EA 1 / startegy 1 bool OpenBULL41()
{
int res;
if(Bid==Close[1]+3*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return (true);
}
return (false);
}
//----------------------------------- bool OpenBULL42()
{
int res;
if(Ask>OrderOpenPrice()+4*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return;
}
}
// Check for open for scenario 2 / EA 2 / startegy 2void OpenBULL61()
{
int res;
if(Bid==Close[1]+4*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//----------------------------------- void OpenBULL62()
{
int res;
if(Ask>OrderOpenPrice()+2*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//----------------------------------- void OpenBULL63()
{
int res;
if(Ask>OrderOpenPrice()+2*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//+------------------------------------------------------------------+//| Check for close order conditions |//+------------------------------------------------------------------+void CheckForClose()
{
RefreshRates();
if(OrderOpenPrice()+4*Point< Ask)
for (int i = OrdersTotal()-1; i >= 0;i--) // I Have do -1 in "OrdersTotal()-1"
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
bool ticket = true;
if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);
}
}
}
/*
void CheckForClose2()
{
RefreshRates();
if(OrderOpenPrice()+6*Point< Ask)
for (int i = OrdersTotal(); i >= 0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
bool ticket = true;
if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);
}
}
}
*///+------------------------------------------------------------------+//| Start function |//+------------------------------------------------------------------+void start()
{
//------------------ PART1 bool SignalBULL41Executed=false;
if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
{
OpenBULL41();//do open buy position
SignalBULL41Executed=true;
}
bool SignalBULL42Executed=false;
if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
{
OpenBULL42();//do open buy position
SignalBULL42Executed=true;
}
if(OpenOrders(Symbol())>0)CheckForClose();
//------------------ PART 2bool SignalBULL61Executed=false;
if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
{
OpenBULL61();//do open buy position
SignalBULL61Executed=true;
}
bool SignalBULL62Executed=false;
if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
{
OpenBULL62();//do open buy position
SignalBULL62Executed=true;
}
bool SignalBULL63Executed=false;
if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
{
OpenBULL63();//do open buy position
SignalBULL63Executed=true;
}
// if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();
}
//+------------------------------------------------------------------+
Noutilizar las opcionesif (NewBar)ResetSignals()porque creo que no sonla causadel error
La forma en que está codificada la función Fun_NewBar() no te permitirá hacer eso... tienes que hacerlo así para que sea de tipo bool y devuelva un valor bool....
bool Fun_New_Bar()
{
staticdatetime New_Time=0;
if(New_Time!=Time[0])
{
New_Time=Time[0];
return(true); // <---- we have a new bar so the function returns true
}
return(false);
}
Sí tienes razóndevuelvebooly hayint (ya arreglado)que no veo antes. Gracias Peroesta funciónno la uso, es como untexto
No creo queestose apliquea lasfuncionesquemeseparandosestrategiassuperpuestas.No veola relación.¿O tal vez estoy equivocado?
//Pseudo codeif(NewBar) ResetSignals(); //Set all SignalxExecuted to falseif(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
SignalBuy1Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
Es bueno ver que has hecho algunos progresos, pero todavía queda un largo camino por recorrer :-)
Tienes que arreglar lo que RaptorUK dijo arriba. El restablecimiento de las señales es importante, de lo contrario el EA se detiene muy pronto con la apertura de nuevas operaciones. Su implementación es incorrecta. Si usted restablece el SignalExecuted con cada tick, no tiene sentido. Tal vez no abre más operaciones, porque filtras también las OpenOrders. Pero, como tu estrategia permite tener múltiples órdenes abiertas, puedo imaginar que también quieres un algoritmo para cerrar órdenes, por lo que necesitas que la bandera SignalExecuted se restablezca en una nueva barra (con tu implementación es inútil y no la necesitas).
Si te entiendo bien, no ejecutarás BULL4 si BULL6 también es cierto. O en otras palabras, la estrategia azul sólo, si la estrategia roja no es válida, o la vela pequeña sólo si la vela media no es válida.
if(BULL4()&&!BULL6(){ // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
OpenBULL41();//do open buy position
SignalBULL41Executed=true;
}
if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
OpenBULL42();//do open buy position
SignalBULL42Executed=true;
}
// Check for open for scenario 1 / EA 1 / startegy 1 bool OpenBULL41()
{
int res;
if(Bid==Close[1]+3*Point) // <--- equal makes no sense here and you should not compare doubles for equality.
Read (again): https://www.mql5.com/en/forum/136997
{
res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket
number or -1, aren't you?
return (true); // <--- Even if OrderSend() fails you return true.
}
return (false);
}
//----------------------------------- bool OpenBULL42()
{
int res;
if(Ask>OrderOpenPrice()+4*Point) // <--- OrderOpenPrice() from a somewhere selected order may or may not work here
(may because only one order is open), but it is not nice coded.
{
res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return;
}
}
La función CheckForClose() tiene más o menos los mismos problemas y además no hay filtro para el número mágico. También aquí, OrderOpenPrice() seleccionado de una orden en el recuento de compra podría terminar en el cierre de la orden equivocada (no estoy seguro de que funcione realmente). Por favor, lea de nuevo lo que Raptor escribió en la primera página de este hilo.
Por tus mensajes y los comentarios en el código, tengo la sensación de que quieres saber qué orden pertenece a qué estrategia. Para conseguirlo, puedes definir un segundo número mágico para la segunda estrategia, así será más fácil cerrar las órdenes según la estrategia que tenían abierta
Por tus mensajes y los comentarios en el código, tengo la sensación de que quieres saber qué orden pertenece a qué estrategia. Para conseguirlo, puedes definir un segundo número mágico para la segunda estrategia. Así será más fácil cerrar las órdenes según la estrategia que tenían abierta
¿No sería más sencillo ejecutar 2 estrategias diferentes en 2 EAs distintos, cada uno en su propio gráfico?
RaptorUK: ¿No sería más sencillo ejecutar 2 estrategias diferentes en 2 EAs distintos, cada uno en su propio gráfico?
Sí, para 2, 3, 4, 5... de acuerdo. Pero según las historias y esta :"Tengoque escribir150políticas ydebencaminar almismo tiempoen el mismo gráfico, yejecutartodas las estrategias a la vez.Cuando ejecute 150 EA al mismo tiempomiPCva aexplotar,creo quesí." Creo que planea ejecutar muchas estrategias más en un EA....
Para los que aún no entienden mi EA escriban un cuento: D jejeje
El evento es velas - cuenta con varias opciones para comprar y vender o cerrar.
En lugar de ver programas de televisión como su segunda función se debe considerar para leer y entender el Libro. ;-)
Lo que usted está tratando de lograr es sencillo y se utiliza en muchas estrategias, pero su código - y sus historias - son confusas y parcialmente erróneas - al menos el código.... no estoy seguro de las historias.
¿Por qué no intenta implementar una sola señal por el momento y concentrarse en la codificación de las funciones necesarias? Si tienes un buen código para una señal, probablemente sea fácil implementar las otras señales y muchas funciones ya están ahí.
Más adelante podrías utilizar Arrays y otras funciones para simplificarlo, pero la simplificación de tu código anterior no debería ser tu mayor problema en este momento.
Kronin ¡Sí! me entiendes :), muchas de las estrategias en un EA .
Tengo que escribir 150 políticas y deben caminar al mismo tiempo en el mismo gráfico, y ejecutar todas las estrategias a la vez. Cuando ejecute 150 EA al mismo tiempo mi PC va a explotar - creo que sí.
Después no tiene sentido porque solo puedes tener unEA de estrategia y muchos ya dentro.
Porsupuesto, la estrategia no puede interferir entre sí a cabo y cuando se ejecuta uno el segundo puede ejecutar también, y puedo haber ejecutado strategie 1, y 3 y 5. y strategie (1,3,5) que se ejecuta en el mismo momento.
No voy a escribir más historias :)
Mi código está mal - se sabe, traté de poner las dos estrategias en un solo EA, el código funciona bien , pero la totalidad no está funcionando bien
Tu códigoes muy interesante , lo estudiaré, por favor dame algo de tiempo
Hola amigos, después de un largo trabajo en el código y a través de la información de Kronin código está estructurado y opera.
Elcódigo presenta dos estrategias en un solo EA
1.Para un escenario de compra de velaspequeñas está marcado con una fl echa azul, son dos opciones de COMPRA
2. Para el escenario decompra de velas medias está marcado con una flecha roja, son tres opciones de COMPRA
Tengo una situación también donde 1 punto = 1 pip es conveniente (para resolver el problema es para más adelante)
No utilizar las opciones si (NewBar) ResetSignals () porque creo que no son la causa del error
Si eliminas la función PART 2 en start() azul una estrategia funcionará , y funciona bien
Siejecuta el código PART1 y PART2 que contiene dos estrategias de lanzamiento , pero se superponen. este es el error
¿Podría echar un vistazo Kronin
No utilizar las opciones if (NewBar) ResetSignals () porque creo que no son la causa del error
La forma en que está codificada la función Fun_NewBar() no te permitirá hacer eso... tienes que hacerlo así para que sea de tipo bool y devuelva un valor bool....
Sí tienes razón devuelve bool y hay int (ya arreglado) que no veo antes. Gracias
Pero esta función no la uso, es como un texto
No creo que esto se aplique a las funciones que me separandos estrategias superpuestas . No veo la relación. ¿O tal vez estoy equivocado?
Es bueno ver que has hecho algunos progresos, pero todavía queda un largo camino por recorrer :-)
Tienes que arreglar lo que RaptorUK dijo arriba. El restablecimiento de las señales es importante, de lo contrario el EA se detiene muy pronto con la apertura de nuevas operaciones.
Su implementación es incorrecta. Si usted restablece el SignalExecuted con cada tick, no tiene sentido. Tal vez no abre más operaciones, porque filtras también las OpenOrders. Pero, como tu estrategia permite tener múltiples órdenes abiertas, puedo imaginar que también quieres un algoritmo para cerrar órdenes, por lo que necesitas que la bandera SignalExecuted se restablezca en una nueva barra (con tu implementación es inútil y no la necesitas).
Si te entiendo bien, no ejecutarás BULL4 si BULL6 también es cierto. O en otras palabras, la estrategia azul sólo, si la estrategia roja no es válida, o la vela pequeña sólo si la vela media no es válida.
Próximos pasos:
La función CheckForClose() tiene más o menos los mismos problemas y además no hay filtro para el número mágico. También aquí, OrderOpenPrice() seleccionado de una orden en el recuento de compra podría terminar en el cierre de la orden equivocada (no estoy seguro de que funcione realmente).
Por favor, lea de nuevo lo que Raptor escribió en la primera página de este hilo.
Por tus mensajes y los comentarios en el código, tengo la sensación de que quieres saber qué orden pertenece a qué estrategia. Para conseguirlo, puedes definir un segundo número mágico para la segunda estrategia, así será más fácil cerrar las órdenes según la estrategia que tenían abierta
Próximos pasos:
Por tus mensajes y los comentarios en el código, tengo la sensación de que quieres saber qué orden pertenece a qué estrategia. Para conseguirlo, puedes definir un segundo número mágico para la segunda estrategia. Así será más fácil cerrar las órdenes según la estrategia que tenían abierta
¿No sería más sencillo ejecutar 2 estrategias diferentes en 2 EAs distintos, cada uno en su propio gráfico?
Sí, para 2, 3, 4, 5... de acuerdo. Pero según las historias y esta :"Tengo que escribir 150 políticas y deben caminar al mismo tiempo en el mismo gráfico, y ejecutar todas las estrategias a la vez . Cuando ejecute 150 EA al mismo tiempo mi PC va a explotar , creo que sí."
Creo que planea ejecutar muchas estrategias más en un EA....