Preguntas "para" de los operadores de bicicletas - página 10

 
WhooDoo22:

He solucionado el error de "entrada no válida" para el ejercicio de codificación que me aconsejaste. Adjunté una copia del asesor experto para su visualización personal.

La sección de la función OrderClose() de este ejercicio creo que está completa.

La sección de la función Print() de este ejercicio creo que está completa.

Todo lo que creo que queda es la tercera sección, la función OrderModify().

Gracias.

No has arreglado el problema, has trabajado alrededor de él, esto es típico cuando no se entiende el problema. Como ya dije, arregla la causa no el síntoma....

Sigues sin imprimir el número de billete del USDJPY, por favor revisa el requerimiento original.

Sus llamadas a MarketInfo() son erróneas aunque funcionen. . .

 

Simon,

La función OrderModify() se ejecuta sin error.

La función OrderPrint() se ejecuta sin error.

La función OrderClose() se ejecuta sin error.

Por favor, publique su respuesta.

Gracias.

Archivos adjuntos:
 
WhooDoo22:


Por favor, publique su respuesta.


RaptorUK:

No has solucionado el problema, has trabajado alrededor de él, esto es típico cuando no se entiende el problema. Como ya he dicho, arregla la causa no el síntoma....

Sigues sin imprimir el número de Ticket USDJPY, por favor revisa el requerimiento original.

Tus llamadas a MarketInfo() son erróneas aunque funcionen. . .

Y además . . .

si tiene la misma situación que antes, donde no hay orden de USDJPY tendrá llamadas fallidas de OrderStopLoss(), OrderTakeProfit(), OrderSelect() y OrderType()

¿Qué se supone que hace esto? ¿Qué espera de esta línea de código? Por favor, responda sin buscar su documentación.

GetLastError();

En el último bloque de código, ¿por qué quiere ejecutar esta línea de código? . . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

solo si . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

pero siempre se ejecutará esta línea de código, y todo el código que le sigue, independientemente del TP y SL ?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

Tus llamadas a MarketInfo() siguen siendo erróneas . . . mira la documentación para saber por qué.

 

Simón,


No ha solucionado el problema, ha trabajado alrededor de él...

¿Qué problema crees que no he solucionado todavía?


Todavía no está imprimiendo el número de billete USDJPY...

Número de billete de pedido.



Tus llamadas a MarketInfo() son erróneas aunque funcionen...

Ejemplo de función MarketInfo() del diccionario MetaEditor:

Muestra:

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

Aquí hay una muestra de mi bloque de código de la función OrderClose():

// OrderClose() function code block example;

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

¿Qué cree que está mal en el formato de muestra de código de mi función OrderClose()? Parece casi idéntica a la muestra 'MarketInfo()' proporcionada por el diccionario MetaEditor.


Y además...


¿Qué se supone que hace esto? ¿Qué espera de esta línea de código? Por favor, responda sin buscar su documentación.

GetLastError();

La función GetLastError() imprime un error en la página 'Expertos' mientras se ejecutan las pruebas. Si la función no encuentra ningún error, se imprime un cero (0). Fíjese en el cero impreso en la instantánea que he proporcionado arriba.


En el último bloque de código, por qué quiere ejecutar esta línea de código . . . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

solo si . . .

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

pero siempre se ejecutará esta línea de código, y todo el código que le sigue, independientemente del TP y SL ?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


Sí, me alegro de que hayas sacado este tema porque voy a explicar mi razonamiento para hacer esto.

Si se omiten todos los demás bloques de código de la ejecución del programa utilizando comentarios de varias líneas "/* - */" y los únicos dos bloques de código que quedan dentro de las funciones Start() y Return(0) son...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
   
   i++;

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

debajo del bloque de código dos es la llamada a la función

     {
      Print(OrderTicket());     
      GetLastError();
     }

La función Print() sigue imprimiendo el número en el panel de expertos indefinidamente y sigue imprimiendo. Creía que si añadía...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

la función Print() se ejecutaría sólo una vez porque una vez que se ejecutara la función OrderModify() directamente debajo de ésta, el SL y el TP dejarían de ser cero y harían que la función Print() se detuviera.

Ahora me doy cuenta de que este no es el caso debido a cómo se ejecuta un programa. Entiendo que un programa se ejecuta de arriba a abajo por lo que cuando el programa terminó su ciclo completo la primera vez trataría de ejecutarse de arriba a abajo de nuevo y fallaría al imprimir la entrada en el panel de 'Expertos' porque no hay una orden en el par de divisas USDJPY.


Gracias.

 
WhooDoo22:

Simón,


No has arreglado el problema, has trabajado alrededor de él...

¿Qué problema crees que no he solucionado todavía?

El problema subyacente que es causado por la forma en que ha codificado su bucle while... el problema que estaba causando Invalid ticket para la función OrderClose yUnknown ticket 2 para OrderModify que no has arreglado porque has abordado el síntoma.

WhooDoo22:

Tus llamadas a MarketInfo() son erróneas aunque funcionen. . .

Ejemplo de función MarketInfo() del diccionario MetaEditor:


Lo siento, mi error, has arreglado el problema... ¿sabes cuál era el problema al que me refería?

WhooDoo22:

Simon,

¿Qué se supone que hace esto? ¿Qué esperas de esta línea de código? Por favor, responde sin buscar en la documentación.

La función GetLastError() imprime un error en la página 'Experts' mientras se ejecutan las pruebas. Si la función no encuentra ningún error, se imprime un cero (0). Fíjese en el cero impreso en la instantánea que he proporcionado arriba.


No, GetLastError() no imprime en el registro . . es"La función devuelve el último error ocurrido, entonces el valor de la variable especial last_error donde se almacena el último código de error será puesto a cero. Así, la siguiente llamada a GetLastError() devolverá 0".

El 0 en su imagen es probablemente de . .

Print(OrderCloseTime());

. . . y es un error, ya que la orden ya no está seleccionada porque ya no está en el conjunto de órdenes, ya que se ha cerrado, por lo que está en el conjunto del historial. para hacer lo que usted está tratando de hacer necesitaría algo como esto. . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

. . . . agregue estas dos líneas y pruébelo.

WhooDoo22:

La función Print() sigue imprimiendo el número en el panel de expertos indefinidamente y sigue imprimiendo. Yo creía que si añadía...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

la función Print() se ejecutaría sólo una vez porque una vez que se ejecutara la función OrderModify() directamente debajo de ésta, el SL y el TP dejarían de ser cero y harían que la función Print() se detuviera.

Ahora me doy cuenta de que este no es el caso debido a cómo se ejecuta un programa. Entiendo que un programa se ejecuta de arriba a abajo por lo que cuando el programa terminó su ciclo completo la primera vez que trataría de ejecutar de arriba a abajo de nuevo y no imprimiría el billete en el panel de 'Expertos' porque no hay una orden en el par de divisas USDJPY.

Creo que no entiendes lo que quiero decir... si añado unos corchetes quizás quede más claro... ... usted hizo esto...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      }

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

... ¿quieres hacer esto?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      )
 
WhooDoo22:

Simon,

Todavía no está imprimiendo el número de billete de USDJPY...


El requisito era... "imprimir el número de billete en el registro en la forma "Número de billete para USDJPY = " "

 

Simon,


El problema subyacente causado por la forma en que has codificado tu bucle while... el problema que estaba causando el ticket inválido para la función OrderClose y el ticket desconocido 2 para OrderModify no lo has solucionado porque has abordado el síntoma.

Deseo discutir esta cuestión con usted en detalle por sí mismo, lo que me permite centrar mis pensamientos en la resolución de la cuestión sin ninguna distracción de otros puntos.


Lo siento, mi error, usted ha arreglado ese asunto ... ¿sabe usted cuál era el problema al que me refería?

Sí, gracias por plantearlo.


"La función devuelve el último error ocurrido, entonces el valor de la variable especial last_error donde se almacena el último código de error se pondrá a cero. Así, la siguiente llamada a GetLastError() devolverá 0".

El diccionario del MetaEditor dice:

int GetLastError( )
La función devuelve el último error ocurrido, entonces el valor de la variable especial last_error donde se almacena el último código de error se pondrá a cero. Así, la siguiente llamada a GetLastError() devolverá 0.

Esta función devuelve el último error ocurrido, luego el valor de la variable especial last error donde se almacena el último código de error será puesto a cero...

El verde se entiende y el amarillo no se entiende.


. . . . añade estas dos líneas y pruébalo.

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

Lo haré.


Creo que no has entendido lo que quiero decir. . . si añado unas llaves quizás quede más claro. . . usted hizo esto . . .

Creo que quise hacer esto...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

Esto es porque deseaba que la condición...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

se aplicara a la sección de código entre llaves ("{ }").


El requisito era ... "imprimir el número de billete en el registro en la forma "Número de billete para USDJPY = " "

Se puede hacer.


Gracias.

 
WhooDoo22:


"La función devuelve el último error ocurrido, entonces el valor de la variable especial last_error donde se almacena el último código de error se pondrá a cero. Así, la siguiente llamada a GetLastError() devolverá 0".

El diccionario del MetaEditor lee:

int GetLastError( )
La función devuelve el último error ocurrido, entonces el valor de la variable especial last_error donde se almacena el último código de error será puesto a cero. Así, la siguiente llamada a GetLastError() devolverá 0.

Esta función devuelve el último error ocurrido, luego el valor de la variable especial last error donde se almacena el último código de error será puesto a cero...

El verde se entiende y el amarillo no se entiende.

Bien, como puede ver en la documentación GetLastError() no imprime nada. . . sólodevuelve el número de error. . . . por lo que para usarlo hay que hacer algo con él . .

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

Cuando llama a GetLastError() devuelve el error y luego borra a cero la variable que estaba usando internamente para mantener el último error . . . así que si hizo esto . . .

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

la segunda llamada a GetLastError() devolverá 0, ya que la primera llamada puso a cero la variable que contiene el número de error. . . también tenga en cuenta que sólo se mantiene el error más reciente.

 
WhooDoo22:


Creo que no has entendido lo que quiero decir. . . si añado unos corchetes quizás quede más claro. ... usted hizo esto ...

Creo que quise hacer esto...

Esto es porque quería que la condición...

se aplicara a la sección de código entre llaves ("{ }").

Pero no lo hiciste... te lo perdiste en tu diseño, luego te lo perdiste cuando codificaste, luego te lo perdiste cuando leíste tu código y verificaste que hiciera lo que querías, luego te lo perdiste cuando lo probaste... ... las llaves son una de esas cosas fundamentales que debes conocer como la palma de tu mano.

Tienes que entender por qué se te escapó y solucionar ese problema... nadie más puede hacerlo por ti, a menos que quieras pagarles para que codifiquen por ti.

 

Simon,


El 0 de tu imagen es probablemente de... .

Print(OrderCloseTime());


No, no, no... ;)

Hagamos un viaje por el carril de la documentación, ¿de acuerdo? Jajaja.

datetime OrderCloseTime( )
Devuelve la hora de cierre del pedido actualmente seleccionado. Si el tiempo de cierre de la orden no es 0 entonces la orden seleccionada y ha sido cerrada y recuperada del historial de la cuenta. El tiempo de cierre de las órdenes abiertas y pendientes es igual a 0.

Nota: El pedido debe ser seleccionado previamente por la función OrderSelect ().


Primero, echemos un vistazo al bloque de código de la función OrderClose() que he codificado recientemente...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

A continuación, echemos un vistazo al resultado mostrado en una instantánea del panel de 'Expertos'...

Resultado del panel "Expertos".

Aaah, ¿qué tenemos aquí? :)


Por favor, publique una respuesta para el asesor experto recién adjuntado. ¿Cumple ya todos los criterios que incluía su ejercicio?


El problema subyacente causado por la forma en que ha codificado su bucle while... el problema que estaba causando la entrada inválida para la función OrderClose y la entrada desconocida 2 para OrderModify no se ha solucionado porque se ha abordado el síntoma.

Deseo discutir esta cuestión con usted en detalle por sí mismo, lo que me permite centrar mis pensamientos en la resolución de la cuestión sin ninguna distracción de otros puntos.


Gracias.

Archivos adjuntos:
Razón de la queja: