-----------------------------------------------------------------+ //| Opening and Closeing.mq4 | //| Copyright © 2010, Ben banta | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Ben banta" //+------------------------------------------------------+ //| Closing My Way | //+------------------------------------------------------+ double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if ( OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol() // with my symbol ) { if(OrderType() == OP_SELL) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() + (ATR*2)) // ATR*2 above Sell. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Blue); Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2)) //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2)) }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc }// END for loop //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0) return(0); }//ENDif (Ask > High[iHighest(NU... etc //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); }//ENDif (ticket>0) else Print ("Error Opening Sell Order :" ,GetLastError()); //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(0); }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) return(0); }//ENDif (OrdersTotal() < 1) }//ENDint start()Debería facilitar la lectura de los bloques de código
if(OrderTicket() == OrderOpenPrice() - (ATR*2))Elticket de pedido es un número entero muy grande (probablemente de miles de millones), la clave del pedido.
OOP - 2ATR es un precio.
Los dos NUNCA serán iguales
si quieres decir OrderClosePrice() == OOP-2ATR los números reales casi nunca serán iguales. usa en su lugar
if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...
OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()Tu orderSend no está estableciendo un número mágico
Saludos
El ticket del pedido es un número entero muy grande (probablemente de miles de millones), la clave del pedido.
OOP - 2ATR es un precio.
Los dos NUNCA serán iguales
si quieres decir OrderClosePrice() == OOP-2ATR los números reales casi nunca serán iguales. utiliza en su lugar:
Tu orderSend no está estableciendo un número mágico
Gracias por mirar y dar las sugerencias. Pero debo decir que no entendí el OOP -2ATR de inmediato.
OOP = OrderOpenPrice. Eso pasó por encima de mi cabeza al principio. Tu explicación es absolutamente correcta. Me quedé pillado con el signo ==. El OrderClosePrice() nunca podría ser igual a OrderOpenPrice() menos el (ATR*2). Gracias por captarlo.
A ver si entiendo tu sugerencia. Lo reexpresaré aquí. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Esto parece que se lee (voy a utilizar cifras arbitrarias aquí) OCP = 1,4361, OOP = 1,4321, ATR = 20. Así que la expresión se vería como
si (1,4321 - 1,4361 - (20*2) <= 0), lo siento, pero no lo entiendo.
Tal vez pueda utilizar las mismas cifras para reordenar la expresión, para mostrar lo que quería decir. Pero esto tampoco funcionó cuando las introduje en el programa.
El nuevo arreglo queda así
si (1,4361 >= 1,4321 + (20*2)).
Cuando el OCP >=OOP + ATR*2, el control pasa a:
OrderClose (OrderTicket(), OrderLots(), etc.
Su otra observación fue que el OrderSend no está estableciendo un número mágico.
Podría quitar esta parte del programa: && OrderMagicNumber == MagicNumber,
Gracias de nuevo, y si puedes ver otras mejoras, te lo agradecería.
Saludos
OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;
Gracias por tu respuesta. Espero que te vaya bien.
La sugerencia fue insertada esta mañana. Lamento decir que al compilador no le gusta lo que he codificado. No estoy seguro de qué declaración en el programa es incorrecta. Las sugerencias creo que están bien. Voy a volver a publicar el programa y marcar el área que creo que puede ser el problema. También indicaré la estrategia de cierre.
La posición de venta se detendrá por encima del precio de apertura de la orden por Atr*2. Por ejemplo, OOP es 1.4321, Atr =20, y OCP = 1.4361.
Así que codifiqué la expresión como
if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // se cumple la condición, el control pasa a....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;
Nota: No hay StopLoss(), o TakeProfit() en la declaración OrderSend, si eso tiene alguna relevancia.
Gracias de nuevo por la ayuda de todos
Saludos
double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if (OrderSelect(index, SELECT_BY_TICKET) // existing orders //&& OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()) // with my symbol { if(OrderType() == OP_SELL) order = OrderTicket(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met, // control then passes to... { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); } } } //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); return(0); } //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Sell Order :" ,GetLastError()); return(0); } return(0); } }
Hola Huckleberry,
Voy a reestructurar ligeramente tu programa.
Adiós por ahora
¿Por qué hacer "order = OrderTicket(); " y no utilizar ese valor en la función orderclose()?
Aunque la posibilidad de que la orden seleccionada haya cambiado es pequeña, ¿no sería más seguro utilizar el valor de la orden positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será el ticket actualmente seleccionado - en esta etapa de mi aprendizaje
No puedo saber qué orderticket está seleccionado cuando se hace el OrderClose().
//// Editar
En realidad, no estoy seguro de que "order= OrderTicket()" sea el ticket que identificaste en la declaración If anterior.
¿Por qué hacer "order = OrderTicket(); " y no utilizar ese valor en la función orderclose()?
Aunque la posibilidad de que la orden seleccionada haya cambiado es pequeña, ¿no sería más seguro utilizar el valor de la orden positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será el ticket actualmente seleccionado - en esta etapa de mi aprendizaje
No puedo saber qué orderticket está seleccionado cuando se hace el OrderClose().
//// Editar
En realidad no estoy seguro de que "order= OrderTicket()" sea el ticket que has identificado en la declaración If anterior.
Gracias por tu observación y sugerencia. Tu tiempo es valioso.
Tu razonamiento tiene mucho sentido. No estoy más seguro que tú en lo que respecta al orden seleccionado. Probaré tu sugerencia.
Gracias de nuevo
Saludos
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Hola a todos
Espero que la sintaxis sea mejor que antes. Durante la última semana, he estado leyendo el Codersguru.
El programa de abajo, aunque no tiene ningún error, el compilador registrará sólo una orden. Pero mi código no lo cierra.
El programa dice --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), no he
insertado el stoploss o el takeprofit, como puedes ver. Razón, hay una condición de StopLoss ya codificada como tal ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Así que no hay necesidad de insertar otro el StopLoss, ¿no? En cuanto a la TakeProfit
Voy a codificar que en cuando este otro problema se resuelve.
¿Es la forma en que codifiqué la condición de cierre, o hay problemas de nuevo con la sintaxis?
Gracias a todos por vuestra ayuda, y que mi problema ayude a otros,
Saludos