Fehler, Irrtümer, Fragen - Seite 2137

 

Fehler beim Lesen des Gewinns (oder habe ich schon etwas falsch verstanden).

Es gibt eine Funktion innerhalb des EA:

bool Fn_profit_summ(double &profit_summ, bool is_buy, ulong magic, bool prnt=false){
   profit_summ = 0;
   string str=(is_buy?"B":"S")+" -> "; 
   //-----------------------------             
   int total = PositionsTotal();          
   for(int i=total-1; i>=0; i--){
      const ulong tic= PositionGetTicket(i); if(tic<=0)     return(false); //--- asinchr
      if(!PositionSelectByTicket(tic)                   )   return(false); //--- asinchr 
      bool is_buy_ = (PositionGetInteger(POSITION_TYPE  )==POSITION_TYPE_BUY); 
      if( is_buy_                             !=  is_buy)   continue; 
      if( PositionGetInteger(POSITION_MAGIC ) !=  magic )   continue;
      if( PositionGetSymbol (POSITION_SYMBOL) != _Symbol)   continue;
      profit_summ += PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
      str+=IntegerToString(tic)+" - "+DoubleToString((PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)), 2)+"/";
      }
   //-----------------------------
   if( prnt) Print(str+" --> "+DoubleToString(profit_summ, 2));
   return(true);}

Ich kann das im Protokoll sehen:

2018.02.21 01:44:04.315 2018.02.14 04:59:49   S -> 273 - -5.62/ --> -5.62

Das wäre in Ordnung, aber es handelt sich um einen Kaufauftrag und nicht um einen Verkaufsauftrag.

Das Ticket ist genau für einen Verkaufsauftrag (273, wie im Protokoll)


Ich dachte, ich hätte in der Funktion nachgesehen und der gleiche Typ wurde korrekt berücksichtigt, aber der Gewinn ist wirklich nicht derselbe. Wenn es wahr ist, dann ist es die Apokalypse - der Kunde schließt Verkaufs- und Kaufpositionen separat bei Erreichen eines bestimmten Gewinns/Verlusts und er schließt ständig den Verkauf, weil er einen Kaufgewinn mitnimmt. Auf dieselbe Art und Weise kann das Depot unabsichtlich geleert werden

(Falls ich überarbeitet habe und mir bereits Dinge einbilde - korrigieren Sie mich bitte. Ich hoffe aufrichtig, dass dies wahr ist und es keinen solchen kritischen Fehler gibt)

 
Galina Bobro:

Fehler beim Lesen des Gewinns (oder habe ich schon etwas falsch verstanden).

Es gibt eine Funktion innerhalb des EA:

Ich kann das im Protokoll sehen:

Das wäre in Ordnung, aber es handelt sich um einen Kaufauftrag und nicht um einen Verkaufsauftrag.

Das Ticket ist genau für einen Verkaufsauftrag (273, wie im Protokoll)


Ich dachte, ich hätte in der Funktion nachgesehen und der gleiche Typ wurde korrekt berücksichtigt, aber der Gewinn ist wirklich nicht derselbe. Wenn es wahr ist, dann ist es die Apokalypse - der Kunde schließt Verkaufs- und Kaufpositionen separat bei Erreichen eines bestimmten Gewinns/Verlusts und er schließt ständig den Verkauf, weil er einen Kaufgewinn mitnimmt. Auf die gleiche Art und Weise kann das Depot ungewollt geleert werden

(Falls ich überarbeitet habe und mir bereits Dinge einbilde - korrigieren Sie mich bitte. Ich hoffe aufrichtig, dass dies wahr ist und es keinen solchen kritischen Fehler gibt)

string str=(! is_buy?"B":"S")+" -> ";
 
Kirill Belousov:
Worum geht es hier? Warum sollte ich "S zurückziehen" wollen?
 

Ich arbeite oft mit benutzerdefinierten Zeichen. Ich muss zum Beispiel eine Fehlersuche an einem dieser Geräte durchführen. Dazu muss der Name hier eingegeben werden


Aber die Namen der benutzerdefinierten Zeichen (und nicht nur der benutzerdefinierten Zeichen) können lang/komplex sein, was es schwierig macht, sie über die Tastatur einzugeben. Der Mechanismus zum Kopieren des Symbolnamens in den Puffer ist nicht vorhanden. Daher schlage ich vor, diesen Menüpunkt um den Punkt "Symbolnamen kopieren" zu ergänzen.


ZZY Fügen Sie bitte Millisekunden zum Tester Visualizer hinzu!

 
fxsaber:

ZS Bitte fügen Sie dem Tester-Visualisierer Millisekunden hinzu!

hinzufügen

 

Fehler bei der Ausführung

struct A {
template<typename T>
        void Print(   T t ) { ::Print( 2 ); }
        ~A() { Print( 1 ); }
};
void OnStart() { A a; }

Ergebnis: 1

Erwartet : 2

 
A100:

Erwartet: void A::Print<int>(int):1

Dies ist höchstwahrscheinlich auf die Gerissenheit des regulären Drucks zurückzuführen. Auf die gleiche Weise können Sie auch iCustom überladen. Ich denke, das Ergebnis wird dasselbe sein.

Der Namensraum für Print, Comment, Alert, iCustom, ... - etwas Besonderes, wie es scheint.

 
fxsaber:

Das hat wahrscheinlich mit der komplizierten Natur von Inhouse Print zu tun.

Nicht verwandt.

void Print2( int )           { Print( 1 ); }
struct A {
template<typename T>
        void Print2(   T t ) { Print( 2 ); }
        ~A() { Print2( 1 ); }
};
void OnStart() { A a; }

Gleiches Ergebnis.

 

SymbolInfoTick für benutzerdefinierte Symbole erzeugt einen leeren Tick (wenn kein CustomTicksAdd gemacht wurde), auch wenn es Ticks in History gibt.

Ich schlage vor, dass auf der Terminal-Seite, nach jedem CustomTicksReplace der letzte Tick (oder nur seine Zeit) in der Geschichte von SymbolInfoTick getan werden.


Bitte beraten Sie die Entwickler in dieser Angelegenheit, an wem sollte diese Aktion logischerweise hängen - dem Terminal oder einem Benutzer?

Ich denke, das Terminal, weil es den Benutzer vor gelegentlichen Fehlern in seinem Code bewahrt (einen gefangen).

In letzter Zeit muss zum Beispiel ein Symbol wie folgt gefunden werden

  ulong GetOriginalLastTime( void ) const
  {
    MqlTick Tick[1] = {0};

    ::SymbolInfoTick(this.Symb, Tick[0]);
    
    if (!Tick[0].time_msc)
      ::CopyTicks(this.Symb, Tick, COPY_TICKS_ALL, 0, 1);

    return(Tick[0].time_msc);
  }
 
A100:

Nicht verwandt.

Das Ergebnis ist das gleiche

Ja, es ist ein Fehler. Das ist mir noch nie begegnet, weil ich das immer auf Methoden zurückführe.