expert advisor - verschiedene Fragen - Seite 4

 
  1. 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.
  2. 02:00:00.069 - Benutzerdefinierter Experte EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
    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.
 
honest_knave:
double LotCalculator(double lots)
  {
   ...
   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!

 
Max Enrik:

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.
 
honest_knave:

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.

//Gearbox//
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.

void OnChartEvent(const int      id     , // Event ID
                  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 ) );
}
 
Max Enrik:

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.

void OnChartEvent(const int      id     , // Event ID
                  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 );

    //---
}
 
honest_knave:

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!

int OnInit()
{
    _pip = Point;
    if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point;
    _lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT );

    //...
}