Erreurs, bugs, questions - page 1786

 
Alexey Kozitsyn:
Combien de temps ont duré les mesures ? Et qu'est-ce que cela a à voir avec la fixation des indicateurs? L'heure d'arrivée du tick actuel est 10, l'heure d'arrivée du tick précédent est 11. Il s'agit d'une erreur de la fonction qui ne renvoie pas la valeur actuelle. Vous êtes d'accord pour dire que la valeur temporelle actuelle ne peut pas être inférieure à la précédente, n'est-ce pas ?

SymbolInfoTick fonctionne différemment dans les indicateurs et dans les EAs.

Dans un indicateur, il renvoie toujours le tick qui était l'initiateur de l'appel de OnCalculate. Et ces tics initiateurs dans l'indicateur ne doivent pas être ignorés - c'est l'idéologie des développeurs. Le problème réside dans la formation de la file d'attente de ces tics.

Dans l'EA, le SymbolInfoTick dans OnTick ne renvoie pas le tick qui a initié l'appel de OnTick, mais fait une demande complète pour l'état actuel.

Mesuré dix minutes sur Si.

 
fxsaber:

SymbolInfoTick fonctionne différemment dans les indicateurs et dans les EAs.

Dans un indicateur, il renvoie toujours le tick qui a été l'initiateur de l'appel de OnCalculate. Et ces tics initiateurs dans l'indicateur ne doivent pas être ignorés - c'est l'idéologie des développeurs. Le problème réside dans la formation de la file d'attente de ces tics.

Dans le conseiller expert, SymbolInfoTick dans OnTick ne renvoie pas le tick qui a initié l'appel de OnTick, mais fait une demande complète pour l'état actuel.

Donc, la queue de tique est inclinée. En tout cas, nous devons régler le travail sur les indicateurs. Il semble que l'accent soit mis sur le test des fonctions permettant de travailler avec les Expert Advisors. C'est le premier. Deuxièmement, êtes-vous sûr que SymbolInfoTick() est une fonction synchrone ? Troisièmement, même si SymbolInfoTick() est correct, il fonctionne toujours mieux que CopyTicks(), car il renvoie souvent plus de valeurs réelles. Quoi qu'il en soit, comme je l'ai déjà dit, il y a beaucoup d'erreurs avec les ticks. Et les développeurs sont silencieux...
 
fxsaber:

Mesuré dix minutes sur Si.

C'est très peu. Mesurez pendant plusieurs heures. Sur plusieurs instruments.
 
Alexey Kozitsyn:
Troisièmement, même si SymbolInfoTick() est OK - il fonctionne toujours mieux que CopyTicks(), car il renvoie souvent des valeurs plus à jour.
J'ai rencontré des situations où CopyTicks retournait des données plus récentes que SymbolInfoTick appelé LATER. C'est pourquoi j'utilise deux fonctions à la fois et je sélectionne la tique la plus récente parmi elles.
 
fxsaber:
Attrape les situations où CopyTicks donne des données plus récentes que SymbolInfoTick appelé LATER. C'est pourquoi je fais des requêtes avec deux fonctions à la fois et je sélectionne le tick le plus récent.
J'ai fait mon test en appelant d'abord SymbolInfoTick() et seulement ensuite CopyTicks(). Dans tous les cas, pensez-vous que ce comportement est correct et que rien ne doit être changé ?
 
fxsaber:

SymbolInfoTick fonctionne différemment dans les indicateurs et dans les EAs.

Dans un indicateur, il renvoie toujours le tick qui a été l'initiateur de l'appel de OnCalculate. Et ces tics initiateurs dans l'indicateur ne doivent pas être ignorés - c'est l'idéologie des développeurs. Le problème réside dans la formation de la file d'attente de ces tics.

Dans le conseiller expert, le SymbolInfoTick dans OnTick ne renvoie pas le tick qui a initié l'appel de OnTick, mais fait une demande complète pour l'état actuel.

Il serait alors logique de le compléter par le programme

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

avec la tique qui l'a causé, surtout que ça ne coûte rien.

Et la fonction SymbolInfoTick() devrait être entièrement mise en œuvre dans les indicateurs et les conseillers experts (elle renverra les prix actuels, et non les prix au moment de l'appel deOnCalculate).

 

MT4 continue de surprendre par son imprévisibilité ;)) Qui rédige la mise en œuvre des fonctions de négociation ? MT4 build 1045

Commençons par l'info humoristique, elle devrait être envoyée à Zadornov, car il est toujours en train de parler des Américains stupides.

SYMBOLE_TRADE_TICK_VALUE

Valeur SYMBOL_TRADE_TICK_VALUE_PROFIT

double

SYMBOL_TRADE_TICK_VALUE_PROFIT

Non pris en charge

double

SYMBOLE_TRADE_TICK_VALUE_PERTE

Non pris en charge

double


En attendant, SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue) produit une valeur. BUT !!!!! Si vous lancez l'indicateur sur le graphique, il est OK au démarrage. Et si vous redémarrez le terminal, cette fonction retournera vrai et zéro tickValue au premier appel ! Alors ne vous détendez pas, M. le développeur de conseillers experts, tout doit être vérifié de vos propres mains.

//переводит котировку в цену/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);
  }

Sortie :

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 : initialisé

2017.02.07 16:08:23.002 Indicateur personnalisé ShowImportantParams EURUSD.e,M15 : chargé avec succès


 
A100:

Il serait donc logique de compléter

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

avec la tique qui l'a appelé, d'autant plus qu'il ne coûte rien

Et la fonction SymbolInfoTick() devrait être pleinement fonctionnelle dans les indicateurs et les conseillers experts (elle devrait renvoyer les prix actuels, et non les prix au moment de l'appelOnCalculate).

Il serait même logique d'ajouter le nombre de tick dans la file d'attente actuelle.
 
fxsaber:
Il est même logique d'ajouter un numéro de tic à la file d'attente actuelle.
Pourquoi avez-vous besoin d'un numéro de tique ? Il suffit d'un flux correct, qui est donné correctement et qui peut être reçu correctement.
 
fxsaber:
Il serait même logique d'ajouter le numéro du tick dans la file d'attente actuelle.

Puis j'écris directement à ServiceDesk#1666680

Veuillez envisager de modifier le fonctionnement de la fonction

bool SymbolInfoTick( string symbol, MqlTick& tick );

afin que dans les indicateurs (y compris le corps OnCalculate), il renvoie les prix actuels conformément à sa description.

tout en complétant la langue par la fonction

bool SymbolInfoTick_OnCalculate( string& symbol, MqlTick& tick ); //(*)

qui renverrait le symbole et le tick qui ont provoqué l'appel à la fonction OnCalculate

ou comme alternative (*) : vous pouvez ajouter ces paramètres à l'appel OnCalculate.

OnCalculate( ..., const string& symbol, const MqlTick& tick );
Raison: