Fehler, Irrtümer, Fragen - Seite 1380

 
Sergey Zhukov:
Der Antrag wurde erstellt, aber seit mehr als drei Tagen hat sich niemand mehr darum gekümmert.
Wie lautet die Antragsnummer?
 
Alexander:
Wie lautet die Antragsnummer?
#1302121 | 2015.09.14 18:17
Signale: Problem mit der Statistik
 

Das immerwährende Thema der Dubs =)

Ich fordere die Entwickler auf, zwei Standardfunktionen hinzuzufügen.

Ich schlage die folgende Spezifikation vor:

====

Rp

Die Funktion gibt den Wert zurück, der an die Kursstufe des Instruments angepasst werden soll.

double Rp(

stringsymbol_name, // Name des Symbols
doublewert// Preis zum Angleichen
);

Parameter

symbol_name

[in] Symbol.

Wert

[in] Positive Zahl.

Zurückgegebener Wert

Nächste Zahl, gerundet auf die Preisstufe des Handelsinstruments.

...

Beispiel:

Werte eingeben:

symbol_name = ES-...

Wert = 2000,55

Leistung = 2000,50

(Preisschritt nach Instrument ES = 0,25)


Werte eingeben:

symbol_name = SPX

Wert = 2000,55

Leistung = 2000,63

(beim SPX beträgt die Kursstufe ebenfalls 0,25, wie beim ES, aber es gibt einen Basis-Offset und die Notierung kann nur die folgenden Bruchteile haben - 13,38,63,88)


Werte eingeben:

symbol_name = RTS

Wert = 82055,55

Ausgang = 82060

(Kurssprung des RTS-Instruments = 10)

...und so weiter.


Die zweite Funktion, die mich noch mehr interessiert:

====

Rv

Die Funktion gibt einen Wert zurück, der auf die Lautstärkestufe des Instruments abgestimmt ist und im Bereich von SYMBOL_VOLUME_MIN bis SYMBOL_VOLUME_MAX liegt.

double Rv(

stringsymbol_name, // Name des Symbols
doubleWert// auszurichtende Partie
);

Parameter

symbol_name

[in] Symbol.

Wert

[in] Positive Zahl.

Zurückgegebener Wert

Die nächste Zahl, aufgerundet auf den Volumenschritt desHandelsinstruments. Die Zahl wird nicht größer als SYMBOL_VOLUME_MAX oder kleiner als SYMBOL_VOLUME_MIN sein.

...

======


Die wichtigste Eigenschaft, die ich von diesen Funktionen erwarte, ist, dass sie für ALLE HANDELSINSTRUMENTE DER WELT und für JEDE EINFÜHRUNG gültig sein sollten.

Wenn jemand eine fertige Lösung hat, bitte teilen, solange die Entwickler tun.

Seltsam, dass es immer noch keine solche gibt =/

 

Um das Problem aus Ihrem Kommentar zu lösen, habe ich eine dümmste und unbeholfenste Funktion erstellt, aber auch sie schlägt bei vielen Eingabewerten fehl.

Funktionscode:

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Возвращает кол-во значимых цифр после запятой
 вернёт 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);
}

Der Punkt ist, dass ich dummerweise die ganze Mühe der Bestimmung des signifikanten Teils der Bruchzahl auf die Methode verlagert habe, die der Compiler anstelle des Operators =(string) einfügt.

Es stellt sich jedoch heraus, dass der Code auf diese Weise die Zeichenkette fast wie der g-Typ von printf() formatiert, d.h. bei langen Brüchen wird die Zeichenkette in einem wissenschaftlichen Format ausgegeben.

Wie kann ich die Ausgabe in eine Zeichenkette für ein beliebiges n ohne exponentielles Format und ohne zusätzliche Ziffern auf der rechten Seite, und ohne Ärger =) bekommen?

Und noch eine Frage: Ist es immer ein Dezimalbruch, der durch einen Punkt getrennt ist, oder kann es standardmäßig in den Systemeinstellungen ein Komma oder etwas anderes sein?

 
Fry:

Um das Problem aus Ihrem Kommentar zu lösen, habe ich eine dümmste und unbeholfenste Funktion erstellt, aber auch sie schlägt bei vielen Eingabewerten fehl.

Funktionscode:

Der Punkt ist, dass ich dummerweise die ganze Mühe der Bestimmung des signifikanten Teils der Bruchzahl auf die Methode verlagert habe, die der Compiler anstelle des Operators =(string) einfügt.

Es stellt sich jedoch heraus, dass der Code auf diese Weise die Zeichenkette fast wie der g-Typ von printf() formatiert, d.h. bei langen Brüchen wird die Zeichenkette in einem wissenschaftlichen Format ausgegeben.

Wie kann ich die Ausgabe in eine Zeichenkette für ein beliebiges n ohne exponentielles Format und ohne zusätzliche Ziffern auf der rechten Seite, und ohne Ärger =) bekommen?

Und noch eine Frage: Ist es immer ein Dezimalbruch, der durch einen Punkt getrennt ist, oder kann es standardmäßig in den Systemeinstellungen ein Komma oder etwas anderes sein?

Warum magst du Point(), Digits() nicht?
 
Vladimir Pastushak:
Und was gefällt Ihnen nicht an Point(), Digits???

Zumindest gibt es DigitsLot(), das die Genauigkeit des Volumenschritts zurückgibt.

Vielleicht habe ich Ihren Hinweis nicht verstanden. Gibt es eine sinnvolle Möglichkeit, das Gesuchte über Point() oder Digits() zu erhalten?


Dennoch, wirklich brauchen diese beiden Funktionen, die ich oben beschrieben (gültig Equalizer für Preis und für die Menge).

Ich verstehe, dass in den Forex-Küchen das Volumen meist in 0,01-Schritten akzeptiert wird, und niemand kümmert sich darum, was morgen passieren wird, aber das Terminal entwickelt sich.

Es gibt immer mehr Werkzeuge. Alle selbstgebauten Geräte, die nicht die ganze Menge an Schritten erlauben, funktionieren nicht mehr. Wer sagt denn, dass es nicht eine Mindestmenge von, sagen wir, einem Viertel geben wird? Es gibt nicht viele Varianten.

Diese Lösung muss absolut sein (für alle Werte), sonst kann man ihr nicht trauen.


Und über das Zitat. Wenn Sie eine Anfrage senden, akzeptiert der Server Preise, die nicht gerade sind, wenn auch nur, um sie zu normalisieren (schneiden sie in Zeichen), aber es gibt andere Aufgaben.

Sie stimmen zu, dass wir in der Lage sein sollten, ein realistisches Angebot für ein beliebiges Symbol zu erhalten, nicht aber ein getrimmtes.

 
Fry:

Um das Problem aus Ihrem Kommentar zu lösen, habe ich eine dümmste und unbeholfenste Funktion erstellt, aber auch sie schlägt bei vielen Eingabewerten fehl.

Funktionscode:

...
Ich korrigiere mich. Dies scheint zu funktionieren:
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
Возвращает кол-во значимых цифр после запятой для чисел с точностью до 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);
}

Halten Sie mich nicht für einen Dummkopf, der wegen eines rein mathematischen Problems so hartnäckig aus einer Zahl eine Kette macht.

Zuerst habe ich versucht, es über den Logarithmus zu machen, aber es stellte sich als fehlerhaft heraus, so dass es kein Zurück mehr gab =(

 
Fry:
Ich korrigiere mich. Diese scheint zu funktionieren:

Halten Sie mich nicht für zu dumm, um aus einer Zahl eine Zeichenkette für ein rein mathematisches Problem zu machen.

Zuerst habe ich ehrlich gesagt versucht, es über den Logarithmus zu machen, aber es hat sich als verdammt schwierig herausgestellt =(

Nur für den Fall, warum magst du nicht NormalizeDouble()_Point _Digits ?????????

Warum bauen Sie ein Fahrrad?

 
Vladimir Pastushak:

Nur für den Fall, was ist falsch mit NormalizeDouble() _Point _Digits ?????????

Warum bauen Sie ein Fahrrad?

Ich werde diese Frage noch einmal beantworten, nur für den Fall. Bitte erklären Sie mir, wie ich die Genauigkeit von SYMBOL_VOLUME_STEP mit "NormalizeDouble() _Point _Digits" herausfinden kann?

Oder wie erhält man ein Vielfaches von SYMBOL_VOLUME_STEP aus einer beliebigen positiven Zahl?

So erhalten Sie das folgende Ergebnis:

2000,55 (ES-Symbol) -----> 2000,50

2000,55 (SPX-Symbol) -----> 2000,63

1055.5555 (RTS-Symbol) ------> 1060

für jedes Symbol der Welt, das heute (und vorzugsweise morgen) im MT5-Terminal verfügbar ist

"????????"

Die Entwickler können nur 2 Funktionen hinzufügen und sie im Laufe der Entwicklung des Terminals ändern, und ich kenne nicht alle Eigenheiten der verschiedenen Handelsinstrumente. Wo kann ich herausfinden, welche Zitate überhaupt existieren? Und ich brauche ein Zitat, nicht das Ergebnis von NormalizeDouble().

Wenn dieses Fahrrad ist bereits da draußen - stoßen Sie auf eine bestimmte Umsetzung, würde ich es zu schätzen wissen. Was ich bereits gefunden habe, funktioniert bei einigen Symbolen im Moment nicht.

 
Fry:

...

2000,55 (ES-Symbol) -----> 2000,50

2000,55 (Symbol SPX) -----> 2000,63

1055.5555 (Symbol RTS) ------> 1060

...

Bitte zeigen SieSYMBOL_VOLUME_STEP für diese drei Zeichen.
Grund der Beschwerde: