Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 66

 
Roger:

Das, was Sie "Trailing" nennen, ist in Wirklichkeit nicht so, es wird anders berechnet und sein Verhalten kann unlogisch sein.


Auch wenn unsere Vorstellungen von den Begriffen nicht übereinstimmen, aber Sie verstehen mich doch, nicht wahr?

Das Problem ist gelöst, es war hier:

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

Diese Funktion berücksichtigte nicht alle offenen Geschäfte, so dass ich die Schleifenbedingungen ändern musste. Jetzt sieht es so aus:

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

Diese Funktion berechnet die Summe der Gewinne aller offenen Geschäfte auf dem angegebenen Kursniveau. Es wird jedoch die Meinung geäußert, dass die Spanne nicht berücksichtigt wird, und ich stimme ihr zu. Der Verfasser dieser Stellungnahme hat diese Lösung vorgeschlagen:

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

Aber ich muss ehrlich zugeben, dass ich ihn nicht so verstehe, wie er schreibt:

Die Spanne wird nicht berücksichtigt. Dies kann korrigiert werden, indem das Ergebnis vom aktuellen Preis aus gerechnet wird.
Ich verstehe den von ihm vorgeschlagenen Algorithmus nicht, wie wird die Streuung berücksichtigt? Kann das bitte jemand erklären?
 
Mepkypuu:

Aber, um ehrlich zu sein, verstehe ich ihn nicht so, wie er schreibt:

Ich scheine seinen Algorithmus nicht zu verstehen; wie wird die Spanne dort berücksichtigt? Kann das jemand erklären?

OrderProfit() zählt für Short-Positionen zum aktuellen Ask, hier wird der Wert des aktuellen Spreads berücksichtigt. Wenn sich der Spread nicht ändert, ändert sich der Gewinn der Position (Kauf oder Verkauf, mit entsprechendem Vorzeichen) um den Wert des Deltas, der im Operator angegeben ist, wenn sich der Preis vom aktuellen Bid auf newSL ändert:

delta = ( newSL - Bid ) * TickValue;

Kurz gesagt, OrderProfit() zählt alles, einschließlich der Spreads. Mit OrderProfit() legen wir das Ergebnis für einen bestimmten Zeitpunkt ( den aktuellen Kurs) fest. Von nun an müssen wir nur noch die Preisentwicklung beobachten.

 
Mislaid:

OrderProfit() wird für Short-Positionen zum aktuellen Ask gezählt, hier werden die aktuellen Spread-Werte berücksichtigt. Wenn sich der Spread nicht ändert, ändert sich der Gewinn der Position (entweder Kauf oder Verkauf, mit dem entsprechenden Vorzeichen) um den Wert des Deltas, der in der Anweisung angegeben ist, wenn sich der Preis vom aktuellen Bid auf newSL ändert:

delta = ( newSL - Bid ) * TickValue;

Kurz gesagt, OrderProfit() zählt alles, einschließlich der Spreads. Mit OrderProfit() legen wir das Ergebnis für einen bestimmten Zeitpunkt (den aktuellen Kurs) fest. Von nun an müssen wir nur noch die Preisentwicklung beobachten.

Ich glaube, ich beginne zu verstehen, aber vielleicht ist es richtiger:

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

OrderProfit für Short-Positionen wird vom Ask-Preis berechnet, nicht wahr?

Übrigens, MarketInfo( SymbolName, MODE_TICKVALUE) gibt 329.02 für das Währungspaar EURUSD zurück, deshalb funktioniert diese Funktion bei mir nicht richtig.

 

Bisher habe ich mich für einen Trick entschieden, d.h. MarketInfo(SymbolName, MODE_TICKVALUE), um unterschiedlich zu zählen:

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

Bisher habe ich mich für einen Trick entschieden, d.h. MarketInfo(SymbolName, MODE_TICKVALUE), um unterschiedlich zu zählen:

Die Schreibweise ist korrekt. Um wie viel der Bid verschoben wird, um wie viel der Ask verschoben wird, wobei der Spread unverändert bleibt.
 
Mislaid:
Die Schreibweise ist korrekt. So viel wie sich der Bid bewegt, so viel bewegt sich auch der Ask, wenn der Spread unverändert bleibt.

Aus persönlicher Erfahrung ist die Spanne in der Regel unverändert und ziemlich stark). Bei starken Bewegungen habe ich gesehen, wie der Spread von 8 auf 80 Pips bei einer fünfstelligen Zahl anstieg.
 
Ist es möglich, einen doppelten Kreisel(zuverlässig) zu codieren?
 
001:
Kann ein doppelter Kreisel (zuverlässig) kodiert werden?
Das ist möglich.
 

Beim Testen eines Expert Advisors im Journal tritt ein Fehler auf

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Fehler 4002 (Array-Index - außerhalb des Bereichs)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Versuch, einen Kaufauftrag zu eröffnen. Ich warte auf eine Antwort.

Daher werden die Aufträge nicht eröffnet. Wie kann der Fehler behoben werden? Was sind die Gründe dafür?

Ich würde gerne helfen.

 
alexey1979621:

Beim Testen eines EA wird ein Fehler im Protokoll angezeigt

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Fehler 4002 (Array-Index - außerhalb des Bereichs)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Versuch, einen Kaufauftrag zu eröffnen. Ich warte auf eine Antwort.

Daher werden die Aufträge nicht eröffnet. Wie kann der Fehler behoben werden? Was sind die Gründe dafür?

Ich würde gerne helfen.

Aus den Terminalmeldungen allein wird nicht viel ersichtlich sein, und es wird Ihnen nicht viel helfen, wenn Sie den EA-Code nicht posten. Irgendwo in Ihrem Array schreiben Sie einen nicht existierenden Datenstapel, als eine der Annahmen, aber raten ist nicht mein Profil.