Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 30

 
spoiltboy:

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 debe ser seleccionada a través de OrderSelect, su valorticketD se pierde, y lo más probable es que en lugar de ticket, alguna mierda, tratar de imprimir, y comparar. Y en general, este estilo de escritura es un disparate
 
Vitaly Muzichenko:
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.

 
Vitaly Muzichenko:
Y en general, este estilo de escritura es un disparate.
Acabo de empezar, agradeceré los comentarios.
 
spoiltboy:
Apenas estoy empezando, agradeceré los comentarios.
pega el código con "SRC" para que puedas mirarlo
 
Renat Akhtyamov:
insertar el código a través de "SRC" para que pueda ver
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
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);}
 
spoiltboy:

¿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.

Deberíamos comprobar la existencia de la orden, y si hay una con ese ticket, la eliminamos; si no la hay, no hacemos nada. Lo que ocurre es que el pedido ya está borrado, y lo vuelves a borrar
 
Vitaly Muzichenko:
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?

 
spoiltboy:

pero ¿es el fondo de los dos por casualidad redundante?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
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.

 
spoiltboy:

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?

 
Renat Akhtyamov:

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.