Errori, bug, domande - pagina 1786

 
fxsaber:
Se OnCalculate è sostituito da OnTick, non si verificano errori. Il problema non è SymbolInfoTick, ma che gli indicatori non sono impostati correttamente per non saltare.
Per quanto tempo hai fatto le misurazioni? E cosa c'entra la messa a punto dell'indicatore? L'ora di arrivo del tick corrente è 10, l'ora di arrivo del tick precedente è 11. C'è un errore nella funzione che non restituisce il valore corrente. Siete d'accordo che il valore temporale attuale non può essere più piccolo del precedente, vero?
 
Alexey Kozitsyn:
Quanto tempo sono durate le misurazioni? E cosa c'entra questo con l'impostazione degli indicatori? L'ora di arrivo del tick corrente è 10, l'ora di arrivo del tick precedente è 11. Questo è un errore della funzione che non restituisce il valore corrente. Siete d'accordo che il valore temporale attuale non può essere più piccolo del precedente, vero?

SymbolInfoTick funziona diversamente negli indicatori rispetto agli EA.

In un indicatore, restituisce sempre il tick che è stato l'iniziatore della chiamata di OnCalculate. E questi tick iniziatori nell'indicatore non dovrebbero essere saltati - questa è l'ideologia degli sviluppatori. Il problema è nella formazione della coda di queste zecche.

Nell'EA, il SymbolInfoTick in OnTick non restituisce il tick che ha iniziato la chiamata di OnTick, ma fa una richiesta completa dello stato attuale.

Misurato dieci minuti su Si.

 
fxsaber:

SymbolInfoTick funziona diversamente negli indicatori rispetto agli EA.

In un indicatore, restituisce sempre il tick che è stato l'iniziatore della chiamata di OnCalculate. E questi tick iniziatori nell'indicatore non dovrebbero essere saltati - questa è l'ideologia degli sviluppatori. Il problema è nella formazione della coda di queste zecche.

In Expert Advisor, SymbolInfoTick in OnTick non restituisce il tick che ha iniziato la chiamata di OnTick, ma fa una richiesta completa dello stato attuale.

Quindi, la coda di spunta è inclinata. In ogni caso dobbiamo risolvere il lavoro in indicatori. Sembra che l'enfasi principale sia posta sui test delle funzioni per lavorare con gli Expert Advisors. Questo è il primo. Secondo, siete sicuri che SymbolInfoTick() sia una funzione sincrona? In terzo luogo, anche se SymbolInfoTick() è ok, funziona comunque meglio di CopyTicks(), perché spesso restituisce più valori reali. Comunque, come ho detto prima, ci sono molti errori con le zecche. E gli sviluppatori sono silenziosi...
 
fxsaber:

Misurato dieci minuti su Si.

È molto poco. Misurare per diverse ore. Su diversi strumenti.
 
Alexey Kozitsyn:
In terzo luogo, anche se SymbolInfoTick() è OK - funziona ancora meglio di CopyTicks(), perché spesso restituisce valori più aggiornati.
Ho beccato situazioni in cui CopyTicks restituiva dati più recenti di SymbolInfoTick chiamato LATER. Ecco perché faccio una query con due funzioni in una volta sola e seleziono il tick più recente da esse.
 
fxsaber:
Catturate situazioni in cui CopyTicks dava dati più recenti di SymbolInfoTick chiamato LATER. Ecco perché faccio una query con due funzioni contemporaneamente e seleziono la spunta più recente da esse.
Ho fatto il mio test chiamando prima SymbolInfoTick() e solo dopo ho chiamato CopyTicks(). In ogni caso, pensate che questo comportamento sia corretto e che non ci sia bisogno di cambiare nulla?
 
fxsaber:

SymbolInfoTick funziona diversamente negli indicatori rispetto agli EA.

In un indicatore, restituisce sempre il tick che è stato l'iniziatore della chiamata di OnCalculate. E questi tick iniziatori nell'indicatore non dovrebbero essere saltati - questa è l'ideologia degli sviluppatori. Il problema è nella formazione della coda di queste zecche.

In Expert Advisor, il SymbolInfoTick in OnTick non restituisce il tick che ha iniziato la chiamata di OnTick, ma fa una richiesta completa dello stato attuale.

Allora sarebbe logico completarlo con il

OnCalculate( ..., const MqlTick& tick );

con la zecca che l'ha causata, soprattutto perché non costa nulla.

E la funzione SymbolInfoTick() dovrebbe essere completamente implementata in Indicator e Expert Advisor (restituirà i prezzi correnti, non i prezzi al momento della chiamata diOnCalculate)

 

MT4 continua a stupire con l'imprevedibilità )) Chi scrive l'implementazione delle funzioni di trading? MT4 build 1045

Cominciamo con le informazioni umoristiche, dovrebbero essere inviate a Zadornov, perché sta sempre a parlare di americani stupidi.

VALORE DEL SIMBOLO_TRADE_TICK

Valore SYMBOL_TRADE_TICK_VALUE_PROFIT

doppio

SYMBOL_TRADE_TICK_VALUE_PROFITTO

Non supportato

doppio

PERDITA DI VALORE DEL SIMBOLO_TRADE_TICK

Non supportato

doppio


Nel frattempo SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue) produce un valore. MA!!!!! Se lanci l'indicatore sul grafico, è ok all'avvio. E se si riavvia il terminale, questa funzione restituirà true e zero tickValue alla prima chiamata! Quindi non si rilassi, signor sviluppatore di Expert Advisor, tutto deve essere controllato con le sue mani.

//переводит котировку в цену/1_лот в валюте депозита, например 0.00015 для EURUSD будет равно $15/лот
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
  {
   int dig=(int)MarketInfo(symbol,MODE_DIGITS);
   if(dig == 0)
      return(false); // symbol is none
   double tickSize = MarketInfo(symbol, MODE_TICKSIZE);   // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
   //double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
   double tickValue;
   if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
      Print(__FUNCTION__, "  SymbolInfoDouble(...) returns false"); // всегда возвращается true!!
   Print("tickSize= ", tickSize, "  tickValue= ", tickValue);
   if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль...
      return false;
   double price=diff/(tickSize/tickValue); // а то завалимся c  tickValue == 0
   price4lot=NormalizeDouble(price,2);
   return (true);
  }

Uscire:

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0

2017.02.07 16:08:24.515 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: inizializzato

2017.02.07 16:08:23.002 Indicatore personalizzato ShowImportantParams EURUSD.e,M15: caricato con successo


 
A100:

Allora sarebbe logico integrare

OnCalculate( ..., const MqlTick& tick );

con la zecca che ha chiamato, soprattutto perché non costa nulla

E la funzione SymbolInfoTick() dovrebbe essere pienamente funzionale in Indicator e Expert Advisor (restituisce i prezzi correnti, non i prezzi al momento della chiamataOnCalculate)

Sarebbe anche logico aggiungere il numero di tick nella coda attuale.
 
fxsaber:
Ha anche senso aggiungere un numero di tick alla coda attuale.
Perché avete bisogno di un numero di tick? Avete solo bisogno di un flusso corretto, che sia dato correttamente e che possa essere ricevuto correttamente.