Erros, bugs, perguntas - página 195

 
Interesting:
O mais provável é que o sejam. Eu também tenho metade do meu código ligado a um temporizador, agora tenho de esperar por uma nova construção ou inventar muletas :(

Exactamente, apenas mudou o OnTimer para OnTick e tudo correu como antes, mas a optimização por núcleos é realizada um a um, não simultaneamente. Parece-me que os criadores irão corrigir tais erros óbvios rapidamente (espero).

 
Interesting:

Este código não activa o temporizador

Mas esta tem.

Não funcionou no meu caso.
 
Erm955:

Exactamente, apenas mudou o OnTimer para OnTick e tudo correu como antes, mas a optimização por núcleos é realizada um a um, não simultaneamente. Parece-me que os criadores irão corrigir tais erros óbvios rapidamente (espero).

Também pensei que os erros óbvios (trabalho de teste) em eventos personalizados seriam corrigidos rapidamente. Ainda têm de usar muletas... :(
Valmars:
No meu caso, não ajudou.

Deve haver algumas peculiaridades.

Experimentei-o no Win 2003 Server SP2 x32 (AMD 2600+, um núcleo). E posso dizer que foi feito com um Expert Advisor "vazio". Apenas duas variáveis e um par de funções foram adicionadas (as que definem o estado do temporizador e apanham o primeiro arranque).

 

Para onde foi o código 10005 e o que é que ele significa ?

Algo entre um requote (10004) e "pedido rejeitado" (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)
 

Na discussão do Campeonato 2010 https://championship.mql5.com/2010/ru/users/capr, um participante afixou o seu código EA. Tentei compilá-lo (construir 355). Os resultados da compilação mostram vários avisos. Estou interessado no seguinte fragmento. Existe um fragmento deste tipo no 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 duas construções do mesmo tipo se(ticket= ... o compilador gera o aviso "não é booleano" apenas para o último (ou seja, "mascara" um aviso anterior semelhante). Se comentar a declaração if no aviso (para efeitos de verificação do compilador!), o aviso é gerado para uma construção semelhante que não foi alterada mas que estava ausente no protocolo durante a compilação anterior.

Isto é uma característica ou um bug?

 

Erros, MetaTrader 5 MQL, Aberto, Iniciado: 2010.11.06 11:32, #25823

Dê-me uma resposta

 

Não sei se é suposto ser assim, mas ao escrever para um ficheiro

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

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

Por vezes recebo preços não-normalizados:

81.42
81.41
81.41
81.40000000000001
81.40000000000001
81.40000000000001
81.40000000000001
81.41
81.40000000000001
81.41
81.41

porquê?

e por alguma razão não podia escrever para ficheiro usando FileWriteStruct( file_handle,data, sizeof(data));

 
Tudo parece estar claro sobre o preço não normalizado: não o vi para grandes eventos (até agora), para cruzes - para alguns eventos raramente, e para outros mais frequentemente - significa que o terminal me dá esses dados
 
IgorM:

e por alguma razão não podia escrever no ficheiro utilizando FileWriteStruct( file_handle,data, sizeof(data));

Preciso de escrever para um ficheiro binário - https://www.mql5.com/ru/docs/files/filewritearray

FileWriteArray

Escreve arrays de qualquer tipo num ficheiro do tipo BIN, excepto para arrays de cordas (pode ser um conjunto de estruturas que não contenham cordas e arrays dinâmicos).

intFileWriteArray(
intfile_handle,// manípulo do ficheiro
matriz vazia[],// matriz
intstart_item=0,// índice inicial na matriz
intitems_count=WHOLE_ARRAY// número de elementos
);

Por exemplo (o código deve ser actualizado para evitar a sobre-escrita de registos 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:

Precisa de escrever para um ficheiro binário - https://www.mql5.com/ru/docs/files/filewritearray

Por exemplo (o código precisa de ser melhorado, para não sobrescrever registos já existentes):

OK, muito obrigado, estava apenas a escrever para um ficheiro de texto para teste, estava a começar a duvidar como o MqlTick é essencialmente uma estrutura :)

ZS: nada mau - basicamente restaurou a minha classe e o meu código ;) - lamento, que não queira criar os seus próprios gráficos offline em MT5 - estou a escrever para MT4+MT5, fiquei viciado em TF não normalizada

Arquivos anexados: