Erreurs, bugs, questions - page 2101

 

quelle mise à jour est arrivée, 1736, qu'est-ce qu'elle contient, où puis-je la lire ?

 

Je propose de donner la possibilité de déterminer par programme quel indicateur tampon est dessiné sur le graphique.

Supposons qu'un trader crée ses propres indicateurs, nous ne savons pas combien de tampons sont utilisés pour le calcul et combien sont utilisés pour dessiner l'indicateur sur le graphique.

Traiter les indicateurs personnalisés par

intChartIndicatorGet(
longchart_id,// identifiant du graphique
intsub_window// numéro de la sous-fenêtre
const string indicator_shortname // nom court de l'indicateur
) ;


Nous pouvons également demander le tableau des tampons de dessin

intChartIndicatorGet(
longchart_id,// identifiant du graphique
intsub_window//numéro de la fenêtre
const string indicator_shortname // nom court de l'indicateur

int & IndicatorVisualBuffer[] // numéros des tampons de dessin... ) ;


Cela permettra d'étendre la possibilité de travailler avec des indicateurs inconnus installés sur le graphique...

 
Vladimir Pastushak:

Je propose de donner la possibilité de déterminer par programme quel indicateur tampon est dessiné sur le graphique.

Supposons qu'un trader lance ses indicateurs, nous ne savons pas combien de tampons sont utilisés pour calculer et combien sont utilisés pour dessiner l'indicateur sur le graphique.

Adressage à l'indicateur via

intChartIndicatorGet(
longchart_id,// ID du graphique
intsub_window// numéro de la sous-fenêtre
const string indicator_shortname // nom court de l'indicateur
) ;


Nous pouvons également demander le tableau des tampons de dessin

intChartIndicatorGet(
longchart_id,// identifiant du graphique
intsub_window//numéro de la fenêtre
const string indicator_shortname // nom court de l'indicateur

int & IndicatorVisualBuffer[] // numéros des tampons de dessin... ) ;


Cela augmentera la possibilité de travailler avec des indicateurs inconnus installés dans le graphique...

Qu'est-ce que ça rapporte ?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

et quelle sera l'utilité de l'ajouter ? Vous voulez ajouter un paramètre d'entrée et recevoir le même manche d'indicateur en réponse...

Et si ça ne vous dérange pas, dans quel but en avez-vous besoin ? Je ne suis pas ironique. Après tout, si quelque chose est suggéré, vous devriez, à mon avis, donner un argument convaincant de la nécessité de la suggestion.

 
Alexey Viktorov:

Que retourne-t-il ?

et à quoi cela servirait-il de l'ajouter ? Vous proposez d'ajouter un paramètre d'entrée et d'obtenir le même manche d'indicateur en réponse...

Et si ce n'est pas difficile, dans quel but une telle nécessité est-elle apparue ? La question est sans ironie. Après tout, si l'on offre quelque chose, il est nécessaire, à mon avis, de donner des arguments convaincants en faveur de la nécessité de l'offre.


L'utilisateur met n'importe quel indicateur.

Le conseiller expert le trouve automatiquement et utilise les données tampons pour recevoir le signal.


Maintenant nous devons utiliser iCustom et si nous pouvons ajouter une liste de paramètres, voici le problème avec les tampons....

Il est possible de compter la quantité de tampons par le biais de Copy, mais pour comprendre lequel il est impossible ...

 
Vladimir Pastushak:

L'utilisateur place n'importe quel indicateur.

Le conseiller expert le trouve automatiquement et utilise les données tampons pour obtenir le signal.


Maintenant, nous devons utiliser iCustom et si nous pouvons écrire la liste des paramètres, voici le problème avec les tampons.....

Il est possible de compter la quantité de tampons en utilisant Copy de manière programmatique, mais il est impossible de comprendre lequel d'entre eux dessine ...

Pourquoi est-ce impossible ? Le tampon INDICATOR_CALCULATIONS peut-il être retiré par iCustom() ?

C'est une question intéressante, mais ce n'est pas le moment d'en discuter dans ce fil. Personnellement, je doute qu'elle puisse améliorer ou simplifier d'une manière ou d'une autre le travail du programmeur. Les indicateurs sont trop différents et les conditions de leur application sont trop différentes. Ensuite, nous devrons demander à pouvoir déterminer le type de tracé graphique et d'autres choses encore, et nos demandes internes feront boule de neige.

 
Alexey Viktorov:

Pourquoi n'est-ce pas possible ? Le tampon INDICATOR_CALCULATIONS peut-il être atteint par iCustom() ?

La question est intéressante, mais ce n'est pas le moment d'en discuter dans ce fil. Personnellement, je doute qu'il puisse améliorer ou faciliter le travail du programmeur. Il y a trop d'indicateurs différents et trop de conditions différentes pour leur application. Ensuite, nous devrons demander à pouvoir déterminer le type de tracé graphique et d'autres choses encore, et nos demandes internes feront boule de neige.


Théoriquement, ce qui est écrit dans l'indicateur par défaut, je ne parle pas du code du programmeur, devrait être disponible de l'extérieur ... Les tampons ont leur nombre, leur type de tracé, leur couleur et d'autres standards ...

 

C'est le problème que j'ai rencontré :

J'ai décidé d'utiliser comme magie le reste de la division de ChartID par 1000 ou 10000, cela n'a pas vraiment d'importance.

Mais pour une raison quelconque, avec des ChartID() différents, le reste de la division est soudainement le même. Question : pourquoi ?

Vérification du script

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

Résultat

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

Je m'attendais à voir 74907 et 74908 respectivement, car le reste de la division devrait être le même.


J'attends également une réponse à cette question.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Alexey Viktorov, 2018.01.09 14:21

Dans le testeur MT5, l'objet OBJ_EDIT "Input field" ne permet pas d'éditer une valeur. Est-ce la façon dont il est conçu ou est-ce un bug ?

Dans les terminaux et dans le testeur MT4, il est modifiable, mais dans le testeur MT5, il ne veut pas l'être, la valeur saisie par programme lors de la création de l'objet disparaît complètement.


 
Alexey Viktorov:

Mais pour une raison quelconque, un ChartID() différent produit soudainement le même résidu de division. Question : pourquoi ?

Parce que l'entrée fmod est double. Double ne peut pas stocker un grand nombre d'entiers. Par exemple, voici votre cas :

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

Faites-le.

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


En prenant l'exemple de float, vous pouvez rapidement comprendre la particularité de double

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


Résultat

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


SZY double ne perd pas l'information de l'ensemble de la gamme intérieure, ce qui n'est pas le cas avec long.

 
fxsaber:

Parce que l'entrée fmod est double. Double ne peut pas stocker un grand nombre d'entiers. Par exemple, votre affaire :

Faites-le.

Bien sûr, je vais vérifier cet échantillon maintenant mais j'avais aussi un code de vérification comme celui-ci

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

le résultat est

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

Il indique qu'il ne doit pas y avoir de troncature de la valeur.


Mais ici, j'ai vérifié cette variante et j'ai légèrement modifié la proposition.

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

et j'ai obtenu la variante attendue.

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

Une autre question apparaît,

Si MathMod ainsi que fmodrenvoie le reste réel après la division de deux nombres. Et % selon la documentation

Le reste des minutes = temps % 60;


pourquoi y a-t-il une différence ?
 
Alexey Viktorov:

pourquoi cette différence ?

La réponse est la même.