Ja, sie verwenden sie häufig. All das wurde geschrieben, als es nur Währungen gab. Jetzt gibt es Metalle, und wenn die Tickgröße != Punkt ist, ist es schlichtweg falsch.
Der OP druckt ständig eine Verdopplung auf 15 Stellen aus und kann nicht verstehen, warum es nicht genau 0,07 ist. Weil manche Zahlen nicht genau dargestellt werden können 1/8. kann 1/10. kann nicht.
Dieser Kommentar hilft mir wirklich sehr, und das ist nützlich, aber das gibt mir mehr Nachkommastellen. ( mehr Dezimalstellen sind normal - weil ich schon darüber gelesen habe )
Ich mache mir immer noch Sorgen um'NormalizeDouble' und suche nach einem anderen Weg, der besser ist als 'NormalizeDouble'.
Vielen Dank an alle, die Kommentare geschrieben haben.
@whroeder1- Ich werde weithin Forschung Ihren Kommentar (/ Links) großen Dank. @Marco- Ich werde es nach LotSize LotStep Ausgabe verwenden. Dankeschön!
Dieser Kommentar hilft mir wirklich sehr, und das ist nützlich, aber das gibt mir mehr Dezimalen. ( mehr Dezimalstellen sind normal - weil ich schon darüber gelesen habe )
Ich mache mir immer noch Sorgen um'NormalizeDouble' und ich suche nach einer anderen Möglichkeit, welche besser ist als 'NormalizeDouble'
Danke!
Vielleicht wäre es am besten, wenn Sie genau festlegen, was Sie erreichen wollen.
Wenn Sie eine Funktion haben wollen, die eine gültige Losgröße für eine Order zurückgibt, brauchen Sie NormalizeDouble() nicht zu verwenden. Mein ursprünglicher Codeschnipsel oder der von WHRoeder wird das für Sie erreichen. Es gibt feine Unterschiede zwischen den beiden, die eine Frage der persönlichen Vorliebe sind.
Wenn Sie jedoch direkt Print() für diesen Lot-Wert verwenden, erhalten Sie möglicherweise einige "merkwürdige" Ergebnisse, wie z. B. 0,07000000000000001
Für OrderSend() ist das kein Problem, aber es ist vielleicht nicht das, was Sie zu sehen erwarten.
Wenn Sie die Zahlen in einer "normalen" Weise angezeigt bekommen möchten, haben Sie 2 Möglichkeiten:
1. Sie können NormalizeDouble() in der Funktion verwenden. Bei einem Standardausdruck wird der Wert so sein, wie Sie ihn erwarten. Aber wenn Sie (manuell) genügend Nachkommastellen ausdrucken, werden Sie irgendwann feststellen, dass die Zahl nicht genau so ist, wie Sie denken. Das ist der Punkt, auf den WHRoeder hinauswollte (denke ich). Diese Lösung ist nicht die eleganteste, aber die einfachste. Oder...
2. Sie können die Losgröße so lassen, wie sie ist (d.h. NormalizeDouble nicht verwenden) und dann den Wert bei Bedarf für die Anzeige anpassen. Sie könnten DoubleToStr() oder StringFormat() oder printf() verwenden, um dies zu erreichen, je nachdem, was Sie benötigen. Dies ist ein flexiblerer Ansatz.
Denken Sie daran, dass der tatsächliche Wert und die Art und Weise, wie dieser Wert angezeigt wird, nicht identisch sein müssen. Sie werden nie in der Lage sein, genau 0,07 zu speichern:
double myVal=0.07; printf("%.24f",myVal);
Result: 0.070000000000000006661338
Aber Sie können sicherlich 0,07 anzeigen, wenn Sie es brauchen.
Vielleicht wäre es am besten, wenn Sie genau festlegen, was Sie erreichen wollen. ...
Wow, schön, dass du es geschrieben hast, ich verstehe fast wie dein Kommentar. Also werde ich bald einen neuen Kommentar schreiben.
//--- zweites Mal bearbeitet
Wie ich bereits erwähnt habe, brauche ich nicht, dass LotSize und LotStep nur in der Anzeige richtig angezeigt werden, sondern dass LotSize und LotStep überall dasselbe anzeigen können. Ich mache mir nur Sorgen darüber.
Ich brauche einen Teil meiner EAs mit Ihnen zu posten, so dass ich hoffe, es wird Ihnen helfen, mich klarer zu verstehen. Also, ich muss wissen, ist das guter Code oder was?
Bitte geben Sie mir gute (klar) Ratschläge oder Hilfe, danke im Voraus.
voidOnChartEvent(constint id , // Event ID constlong & lparam , // Parameter of type long event constdouble & dparam , // Parameter of type double event conststring & sparam // Parameter of type string events ) {
Ich muss einen Teil meiner EA's mit Ihnen zu posten, so dass ich hoffe, es wird Ihnen helfen, klarer verstehen mich. Also, ich muss wissen, ist das guter Code oder was?
Bitte geben Sie mir gute (klar) Beratung oder Hilfe, danke im Voraus.
Spät nachts, unkompiliert, ungetestet.
Wir können nicht sehen, wo Sie zuerst _lotSize setzen... denken Sie daran, dass Sie sicherstellen müssen, dass _lotSize immer ein Vielfaches von _lotStep ist.
IMHO wäre es besser, wenn Sie alle Ihre Lot-Berechnungen zusammenhalten würden, anstatt sie zwischen OnChartEvent() und _lotCalc() aufzuteilen. Eine Funktion, die min / max / step prüft und die Inkrementierung / Dekrementierung durchführt.
voidOnChartEvent(constint id , // Event ID constlong & lparam , // Parameter of type long event constdouble & dparam , // Parameter of type double event conststring & sparam // Parameter of type string events ) { _lotCalc(); //-------Process Button---------------------------------------------------------| if ( sparam == _btnLotMinus ) { ObjectSetInteger( 0, sparam, OBJPROP_STATE, false ); _lotSize = fmax(_lotMin, _lotSize-_lotStep); _calcUpdade( CALC_CHANGE_LOT ); printf( " | Lot: %.2f ", _lotSize ); return; } //---if Close // ... }
Spät nachts, nicht kompiliert, ungetestet. Wir können nicht sehen, wo Sie _lotSize zuerst gesetzt haben... denken Sie daran, dass Sie sicherstellen müssen, dass _lotSize immer ein Vielfaches von _lotStep ist. IMHO wäre es besser, wenn Sie alle Ihre Lot-Berechnungen zusammen halten würden, anstatt sie zwischen OnChartEvent() und _lotCalc() aufzuteilen. Eine Funktion, die min / max / step prüft und die Inkrementierung / Dekrementierung durchführt.
Das hat mir sehr geholfen, das heißt, das hat meine lotSize und losStep Probleme gelöst. Herzlichen Dank, Mann.
#Lot 0 (Null) & (zwischen der gelösten Losgröße und der Losstufenfrage)- Geschlossen
{
...
return(NormalizeDouble(lots,2));
}
Dieser Kommentar hilft mir wirklich sehr, und das ist nützlich, aber das gibt mir mehr Nachkommastellen.
( mehr Dezimalstellen sind normal - weil ich schon darüber gelesen habe )
Ich mache mir immer noch Sorgen um'NormalizeDouble' und suche nach einem anderen Weg, der besser ist als 'NormalizeDouble'.
Danke!
Vielen Dank an alle, die Kommentare geschrieben haben.
@whroeder1- Ich werde weithin Forschung Ihren Kommentar (/ Links) großen Dank.
@Marco- Ich werde es nach LotSize LotStep Ausgabe verwenden. Dankeschön!
Dieser Kommentar hilft mir wirklich sehr, und das ist nützlich, aber das gibt mir mehr Dezimalen.
( mehr Dezimalstellen sind normal - weil ich schon darüber gelesen habe )
Ich mache mir immer noch Sorgen um'NormalizeDouble' und ich suche nach einer anderen Möglichkeit, welche besser ist als 'NormalizeDouble'
Danke!
Vielleicht wäre es am besten, wenn Sie genau festlegen, was Sie erreichen wollen.
Wenn Sie eine Funktion haben wollen, die eine gültige Losgröße für eine Order zurückgibt, brauchen Sie NormalizeDouble() nicht zu verwenden. Mein ursprünglicher Codeschnipsel oder der von WHRoeder wird das für Sie erreichen. Es gibt feine Unterschiede zwischen den beiden, die eine Frage der persönlichen Vorliebe sind.
Wenn Sie jedoch direkt Print() für diesen Lot-Wert verwenden, erhalten Sie möglicherweise einige "merkwürdige" Ergebnisse, wie z. B. 0,07000000000000001
Für OrderSend() ist das kein Problem, aber es ist vielleicht nicht das, was Sie zu sehen erwarten.
Wenn Sie die Zahlen in einer "normalen" Weise angezeigt bekommen möchten, haben Sie 2 Möglichkeiten:
1. Sie können NormalizeDouble() in der Funktion verwenden. Bei einem Standardausdruck wird der Wert so sein, wie Sie ihn erwarten. Aber wenn Sie (manuell) genügend Nachkommastellen ausdrucken, werden Sie irgendwann feststellen, dass die Zahl nicht genau so ist, wie Sie denken. Das ist der Punkt, auf den WHRoeder hinauswollte (denke ich). Diese Lösung ist nicht die eleganteste, aber die einfachste. Oder...
2. Sie können die Losgröße so lassen, wie sie ist (d.h. NormalizeDouble nicht verwenden) und dann den Wert bei Bedarf für die Anzeige anpassen. Sie könnten DoubleToStr() oder StringFormat() oder printf() verwenden, um dies zu erreichen, je nachdem, was Sie benötigen. Dies ist ein flexiblerer Ansatz.
Denken Sie daran, dass der tatsächliche Wert und die Art und Weise, wie dieser Wert angezeigt wird, nicht identisch sein müssen. Sie werden nie in der Lage sein, genau 0,07 zu speichern:
printf("%.24f",myVal);
Result: 0.070000000000000006661338
Vielleicht wäre es am besten, wenn Sie genau festlegen, was Sie erreichen wollen.
...
Wow, schön, dass du es geschrieben hast, ich verstehe fast wie dein Kommentar.
Also werde ich bald einen neuen Kommentar schreiben.
//--- zweites Mal bearbeitet
Wie ich bereits erwähnt habe, brauche ich nicht, dass LotSize und LotStep nur in der Anzeige richtig angezeigt werden, sondern dass LotSize und LotStep überall dasselbe anzeigen können.
Ich mache mir nur Sorgen darüber.
Nun, wenn es um dynamische Losgrößen geht, kann man immer ein einfaches Getriebe einbauen.
double Lots;
Balance=AccountInfoDouble(ACCOUNT_BALANCE);
if(Balance>10000)
{Lots=10;Print(" Gear Two");}
if(Balance>100000)
{Lots=100;Print(" Gear Three");}
if(Balance>1000000)
{Lots=1000;Print(" Gear Four");}
if(Balance>10000000)
{Lots=10000;Print(" Gear Five");}
if(Balance<10000000)
{Lots=1000;Print(" Gear Four");}
if(Balance<1000000)
{Lots=100;Print(" Gear Three");}
if(Balance<100000)
{Lots=10;Print(" Gear Two");}
if(Balance<10000)
{Lots=1;Print(" Gear One");}
if(Balance>1000000000)
{Lots=0;}
Ich brauche einen Teil meiner EAs mit Ihnen zu posten, so dass ich hoffe, es wird Ihnen helfen, mich klarer zu verstehen.
Also, ich muss wissen, ist das guter Code oder was?
Bitte geben Sie mir gute (klar) Ratschläge oder Hilfe, danke im Voraus.
const long & lparam , // Parameter of type long event
const double & dparam , // Parameter of type double event
const string & sparam // Parameter of type string events
)
{
_lotCalc();
//-------Process Button---------------------------------------------------------|
if ( sparam == _btnLotMinus )
{
ObjectSetInteger( 0, _btnLotMinus, OBJPROP_STATE, false );
_lotSize -= _lotStep;
if ( NormalizeDouble( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
_calcUpdade( CALC_CHANGE_LOT );
Print( " | Lot: ", _lotSize );
return;
} //---if Close
// ...
}
double _lotCalc()
{
//---
_lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN );
_lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX );
_lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );
//---
return( NormalizeDouble( _lotSize, 2 ) );
}
Ich muss einen Teil meiner EA's mit Ihnen zu posten, so dass ich hoffe, es wird Ihnen helfen, klarer verstehen mich.
Also, ich muss wissen, ist das guter Code oder was?
Bitte geben Sie mir gute (klar) Beratung oder Hilfe, danke im Voraus.
Spät nachts, unkompiliert, ungetestet.
Wir können nicht sehen, wo Sie zuerst _lotSize setzen... denken Sie daran, dass Sie sicherstellen müssen, dass _lotSize immer ein Vielfaches von _lotStep ist.
IMHO wäre es besser, wenn Sie alle Ihre Lot-Berechnungen zusammenhalten würden, anstatt sie zwischen OnChartEvent() und _lotCalc() aufzuteilen. Eine Funktion, die min / max / step prüft und die Inkrementierung / Dekrementierung durchführt.
const long & lparam , // Parameter of type long event
const double & dparam , // Parameter of type double event
const string & sparam // Parameter of type string events
)
{
_lotCalc();
//-------Process Button---------------------------------------------------------|
if ( sparam == _btnLotMinus )
{
ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
_lotSize = fmax(_lotMin, _lotSize-_lotStep);
_calcUpdade( CALC_CHANGE_LOT );
printf( " | Lot: %.2f ", _lotSize );
return;
} //---if Close
// ...
}
void _lotCalc()
{
//---
_lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN );
_lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX );
_lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );
//---
}
Spät nachts, nicht kompiliert, ungetestet.
Wir können nicht sehen, wo Sie _lotSize zuerst gesetzt haben... denken Sie daran, dass Sie sicherstellen müssen, dass _lotSize immer ein Vielfaches von _lotStep ist.
IMHO wäre es besser, wenn Sie alle Ihre Lot-Berechnungen zusammen halten würden, anstatt sie zwischen OnChartEvent() und _lotCalc() aufzuteilen. Eine Funktion, die min / max / step prüft und die Inkrementierung / Dekrementierung durchführt.
Das hat mir sehr geholfen, das heißt, das hat meine lotSize und losStep Probleme gelöst.
Herzlichen Dank, Mann.
#Lot 0 (Null) & (zwischen der gelösten Losgröße und der Losstufenfrage)- Geschlossen
Ja, ich vergaß lotSize Code, so dass ich es in init-Funktion verwenden.
Ist es guter Platz für _lotSize?
Danke!
{
_pip = Point;
if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point;
_lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT );
//...
}