Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 805

 
Sfinks35:
Guten Tag!
Ich scheine es jetzt richtig verstanden zu haben:

Beim Kompilieren wird jedoch eine Warnung ausgegeben: möglicher Datenverlust aufgrund der Typkonvertierung in der Zeile:
index = GetPatt5barsDN(index);

Bei der Kompilierung sind keine Fehler im Funktionskopf (oder in der Funktion selbst) aufgetreten.

double low3 = 0;
   int index = 0;
   low3 = GetPatt5barsDN(index); // Здесь передача значения по ссылке

   Print("low3= ", low3);
   Print("index= ", index);
 

Guten Tag, ich habe eine Frage, gibt es eine Möglichkeit, einen bestimmten Durchgang während der Optimierung zu überspringen.

Zum Beispiel optimiere ich meinen Roboter mit 2 MA's - schnell und langsam, beginnend mit 10 und endend mit 1000 für jeden

Wie kann ich Durchgänge überspringen, wenn die Periode des langsamen Durchgangs kürzer ist als die Periode des schnellen Durchgangs?

 
Roman Sharanov:

Guten Tag, ich habe eine Frage, gibt es eine Möglichkeit, einen bestimmten Durchgang während der Optimierung zu überspringen.

Zum Beispiel optimiere ich meinen Roboter mit 2 MA's - schnell und langsam, beginnend mit 10 und endend mit 1000 für jeden

Wie kann ich Durchgänge überspringen, wenn die Dauer des langsamen Durchgangs kürzer ist als die Dauer des schnellen Durchgangs?

In diesem Fall geben Sie während der Initialisierung return(INIT_PARAMETERS_INCORRECT);

 
Igor Zakharov:

In diesem Fall sollten Sie bei der Initialisierung return(INIT_PARAMETERS_INCORRECT) eingeben;

danke

 

Hallo. Wer kann mir das sagen? Drei verschiedene TS, drei verschiedene EAs, mit drei verschiedenen magischen Zahlen, auf verschiedenen Paaren. Sie haben jedoch ein gemeinsames Merkmal - das Schließen von Aufträgen (mit der Funktion OrderClose()), wenn bestimmte Bedingungen erfüllt sind(Anzahl der Aufträge und geringer Gewinn). Im Testprogramm gibt es keine Probleme, aber in der Praxis entsteht der Eindruck, dass, wenn die Funktion Order Close() bei einem der Paare ausgelöst wird, diese Funktion (OrderClose()) auch bei anderen Paaren ausgelöst wird, unabhängig davon, ob die Bedingungen erfüllt sind oder nicht. Was könnte der Grund dafür sein? Liegt es vielleicht an der benutzerdefinierten Funktion Close()?

Nachstehend finden Sie die Abschlussbedingungen und die benutzerdefinierte Funktion Close().

if(CountBuy() >= 1 && CountSell() >= 1 && CountSymbolTotal() >= NumberOrder)
   {
      int    i;
      int    total    = OrdersTotal();
      double accruals = CalculateCommission() + CalculateSwapBuy() + CalculateSwapSell();
   
      if((CountProfitBuy() + CountProfitSell()) >= (MaxOrderProfit*GetLots()+ accruals))
      {
         for(i = total-1; i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               { 
                  if(OrderType() == OP_BUY)
                     OrderCloseX();
               }
            }
         } 
         for(i = total-1; i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               { 
                  if(OrderType() == OP_SELL)
                     OrderCloseX();
               }
            }
         }            
      }
   }
//---------------------
void OrderCloseX()
{
   int i;
   int ticket = -1;
   int k      = OrdersTotal();
   
   for(i = k - 1; i >= 0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if((OrderType() == OP_BUY || OrderType() == OP_SELL) )
         {            
            ticket = OrderTicket();
         }
      }
   }
   if(OrderTicket() != ticket) 
      if(!OrderSelect(ticket, SELECT_BY_TICKET))
         Print("Ошибка в выборе ордеров!");

   while(true)
   {
      int  error;
      bool result = true;
      
      if (OrderType()==OP_BUY) 
         result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, 0);
         
      if (OrderType()==OP_SELL) 
         result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, 0);
         
      if(result != TRUE) 
      { 
         error = GetLastError(); 
            Print("LastError = ", error); 
      }
      else 
      { 
         error = 0; 
      }
      if(error == 135) 
         RefreshRates();
      else break;
   } 
}

 
Youri Lazurenko:

Hallo. Wer kann mir das sagen? Drei verschiedene TS, drei verschiedene Expert Advisors, mit drei verschiedenen magischen Zahlen, für verschiedene Paare. Sie haben jedoch ein gemeinsames Merkmal - das Schließen von Aufträgen (mit der Funktion OrderClose()), wenn bestimmte Bedingungen erfüllt sind(Anzahl der Aufträge und geringer Gewinn). Im Testprogramm gibt es keine Probleme, aber in der Praxis entsteht der Eindruck, dass, wenn die Funktion Order Close() bei einem der Paare ausgelöst wird, diese Funktion (OrderClose()) auch bei anderen Paaren ausgelöst wird, unabhängig davon, ob die Bedingungen erfüllt sind oder nicht. Was könnte der Grund dafür sein? Liegt es vielleicht an der benutzerdefinierten Funktion Close()?

Hier sind die Abschlussbedingungen und die benutzerdefinierte Funktion Close().

Zunächst verwenden Sie OrderSelect(), um Aufträge zu prüfen, wie es sein sollte - Sie kontrollieren das Symbol und die Stammnummer des Auftrags, und dann schließen Sie den Auftrag mit OrderCloseX() und durchsuchen die Aufträge erneut, aber Sie kontrollieren das Symbol und die Stammnummer in OrderSelect() aus irgendeinem Grund nicht

Ich denke, wir sollten OrderCloseX() hinzufügen, um zu vermeiden, dass der gesamte Code umgeschrieben wird:

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
 
Igor Makanu:

Zunächst überprüfen Sie Aufträge durch OrderSelect(), wie es sein sollte - kontrollieren Sie das Symbol und die Stammnummer des Auftrags, und dann schließen Sie den Auftrag in OrderCloseX() und suchen Sie durch die Aufträge wieder, aber aus irgendeinem Grund Sie nicht kontrollieren das Symbol und die Stammnummer in OrderSelect()

Ich denke, ich sollte OrderCloseX() hinzufügen, um nicht den gesamten Code neu zu schreiben:

Ich danke Ihnen. Ich werde es korrigieren. Bereits korrigiert. Vielleicht ist dies der Grund: Die Funktion OrderCloseX() wird für eines der Paare aufgerufen, das dann auf alle anderen Paare und magischen Zahlen wirkt. Das mag sein, das mag sein. Nochmals vielen Dank.

 
Igor Makanu:

Ziffern - Vordefinierte Variablen

Ich habe auch beschlossen, diese Funktion zu verwenden, habe ich gelesen, dass, wenn die Anzahl der Ziffern im Büro ist 5 zum Beispiel 1,00000 und die letzten Werte sind Nullen es möglicherweise nicht zurückgeben 5 Ziffern, aber Null oder zum Beispiel die Zahl aussehen wird wie 1,24700 wird 3 Dezimalstellen zurückgeben, obwohl es 5 von ihnen sein sollte ist es wahr?

 
Seric29:

Ich habe auch beschlossen, diese Funktion zu verwenden, habe ich gelesen, dass, wenn die Anzahl der Ziffern in einem stabilen von 5 Zeichen zum Beispiel 1,00000 und der letzte Wert von Null kann es nicht zurückgeben 5 Zeichen, aber Null, oder zum Beispiel die Zahl wird wie 1,24700 aussehen wird 3 Dezimalstellen zurückgeben, obwohl es 5 von ihnen sein sollte, ist es wahr?

Ziffern werden mit NormalizeDouble verwendet

https://docs.mql4.com/ru/convert/normalizedouble

NormalizeDouble - Преобразование данных - Справочник MQL4
NormalizeDouble - Преобразование данных - Справочник MQL4
  • docs.mql4.com
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits(). Нужно...
 
Plötzlich haben alle Terminals die Verbindung zu den Brokern verloren. Überall wird der Fehler connect failed angezeigt.
Im Anmeldefenster kann ich keinen Server auswählen, es ist leer. Ich habe vorher nichts verändert, nichts installiert und nichts gelöscht.
Was ist der Grund dafür?