Errori, bug, domande - pagina 195

 
Interesting:
Molto probabilmente lo sono. Anche io ho metà del mio codice legato a un timer, ora devo aspettare una nuova build o inventarmi delle stampelle :(

Esattamente, ho appena cambiato OnTimer in OnTick e tutto è andato come prima, ma l'ottimizzazione per core viene eseguita una per una, non simultaneamente. Mi sembra che gli sviluppatori correggano rapidamente questi errori evidenti (spero).

 
Interesting:

Questo codice non fa scattare il timer

Ma questo lo fa.

Non ha funzionato nel mio caso.
 
Erm955:

Esattamente, ho appena cambiato OnTimer in OnTick e tutto è andato come prima, ma l'ottimizzazione per core viene eseguita una per una, non simultaneamente. Mi sembra che gli sviluppatori correggano rapidamente questi errori evidenti (spero).

Ho anche pensato che i bug evidenti (lavoro di tester) sugli eventi personalizzati sarebbero stati risolti rapidamente. Devo ancora usare le stampelle... :(
Valmars:
Nel mio caso, non ha aiutato.

Ci devono essere delle particolarità.

Ho provato su Win 2003 Server SP2 x32 (AMD 2600+, un core). E posso dire che è stato fatto su un Expert Advisor "vuoto". Sono state aggiunte solo due variabili e un paio di funzioni (quelle che definiscono lo stato del timer e la cattura del primo avvio).

 

Dove è andato il codice 10005 e cosa significa?

Qualcosa tra un requote (10004) e una "richiesta rifiutata" (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)
 

Nella discussione Championship 2010 https://championship.mql5.com/2010/ru/users/capr, un partecipante ha postato il suo codice EA. Ho provato a compilarlo (build 355). I risultati della compilazione mostrano diversi avvertimenti. Sono interessato al seguente frammento. C'è un tale frammento nel codice:

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;
     }
//---
  }

Di due costruzioni dello stesso tipo if(ticket= ... il compilatore genera l'avvertimento "l'espressione non è booleana" solo per l'ultimo (cioè "maschera" un avvertimento precedente simile). Se si commenta l'istruzione if nell'avvertimento (allo scopo di controllare il compilatore!), l'avvertimento viene generato per un costrutto simile che non è stato cambiato ma era assente nel protocollo durante la compilazione precedente.

È una caratteristica o un bug?

 

Errori, MetaTrader 5 MQL, Aperto, Iniziato: 2010.11.06 11:32, #25823

Dammi una risposta

 

Non so se dovrebbe essere così, ma quando si scrive su un file

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

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

A volte ricevo prezzi non normalizzati:

81.42
81.41
81.41
81.40000000000001
81.40000000000001
81.40000000000001
81.40000000000001
81.41
81.40000000000001
81.41
81.41

Perché?

e per qualche ragione non poteva scrivere su file usando FileWriteStruct( file_handle,data, sizeof(data));

 
Tutto sembra essere chiaro riguardo al prezzo non normalizzato: non l'ho visto per i grandi eventi (finora), per i cross - per alcuni eventi raramente, e per altri più spesso - significa che il terminale mi dà tali dati
 
IgorM:

e per qualche motivo non poteva scrivere sul file usando FileWriteStruct( file_handle,data, sizeof(data));

Ho bisogno di scrivere in un file binario - https://www.mql5.com/ru/docs/files/filewritearray

FileWriteArray

Scrive array di qualsiasi tipo in un file di tipo BIN, eccetto gli array di stringhe (può essere un array di strutture non contenenti stringhe e array dinamici).

intFileWriteArray(
intfile_handle,/maniglia del file
voidarray[],// array
intstart_item=0,// indice iniziale nell'array
intitems_count=WHOLE_ARRAY// numero di elementi
);

Per esempio (il codice dovrebbe essere aggiornato per evitare di sovrascrivere i record esistenti):

//+------------------------------------------------------------------+
//|                                         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:

È necessario scrivere su un file binario - https://www.mql5.com/ru/docs/files/filewritearray

Per esempio (il codice deve essere migliorato, in modo che non sovrascriva i record già esistenti):

OK, grazie mille, stavo solo scrivendo su un file di testo per fare dei test, stavo cominciando a dubitare di come MqlTick sia essenzialmente una struttura :)

ZS: non male - praticamente ho ripristinato la mia classe e il mio codice ;) - Mi dispiace che tu non voglia creare i tuoi grafici offline in MT5 - sto scrivendo per MT4+MT5, sono diventato dipendente dai timeframe non standard

File: