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).
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).
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.
class tick{
public:
MqlTick data; //новые тиковые данныеbool refresh(); //метод обновления тиковых данных с проверкой на поступление новых данныхvoid write(); //запись тиковых данных в файл
.........
void tick::write(void){
if (file_handle>0)FileWrite(file_handle,data.bid);
}
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
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);
elsePrint("Не удалось записать данные в файл. Ошибка ",GetLastError());
}
Tick tick;
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---if(tick.refresh()) tick.write();
}
//+------------------------------------------------------------------+
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
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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).
Questo codice non fa scattare il timer
Ma questo lo fa.
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).
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)?
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:
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
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));
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):
È 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