Erreurs, bugs, questions - page 1380

 
Alexander:
Quel est le numéro de la demande ?
#1302121 | 2015.09.14 18:17
Signaux : problème avec les statistiques
 

L'éternel thème des dubs =)

Je demande aux développeurs d'ajouter deux fonctionnalités standard.

Je suggère la spécification suivante :

====

Rp

La fonction renvoie la valeur à aligner sur le pas de prix de l'instrument.

double Rp(

stringsymbol_name, // nom du symbole
doublevalue// prix à aligner
) ;

Paramètres

nom_symbole

[en] Symbole.

valeur

[en] Nombre positif.

Valeur retournée

Nombre le plus proche arrondi au pas de prix de l'instrument de trading.

...

Exemple :

Valeurs d'entrée :

nom_symbole = ES-...

valeur = 2000.55

sortie = 2000,50

(échelon de prix par instrument ES = 0,25)


Valeurs d'entrée :

nom_symbole = SPX

valeur = 2000.55

sortie = 2000.63

(sur le SPX, le pas de cotation est également de 0,25, comme sur l'ES, mais il y a un décalage de base et la cotation ne peut avoir que les parties fractionnaires suivantes : 13,38,63,88).


Valeurs d'entrée :

nom_symbole = RTS

valeur = 82055,55

sortie = 82060

(pas de prix par l'instrument RTS = 10)

...et ainsi de suite.


La deuxième fonction, qui m'intéresse encore plus :

====

Rv

La fonction renvoie une valeur qui sera alignée sur le pas de volume de l'instrument et sera comprise entre SYMBOL_VOLUME_MIN et SYMBOL_VOLUME_MAX.

double Rv(

stringsymbol_name, // nom du symbole
doublevaleur// lot à aligner
) ;

Paramètres

nom_symbole

[en] Symbole.

valeur

[en] Nombre positif.

Valeur retournée

Nombre le plus proche arrondi à l'échelon de volume de l'instrument de négociation. Le nombre ne sera pas supérieur à SYMBOL_VOLUME_MAX ni inférieur à SYMBOL_VOLUME_MIN.

...

======


La principale propriété que j'attends de ces fonctions est qu'elles doivent être valables pour TOUS LES INSTRUMENTS DE TRADING DANS LE MONDE et POUR TOUTE INTRODUCTION.

Si quelqu'un a une solution toute prête, merci de la partager tant que les développeurs le font.

Étrange qu'il n'y en ait toujours pas =/

 

En résolvant le problème de votre commentaire, j'ai fait une fonction la plus bête et la plus maladroite, mais même elle échoue pour de nombreuses valeurs d'entrée.

Code de fonction :

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Возвращает кол-во значимых цифр после запятой
 вернёт 0 если число без значимой десятичной дробной части
 вернёт -1 в случае ошибки во время разбора строки на массив
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int GetDigits(double n)
{
   ushort array[];
   string st=(string)n;                                        // явным образом формируем строку из числа
   int len=StringLen(st);
   if(len<3) return(0);                                        // число не может быть дробным если строка получилась меньше трёх символов
   if(StringToShortArray(st,array)!=len+1) return(-1);         // разбираем строку на массив символов
   for(int i=0;i<len;i++) if(array[i]=='.') return(len-i-1);   // ищем в строке точку и если она есть, возвращаем кол-во символов от точки до конца строки
   return(0);
}

Le fait est que j'ai stupidement déplacé toute la difficulté de déterminer la partie significative d'un nombre fractionnaire vers la méthode que le compilateur insère à la place de l'opérateur =(string).

Mais il s'avère que de cette manière, le code formate la chaîne presque comme le type g de printf(), c'est-à-dire que pour les fractions longues, la chaîne s'imprime dans un format scientifique.

Comment puis-je obtenir la sortie dans une chaîne pour n quelconque sans format exponentiel et sans chiffres supplémentaires à droite, et sans tracas =) ?

Autre question : s'agit-il toujours d'une fraction décimale séparée par un point ou par défaut, selon les paramètres du système, d'une virgule ou d'un autre élément ?

 
Fry:

En résolvant le problème de votre commentaire, j'ai fait une fonction la plus bête et la plus maladroite, mais même elle échoue pour de nombreuses valeurs d'entrée.

Code de fonction :

Le fait est que j'ai stupidement déplacé toute la difficulté de déterminer la partie significative d'un nombre fractionnaire vers la méthode que le compilateur insère à la place de l'opérateur =(string).

Mais il s'avère que de cette manière, le code formate la chaîne presque comme le type g de printf(), c'est-à-dire que pour les fractions longues, la chaîne s'imprime dans un format scientifique.

Comment puis-je obtenir la sortie dans une chaîne pour n quelconque sans format exponentiel et sans chiffres supplémentaires à droite, et sans tracas =) ?

Autre question : s'agit-il toujours d'une fraction décimale séparée par un point ou par défaut, selon les paramètres du système, d'une virgule ou d'un autre élément ?

Pourquoi n'aimez-vous pas Point(), Digits ???
 
Vladimir Pastushak:
Et qu'est-ce que vous n'aimez pas dans Point(), Digits ???

Il faut au moins avoir DigitsLot(), qui renvoie la précision du pas de volume.

Je n'ai peut-être pas compris votre allusion. Existe-t-il un moyen raisonnable d'obtenir ce que vous recherchez via Point() ou Digits() ?


Pourtant, j'ai vraiment besoin des deux fonctions que j'ai décrites ci-dessus (égaliseurs valables pour le prix et pour le lot).

Je comprends que dans les cuisines du Forex, le volume est accepté le plus souvent par incréments de 0,01 et que personne ne se soucie de ce qui se passera demain, mais le terminal se développe.

Il y a de plus en plus d'outils. Tous les dispositifs artisanaux qui ne permettent pas les incréments de lots entiers ne fonctionnent plus. Qui dit qu'il n'y aura pas le lot minimum, disons un quart ? Il n'y a pas beaucoup de variantes.

Cette solution doit être absolue (pour toutes les valeurs), sinon on ne peut pas lui faire confiance.


Et à propos de la citation. Lorsque vous envoyez une demande, le serveur accepte les prix qui ne sont pas pairs, ne serait-ce que pour les normaliser (les couper en caractères), mais il y a d'autres tâches.

Vous êtes d'accord pour dire que nous devrions être en mesure d'obtenir un devis réel possible pour n'importe quel symbole, mais pas un devis rogné.

 
Fry:

En résolvant le problème de votre commentaire, j'ai fait une fonction la plus bête et la plus maladroite, mais même elle échoue pour de nombreuses valeurs d'entrée.

Code de fonction :

...
Je me corrige. Celui-ci semble fonctionner :
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
Возвращает кол-во значимых цифр после запятой для чисел с точностью до 8 знаков 
   Вернёт 0 если число целое (в пределах 8 знаков после запятой) 
   Вернёт -1 в случае ошибки во время разбора строки на массив
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int GetDigits(double n)
{
   ushort array[];
   if(StringToShortArray(StringFormat("%.8f",n),array)<10) return(-1); // число в строку и разбираем строку на массив символов
   int r=ArraySize(array)-2;                                           // размер массива минус ноль-терминатор и минус нулевая база указателя 
   for(;r>0 && array[r]=='0';r--);                                     // ищем справа не ноль
   for(int l=0;l<=r;l++) if(array[l]=='.') return(r-l);                // ищем слева точку и если она есть, возвращаем кол-во символов от точки до не нуля справа
   return(0);
}

Ne me prenez pas pour un imbécile qui s'obstine à faire d'un nombre une chaîne de caractères pour un problème purement mathématique.

Au début, j'ai essayé de le faire par le biais du logarithme, mais ça s'est avéré glitchy au point de non retour =(

 
Fry:
Je me corrige. Celui-ci semble fonctionner :

Ne pensez pas que je suis trop stupide pour faire une chaîne de caractères à partir d'un nombre pour un problème purement mathématique.

Au début, j'ai honnêtement essayé de le faire via le logarithme, mais ça s'est avéré glitchy comme l'enfer =(

Au cas où, pourquoi n'aimez-vous pas NormalizeDouble()_Point _Digits ? ????????

Pourquoi fabriquez-vous un vélo ?

 
Vladimir Pastushak:

Juste au cas où, quel est le problème avec NormalizeDouble() _Point _Digits ? ????????

Pourquoi créez-vous un vélo ?

Je vais répondre encore une fois à cette question, juste au cas où. Veuillez m'expliquer comment déterminer la précision de SYMBOL_VOLUME_STEP en utilisant "NormalizeDouble() _Point _Digits" ?

Ou comment obtenir une valeur multiple de SYMBOL_VOLUME_STEP à partir de n'importe quel nombre positif ?

Comment obtenir le résultat suivant :

2000.55 (symbole ES) -----> 2000.50

2000.55 (symbole SPX) -----> 2000.63

1055.5555 (symbole RTS) ------> 1060

pour tout symbole dans le monde qui est disponible dans le terminal MT5 aujourd'hui (et de préférence demain)

" ????????"

Les développeurs ne peuvent ajouter que 2 fonctions et les modifier au fur et à mesure du développement du terminal, et je ne connais pas toutes les particularités des différents instruments de trading. Où puis-je trouver les citations qui existent ? Et j'ai besoin d'une citation, pas du résultat de NormalizeDouble().

Si ce vélo est déjà en circulation - poke à une mise en œuvre spécifique, je l'apprécierais. Ce que j'ai déjà trouvé ne fonctionne pas sur certains symboles en ce moment.

 
Fry:

...

2000.55 (symbole ES) -----> 2000.50

2000.55 (symbole SPX) -----> 2000.63

1055.5555 (symbole RTS) ------> 1060

...

Veuillez montrerSYMBOL_VOLUME_STEP pour ces trois caractères.
 
Karputov Vladimir:
Veuillez montrerSYMBOL_VOLUME_STEP pour ces trois symboles.

0,01 pour ES

0,1 pour SPX

1 pour RTS.

Une fois de plus, j'ai deux tâches différentes :

La 1ère tâche consiste à égaliser le volume pour n'importe quel instrument dans le monde.

La deuxième tâche consiste à obtenir un devis pour n'importe quel instrument dans le monde à partir du numéro.

A propos de la première tâche. Je ne sais pas où trouver des informations sur les valeurs que SYMBOL_VOLUME_STEP a en principe.

Le fait que j'ai personnellement rencontré 1, 0,1 et 0,01 n'est pas un argument pour dire qu'il n'y en aura toujours qu'un. Qui dit qu'il n'y a pas, disons, 0,25 ou 0,5 ?


A propos du second problème. Je ne sais pas comment obtenir un décalage. Je n'ai rencontré qu'une seule fois un cas aussi délicat avec une offre comportant des incréments de prix de 0,13, 0,38, 0,63, 0,88. Mais où est la garantie qu'il s'agit d'une exception isolée ?

Est-il vraiment nécessaire de devenir un expert de tous les instruments du monde pour obtenir un devis exact dans le terminal d'un numéro ? Pourquoi cela devrait-il être mon problème ?