[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 628

 

Problem mit Symbol() MT4:

2 Funktionen zur Veranschaulichung:

string   SymbolOK()
{

   string   value;
   string   argument = "ANYTHING";

   if(false)
   {
      value = argument;
   }

   return(value);

}

string   SymbolPROBLEM()
{

   string   value;
   string   argument = Symbol();

   if(false)
   {
      value = argument;
   }

   return(value);

}

Die Ausführung der ersten gibt einen leeren String aus:

int start()
{
   Comment(SymbolOK());
   return(0);
}

Aber die zweite Funktion gibt eine String-ID "EURUSD" aus (naja, hängt vom Chart ab, aber gibt aus, obwohl es nach der Logik der Funktion ein leerer String sein sollte):

int start()
{
   Comment(SymbolPROBLEM());
   return(0);
}

Helfen Sie mir zu verstehen, was los ist? Dankeschön

 
rigonich:

Sie haben keinen Auftrag in der Funktion Handel () ausgewählt.

Im Übrigen. Welchen Sinn hat die Auswahl eines Auftrags in der Funktion Trade()? Ich rufe die Funktion OrdersModifying() auf, in der die Bestellung ausgewählt und dort geändert wird. D.h., die ursprüngliche Variante war richtig!
 
hoz:


Das ist es. Hier ist die Lösung.

Und die Änderungsfunktion ist hier:

Seltsam Aber es gibt keine Stopps und Takes auf dem Ausgang wieder.



OrderSelect(g_ticket,SELECT_BY_TICKET) vor der Zeile if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
 
TUNGUS:


History, History_Draw - sie funktionieren wie Expert Advisors während des Testens.

So etwas brauchen Sie, um Korrekturen in der Historie anhand bestimmter Parameter zu beobachten


In der Geschichte oder in der Tabelle? Wenn ja, welche Art von Daten möchten Sie im Chart-Fenster sehen, in einem separaten Fenster, als Tabelle gedruckt, in Form von verschiedenfarbigen Kerzen oder als Linie, die den Beginn und das Ende der Bewegung verbindet?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET) vor der Zeile if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


Genau das habe ich getan:

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

Es gibt keine Stopps und Übernahmen. Im Protokoll wird der Fehler 130 angezeigt, der besagt, dass die Haltestellen falsch sind. Ich sehe den Grund dafür nicht.

 
hoz:


Genau das habe ich getan:

Es gibt keine Stopps und Übernahmen. Im Protokoll wird der Fehler 130 angezeigt, der besagt, dass die Haltestellen falsch sind. Ich sehe keinen Grund dafür.


Ohne ifs, nurOrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);, und Sie können es in OrdersModifying() lassen

//+------------------------------------------------------------------+

void AufträgeÄndern()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);

if(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Wenn der Eingabeparameter für den Stop Loss nicht 0 ist

// Ermittelt den Wert des Stop Loss für den ausgewählten Auftrag

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Wenn der Eingabeparameter TakeProfit ungleich 0 ist, dann...

// Erhalten Sie den TakeProfit-Wert für den ausgewählten Auftrag

}

if(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Wenn der Eingabeparameter des Stop Loss nicht 0 ist

// Ermittelt den Wert des Stop Loss für den ausgewählten Auftrag

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Wenn der Eingabeparameter TakeProfit ungleich 0 ist, dann...

// Erhalten Sie den TakeProfit-Wert für den ausgewählten Auftrag

}

if(sl != 0 || tp != 0) // Wenn die ermittelten Werte von sl und tp ungleich 0 sind, dann..

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Änderung der Bestellung

}

}


 
anton.veksler:

Problem mit Symbol() MT4:

2 Funktionen zur Veranschaulichung:

Die Ausführung der ersten gibt einen leeren String aus:

Aber die zweite Funktion gibt eine String-ID "EURUSD" aus (naja, hängt vom Chart ab, aber gibt aus, obwohl es nach der Logik der Funktion ein leerer String sein sollte):

Helfen Sie mir zu verstehen, was los ist? Dankeschön


Sie können keine reservierten Namen (Wert) verwenden, wenn Sie Ihre Variablen deklarieren, rufen Sie _Wert
 
hoz:


Genau das habe ich getan:

Es gibt keine Stopps und Übernahmen. Im Protokoll wird der Fehler 130 angezeigt, der besagt, dass die Haltestellen falsch sind. Ich sehe keinen Grund dafür.

Und das werden sie nicht!

  double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

Vitaly, ich habe getan, was Sie gesagt haben, aber es hat sich nichts geändert. Offenbar liegt der Fehler irgendwo anders begraben.

Vorher hatte ich alles (Eröffnung von Aufträgen - Änderung und Übertragung auf b.w., wenn das festgelegte Preisniveau erreicht ist) und alles hat funktioniert. Es war folgendermaßen:

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

Jetzt, wo ich alles in spezifische, spezialisierte Funktionen aufgeteilt habe, funktioniert das alles nicht mehr soooo sehr. Ich habe es auf beide Arten versucht, nichts funktioniert.

 
borilunad:

Und das werden sie nicht!

 double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

Wo ist da die Logik? Ich würde gerne verstehen... Hier ist die Funktion:

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Wenn die Eingangsvariablen i_sl und i_tp ungleich Null sind, erhalten wir die Stopp- und Take-Kurse, die bereits in der Order enthalten sind - sl undtp. Danach werde ich prüfen, ob wirhiersl undtp berechnet haben(wenn für Shorts):

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

Wenn die Werte erhalten werden, können sie nicht Null sein, denn sie werden geändert! Dies sind Variablen, die wir sequentiell durch den Codekontext erhalten.

Und hier habe ich überprüft, ob wir die Werte von Stop und Take gefunden haben. Wie können sie nach all den Bedingungen gleich Null sein?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }