Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1481

 
MrBrooklin #:

Jetzt habe ich es. Danke!!! Es stellt sich heraus, dass der Fehlercode 4753 nie erscheint, wenn mindestens eine Position offen ist.

Mit freundlichen Grüßen, Vladimir.

Er wird erscheinen, wenn Sie folgendes schreiben

PositionSelect("мой символ");
 
Alexey Viktorov #:

Sie erscheint, wenn Sie Folgendes schreiben

Hallo Alexey, eine Klarstellung. Ist es notwendig, PositionSelect() statt einer Schleife zu verwenden, oder habe ich wieder etwas missverstanden?

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:

Hallo Alexey, eine Klarstellung. Ist es notwendig, PositionSelect() statt einer Schleife zu verwenden, oder habe ich wieder etwas falsch verstanden?

Mit freundlichen Grüßen, Vladimir.

Sie können es schreiben, wie Sie wollen, die Hauptsache ist, ein nicht vorhandenes Zeichen zu schreiben, um einen Fehler zu erhalten...

 
Alexey Viktorov #:

Sie können es so schreiben, wie Sie wollen, Hauptsache, Sie schreiben ein nicht vorhandenes Zeichen, um einen Fehler zu erhalten....

Aber werfen Sie nicht mit Hausschuhen nach mir!!! Ich kann den Fehlercode nicht bekommen. ((((

void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   string symb = "BrooklinUSDrfd";
   PositionSelect(symb);
   PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = ", symb, GetLastError());
  }

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:
Fehler = "
Der %lu-Bezeichner sollte vorhanden sein
 
Artyom Trishkin #:
Dort sollte es einen Spezifizierer geben

Danke Artem, es hat funktioniert!!! Ich danke euch allen sehr!

Mit freundlichen Grüßen, Vladimir.

 

Kurz gesagt, das hier beschriebene Problem auf eine andere Art und Weise gelöst:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   if(!PositionSelect(_Symbol))
      PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = %lu", _Symbol, GetLastError());
   int pos_total = PositionsTotal(); // объявим переменную для хранения количества открытых позиций
   if(pos_total > 0) // если есть открытые позиции
     {
      for(int i=0; i<pos_total; i++) // запустим цикл и переберём все открытые позиции
        {
         if(PositionGetSymbol(i) == _Symbol) // выберем все открытые позиции по текущему символу
           {
            ulong  pos_id = PositionGetInteger(POSITION_IDENTIFIER);
            double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = PositionGetDouble(POSITION_TP);
            double pos_sl = PositionGetDouble(POSITION_SL);
            PrintFormat("Позиция #%d цена = %G тейк-профит = %G стоп-лосс = %G", pos_id, pos_price, pos_tp, pos_sl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

Mit freundlichen Grüßen, Vladimir.

 

Guten Abend zusammen!

Ich versuche, eine Funktion zu erstellen, die eine zusätzliche Position (ohne Stop und Take) zu einer bestehenden offenen Position eröffnet. Ich habe den Code geschrieben:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Pos_Buyl()
  {
   for(int i=pos_total-1; i<pos_total; i++) // ищем последнюю по списку открытую позицию
     {
      PositionGetTicket(i); // получим тикет позиции по индексу в списке открытых позиций
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && // если совпадает символ открытой позиции
         PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && // если совпадает тип открытой позиции
         PositionGetInteger(POSITION_MAGIC) == Magic_Number) // и если совпадет мэджик
        {
         double pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN); // объявим и инициализируем переменную для цены открытой позиции
         if(// тут задано условие для открытия позиции)
           {
            double new_price_pos=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            trade.Sell(0.01,_Symbol,new_price_pos,0,0);
           }
        } 
     }
  }

aber aus irgendeinem Grund sieht er die offene Position nicht. Ich habe versucht, das Problem mit dem Debugger zu finden, aber nach dem Start der Schleife verlässt er sofort die Funktion, ohne zu sehen, was darin geschrieben wird. Ich habe den Haltepunkt bei PositionGetTicket(i) gesetzt. Könnten Sie mir bitte sagen, wo ich wieder einen Fehler in meinem Code habe?

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin offenen Position öffnet. Ich habe den Code geschrieben:

aber aus irgendeinem Grund sieht er die offene Position nicht. Ich habe versucht, das Problem mit dem Debugger zu finden, aber nach dem Starten der Schleife verlässt er sofort die Funktion, ohne zu sehen, was darin geschrieben wird. Ich habe den Haltepunkt auf PositionGetTicket(i) gesetzt. Könnten Sie mir bitte sagen, wo ich wieder einen Fehler in meinem Code habe?

Mit freundlichen Grüßen, Vladimir.

Was ist pos_total?

 
Alexey Viktorov #:

Was ist pos_total gleich?

Hallo Alexey, die Variable pos_total=PositionsTotal(), aber sie war auf globaler Ebene gesetzt. Jetzt habe ich sie innerhalb der Funktion verschoben und es stellte sich heraus, dass dies das Problem war. Alles hat funktioniert. Wo liegt das Problem? Ich habe den Trick überhaupt nicht verstanden!!!

Nun habe ich pos_total versuchsweise wieder auf die globale Ebene verschoben und es funktionierte wieder nicht mehr, aber wenn ich es in die Funktion einfüge, funktioniert es wie es soll! Ein paar Wunder, zumindest für mich!!!! )))

Es stellt sich heraus, dass eine Variable auf globaler Ebene nicht durch eine Funktion initialisiert werden kann? Ist das so?

Mit freundlichen Grüßen, Vladimir.