Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 30
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Saludos. He preguntado por ahí, pero aún no he encontrado respuesta. ¿Podría decirme por qué con la siguiente entrada
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}
El sistema genera constantemente errores
: billete no válido para OrderDeletefunction
Error de OrderDelete 4051
Según el libro de referencia es
Valor no válido del parámetro de la función
Aunque los parámetros parecen ser los mismos.
Aunque si se elimina la condición y se deja sólo
OrderDelete(ticketD);
OrderDelete(ticketUP);
se borra con éxito (pero lo necesito por condición). ¿Qué hago mal? Aquí está todo el asunto:
Debido a que tiene que ser seleccionado a través de OrderSelect, su valorticketD se pierde, y lo más probable es que haya alguna mierda en lugar de ticket, trate de imprimirlo y comparar.
¿Es porque la función de borrado se activa por la condición de que el valor se pierde? Intenté escribirlo así:
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);
cuando llega la condición para "ticketD", escribe los mismos errores, pero la orden"ticketUP" se borra con éxito en cada tick.
Y en general, este estilo de escritura es un disparate.
Apenas estoy empezando, agradeceré los comentarios.
insertar el código a través de "SRC" para que pueda ver
double slB, tpB, slS, tpS; double x=0, z=0;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}
if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);
double maxpr=-9999; double minpr=9999;
for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}
for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}
string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}
int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}
int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}}return(count);}
int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}
int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
¿Es porque la función de borrado se activa por la condición de que el valor se pierde? Intenté escribirlo así:
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);
Cuando llega la condición para "ticketD", escribe los mismos errores, y la orden"ticketUP" se borra con éxito en cada tick.
Debemos comprobar la existencia de la orden y si hay una con ese tick, la borraremos, si no, no haremos nada. Lo que ocurre es que el pedido ya ha sido borrado y lo vuelves a borrar
En esta entrada, la orden conticketUP se abre primero y se borra después en cada tick, mientras que la orden tikcetD, si se da la condición correspondiente, genera un error de borrado. Según la revista.
¿O tal vez he confundido algo?
pero ¿es el fondo de los dos por casualidad redundante?
OrderDelete(ticketUP);//лишняя?
Si no es superfluo, ¿dónde está la condición de eliminación?
Se trata de una variante de código que intenta eliminar una orden pendiente en cada tick, en mi opinión.
Y el número del billete no está claro.
Eso es lo que devolverá el error.
En esta entrada, la orden conticketUP se abre primero y se borra después en cada tick, mientras que la orden tikcetD, si se da la condición correspondiente, genera un error de borrado. Según la revista.
¿O tal vez estoy confundido?
bien, correctamente.
¿cuál es la cuestión entonces?
Así es.
¿Cuál es la cuestión entonces?
Esto es para diferentes órdenes. La función de eliminar uno con una condición, eliminar el otro sin una condición.
La pregunta es por qué en mi caso la función de borrado cuando no tiene condición funciona correctamente y si la pongo con condición da error cuando se da la condición.