[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 524

 
sss2019:

Mein Expert Advisor öffnet drei Aufträge in meinem Terminal, irgendwann sollte er alle drei Aufträge schließen, aber aus irgendeinem Grund schließt er nur zwei, er gibt keine Fehler.

Hier ist dieser Beitrag, der den Handel abschließen soll

Ich verstehe nicht, was los ist und warum nur zwei Geschäfte abgeschlossen werden. Bitte sagen Sie mir, wer was weiß.

if(OrderSelect(i, SELECT_BY_POS) == false) continue;
 
Vinin:


Den Zyklus anders gestalten


Das hat aber auch nicht geholfen. Die Schleife nicht neu zu ordnen oder "continue" zu ersetzen, hat nicht geholfen, als ob der EA seine eigenen drei Aufträge nicht sieht und nur zwei löscht.

 
Umkehrung der Richtung der Neuberechnung des Zyklus
 
Nehmen Sie es und nutzen Sie es.
Dateien:
 
Manchmal sind die Dinge so unverständlich, überhaupt nicht logisch, dass ich denke, es gibt Fehler in der Terminalumgebung selbst.
 
sss2019:
Manchmal sind die Dinge so unverständlich, überhaupt nicht logisch, dass ich denke, es gibt Fehler in der Terminalumgebung selbst.
Damit es nicht so aussieht, müssen Sie zunächst ein Lehrbuch und ein Handbuch studieren. Versuchen Sie dann, im Forum Erklärungen zu ähnlichen Problemen zu finden.
 
sss2019:

Wie würden Sie besser organisieren die maximale Drawdown des EA, bei dem es aufhört zu arbeiten, können Sie eine statische Variable, die die Höhe der Verluste akkumulieren wird eingestellt?

Der Expert Advisor sollte nicht mehr funktionieren, aber er wird nach einem Neustart oder einer Parameteränderung wieder funktionieren.


Bei der Initialisierung eines EA können Sie den aktuellen Saldo in einer statischen Variablen speichern. Und in der Funktion Start können Sie überprüfen, wie viel Prozent des aktuellen Saldos vom anfänglichen gesunken ist, und wenn der Prozentsatz mehr als zulässig ist, den Handel verbieten. Kurz und knapp, ohne jeden Code. Nach dem Neustart merkt sich der Expert Advisor den neuen Anfangsbestand...
 
MrSoros:

Bei der Initialisierung des Expert Advisors kann der aktuelle Saldo in einer statischen Variablen gespeichert werden. Und in der Funktion Start prüfen Sie, um wie viel der aktuelle Saldo vom Anfangssaldo abweicht, und wenn der Prozentsatz höher ist als erlaubt, ist der Handel verboten. Kurz und knapp, ohne jeden Code. Nach dem Neustart merkt sich der Expert Advisor den neuen Anfangsbestand.

Haben Sie die Frage verstanden?
 
MrSoros:

1. Bei der Initialisierung des Expert Advisors können Sie den aktuellen Saldo in einer statischen Variablen speichern. Dann prüft die Funktion Start, um wie viel Prozent der aktuelle Saldo vom ursprünglichen abweicht, und wenn der Prozentsatz höher ist, wird der Handel verboten. Kurz gesagt, ohne jeden Code.

2. Nach dem Neustart merkt sich der Assessor den neuen Originalsaldo...

1. Sie können. Ich habe diese Option (mit Code) - Sie initialisieren Variablen selbst:

extern int MaxLoss = 90;          // Максимально допустимая просадка в процентах от баланса
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия
int start()
{  
   if (IsExpertStopped)
   {
      Comment("Не удалось инициализировать советник!");
      return (0);
   }
   
   if (IsExpertFailed)
   {
      Comment("Критическая ошибка! Советник остановлен.");
      return (0);
   }
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Учет ордеров только ЭТОГО ЭКСПА---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
     {  
      if (!OrderSelect(orderIndex, SELECT_BY_POS))    continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
          // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(magic);
         IsExpertFailed = true;
         return (0);
      }        
         
      orderCount++;                     // считаем ордера (не больше i)                   
     
    }   

2. Nein. Es wird sich nicht an den Kontostand erinnern, der vor dem ersten Start dieses EXPERTs bestand. Merkt sich nur den aktuellen Stand in der Variablen

AccountBalance()

. für dieses Konto.

 

Guten Tag, ich hatte vorhin eine Frage zur korrekten Darstellung von Anführungszeichen in Excel. Diese Frage wurde dankCosty beantwortet.Jetzt habe ich eine Frage, ist es möglich zu machen (ohne MQL5 und dll) die Daten für mehr Währungen hochgeladen werden? Das Schema ist unten dargestellt, anstelle von "..." die entsprechenden Datumswerte, Schlusskurswerte und der aktuelle Zeitraum.

Ich gehe davon aus, dass die Antwort auf diese Frage mögliche Korrekturen an meinem Code beinhalten wird. Ich füge den Code des Expert Advisors bei, der die Werte der Schlusskurse für ein aktuelles Finanzinstrument in die Datei schreibt.

#property copyright "S.I.Shlikov"
#property link      ""
int init()  
  {
   string Name=Symbol();
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,"Date",Name,"Period",Period());
   FileClose(h);        
  }
int start()
  {
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   string Wtime=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,Wtime,NormalizeDouble(Close[0], Digits));
   FileClose(h);   
   return(0);
  }