Errores, fallos, preguntas - página 195

 
Interesting:
Lo más probable es que lo sean. Yo también tengo la mitad de mi código atado a un temporizador, ahora tengo que esperar a una nueva compilación o salir con muletas :(

Exacto, acabo de cambiar OnTimer por OnTick y todo ha ido como antes, pero la optimización por núcleos se realiza uno a uno, no simultáneamente. Me parece que los desarrolladores corregirán rápidamente (espero) estos errores tan evidentes.

 
Interesting:

Este código no activa el temporizador

Pero éste sí.

En mi caso no funcionó.
 
Erm955:

Exacto, acabo de cambiar OnTimer por OnTick y todo ha ido como antes, pero la optimización por núcleos se realiza uno a uno, no simultáneamente. Me parece que los desarrolladores corregirán rápidamente (espero) estos errores tan evidentes.

También pensé que los errores obvios (trabajo de los probadores) en los eventos personalizados se arreglarían rápidamente. Todavía tengo que usar muletas... :(
Valmars:
En mi caso, no sirvió de nada.

Debe haber algunas peculiaridades.

Lo he probado en Win 2003 Server SP2 x32 (AMD 2600+, un núcleo). Y puedo decir que se hizo en un Asesor Experto "vacío". Sólo se han añadido dos variables y un par de funciones (las que definen el estado del temporizador y la captura del primer arranque).

 

¿Dónde ha ido el código 10005 y qué significa?

¿Algo entre una recotización (10004) y una "solicitud rechazada" (10006)?

2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   CTrade::PositionOpen: instant sell 0.10 #IBM at 145.38 [unknown retcode 10005]
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   prices for #IBM 0.10 (145.38 / 145.41 / 145.38)
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   CTrade::PositionOpen: instant buy 0.10 #IBM at 145.41 [unknown retcode 10005]
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   prices for #IBM 0.10 (145.38 / 145.41 / 145.38)
 

En la discusión del Campeonato 2010 https://championship.mql5.com/2010/ru/users/capr, un participante publicó su código EA. He intentado compilarlo (build 355). Los resultados de la compilación muestran varias advertencias. Me interesa el siguiente fragmento. Hay un fragmento de este tipo en el código:

void CountOrderStop(string symbol)
  {
   datetime from=0;
   datetime to=TimeCurrent();
//--- запросить всю историю
   HistorySelect(from,to);
//--- переменные для получения значений из свойств ордера
   ulong    ticket;
   double   open_price;
   double   initial_volume;
   datetime time_setup;
//   string   symbol;
   string   type;
   long     order_magic;
   count_sell_stop=0;
   count_buy_stop=0;

//--- количество текущих отложенных ордеров
   uint     total=OrdersTotal();
//--- пройдем в цикле по всем ордерам
   for(uint i=0;i<total;i++)
     {
      //--- получим тикет ордера по его позиции в списке
      if(ticket=OrderGetTicket(i) && (GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy stop limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy stop" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy limit") && OrderGetString(ORDER_SYMBOL)==symbol)
        {
         //--- получим свойства ордера
         open_price=       OrderGetDouble(ORDER_PRICE_OPEN);
         time_setup=       OrderGetInteger(ORDER_TIME_SETUP);
         symbol=           OrderGetString(ORDER_SYMBOL);
         order_magic=      OrderGetInteger(ORDER_MAGIC);
         int positionID =  OrderGetInteger(ORDER_POSITION_ID);
         initial_volume=   OrderGetDouble(ORDER_VOLUME_INITIAL);
         type=GetOrderType(OrderGetInteger(ORDER_TYPE));
         count_buy_stop=count_buy_stop+1;
        }
      if(ticket=OrderGetTicket(i) && (GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell stop limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell stop") && OrderGetString(ORDER_SYMBOL)==symbol)
        {
         //--- получим свойства ордера
         open_price=       OrderGetDouble(ORDER_PRICE_OPEN);
         time_setup=       OrderGetInteger(ORDER_TIME_SETUP);
         symbol=           OrderGetString(ORDER_SYMBOL);
         order_magic=      OrderGetInteger(ORDER_MAGIC);
         int positionID =  OrderGetInteger(ORDER_POSITION_ID);
         initial_volume=   OrderGetDouble(ORDER_VOLUME_INITIAL);
         type=GetOrderType(OrderGetInteger(ORDER_TYPE));
         count_sell_stop=count_sell_stop+1;
        }
        count_order = count_buy_stop + count_sell_stop;
     }
//---
  }

De dos construcciones del mismo tipo if(ticket= ... el compilador genera la advertencia "la expresión no es booleana" sólo para la última (es decir, "enmascara" una advertencia anterior similar). Si se comenta la sentencia if en la advertencia (¡para comprobar el compilador!), la advertencia se genera para una construcción similar que no ha sido cambiada pero que estaba ausente en el protocolo durante la compilación anterior.

¿Es una característica o un error?

 

Errores, MetaTrader 5 MQL, Abierto, Iniciado: 2010.11.06 11:32, #25823

Dame una respuesta

 

No sé si se supone que es así, pero al escribir en un archivo

class tick{
   public:
      MqlTick  data;             //новые тиковые данные
      bool     refresh();        //метод обновления тиковых данных с проверкой на поступление новых данных
      void     write();          //запись тиковых данных в файл
.........

void tick::write(void){
   if (file_handle>0)FileWrite(file_handle,data.bid);
}

A veces recibo precios no normalizados:

81.42
81.41
81.41
81.40000000000001
81.40000000000001
81.40000000000001
81.40000000000001
81.41
81.40000000000001
81.41
81.41

¿Por qué?

y por alguna razón no podía escribir en el archivo usando FileWriteStruct( file_handle,data, sizeof(data));

 
Todo parece estar claro en cuanto al precio no normalizado: no lo he visto para eventos importantes (hasta ahora), para los cruces -para algunos eventos raramente, y para otros más a menudo- significa que el terminal me da esos datos
 
IgorM:

y por alguna razón no pudo escribir en el archivo usando FileWriteStruct( file_handle,data, sizeof(data));

Necesito escribir en un archivo binario - https://www.mql5.com/ru/docs/files/filewritearray

FileWriteArray

Escribe matrices de cualquier tipo en un archivo de tipo BIN, excepto matrices de cadenas (puede ser una matriz de estructuras que no contengan cadenas y matrices dinámicas).

intFileWriteArray(
intfile_handle,//manejador de archivo
voidarray[],// array
intstart_item=0,// índice inicial en el array
intitems_count=WHOLE_ARRAY// número de elementos
);

Por ejemplo (el código debe ser actualizado para evitar sobrescribir los registros existentes):

//+------------------------------------------------------------------+
//|                                         Test_FileWriteStruct.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Tick
  {
private:
   int               m_file_handle;


public:
   MqlTick           data;             //новые тиковые данные
   void Tick(){m_file_handle=FileOpen("tickrecords.dat",FILE_READ|FILE_WRITE|FILE_BIN);};
   void ~Tick(){if(m_file_handle!=INVALID_HANDLE) FileClose(m_file_handle);};
   bool              refresh();        //метод обновления тиковых данных с проверкой на поступление новых данных
   void              write();          //запись тиковых данных в файл

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Tick::refresh(void)
  {
   bool res=SymbolInfoTick(Symbol(),data);
   if(!res) Print("Неудачный вызов SymbolInfoTick(), ошибка ",GetLastError());
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Tick::write(void)
  {
   if(m_file_handle!=INVALID_HANDLE)FileWriteStruct(m_file_handle,data,size);
   else Print("Не удалось записать данные в файл. Ошибка ",GetLastError());
  }

Tick tick;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(tick.refresh()) tick.write();

  }
//+------------------------------------------------------------------+

 

Документация по MQL5: Файловые операции / FileWriteArray
Документация по MQL5: Файловые операции / FileWriteArray
  • www.mql5.com
Файловые операции / FileWriteArray - Документация по MQL5
 
Rosh:

Necesita escribir en un archivo binario - https://www.mql5.com/ru/docs/files/filewritearray

Por ejemplo (hay que mejorar el código para que no sobrescriba los registros ya existentes):

OK, muchas gracias, sólo estaba escribiendo en un archivo de texto para hacer pruebas, estaba empezando a dudar de cómo MqlTick es esencialmente una estructura :)

ZS: no está mal - básicamente restauré mi clase y mi código ;) - Siento que no quieras crear tus propios gráficos offline en MT5 - estoy escribiendo para MT4+MT5, me he vuelto adicto a los TF no estándar

Archivos adjuntos: