Fehler, Irrtümer, Fragen - Seite 52

 
In MT4 war das nicht so, danke. Ich habe es einfach entfernt.
 

Beim Testen von Expert Advisors:
Exp_TEMA.mq5, aus dem Artikel: "Erstellung eines Expert Advisors, der mit verschiedenen Symbolen handelt". Der Ausdruck Told[] Tnew[1]erhält die folgenden Werte:
Told[] Expression konnte nicht ausgewertet werden
Tnew[1] Ungültiger Array-Bereich.

Und My_First_EA.mq5, aus dem Artikel: "A Step-by-Step Guide to Writing MQL5 Expert Advisors for Beginners", der Ausdruck
New_Time[1] erhält den Wert:Ungültiger Array-Bereich

Was bedeuten die Werte Expression could not be evaluated, Invalid array range, und wie wirken sie sich auf die EA-Ergebnisse aus?

 

Told - leeres Array ohne Größe

Tnew[1] - out of array, das Array wird als Tnew[1] bezeichnet, so dass auf seine Elemente nur als Tnew[0] zugegriffen werden kann, da der Index bei Null beginnt.

 
Renat:

Told - leeres Array ohne Größe

Tnew[1] - out of array, das Array wird als Tnew[1] bezeichnet, so dass auf seine Elemente nur als Tnew[0] zugegriffen werden kann, da der Index bei Null beginnt.


Was Tnew betrifft, so habe ich bereits in einem anderen Forumsthread erwähnt, dass anscheinend ein Kommentar der Entwickler erforderlich war :)
 

Bitte sagen Sie mir, wie ich nur einen Handel pro Bedingung eröffnen kann. Mit meinem Code öffnet das Terminal unter dieser Bedingung mehrere Geschäfte, aber ich brauche nur eines.

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

Das Ergebnis ist das folgende Bild:

Wie kann ich überprüfen, ob ein Geschäft mit dieser Bedingung abgeschlossen wurde oder nicht? Ich habe es auf diese Weise versucht, aber es funktioniert nicht:

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

Bitte sagen Sie mir, wie ich nur einen Handel pro Bedingung eröffnen kann. Mit meinem Code öffnet das Terminal unter dieser Bedingung mehrere Geschäfte, aber ich brauche nur eines.

Das Ergebnis ist das folgende Bild:

Wie kann ich überprüfen, ob ein Geschäft mit dieser Bedingung abgeschlossen wurde oder nicht? Ich habe es auf diese Weise versucht, aber es funktioniert nicht:

Und warum die Suche in der Schleife anordnen, wenn es eine so wunderbare Sache wie PositionSelect gibt ?

Wir überprüfen nur die Existenz der Position auf dem interessanten Symbol und wenn es wahr ist, gehen wir Cognac trinken und Zigarren rauchen... :)

PS

So wie ich esverstehe PositionGetString ohnePositionSelect sollte nicht funktionieren. Wir müssen doch nicht die Symbole aller offenen Posen kennen, oder?

 
Interesting:

Es gibt keinen Grund, in der Schleife zu suchen, wenn es eine so wunderbare Sache wie PositionSelect? gibt.

Wir überprüfen einfach das Vorhandensein einer Position auf dem Instrument, an dem wir interessiert sind, und wenn es stimmt, gehen wir in aller Ruhe Cognac trinken und Zigarren rauchen... :)

PS

So wie ich esverstehe PositionGetString ohnePositionSelect sollte nicht funktionieren. Wir müssen doch nicht die Symbole aller offenen Posen kennen, oder?

Bei diesem Code wird das Vorhandensein einer offenen Position berücksichtigt:

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

Es werden jedoch weiterhin Positionen eröffnet, wenn die Bedingung Buy_Signal erfüllt ist. Was ich möchte, ist, dass vor dem Auftreten von Sell_Signal eine Position bei Buy_Signal nicht wieder geöffnet wird. Ich versuche, es auf diese Weise zu implementieren:

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
Es geht nicht.
 
AM2:

Bei diesem Code wird das Vorhandensein einer offenen Position berücksichtigt:

Es werden jedoch weiterhin Positionen eröffnet, wenn die Bedingung Buy_Signal erfüllt ist. Ich muss sicherstellen, dass vor dem Eintreten der Sell_Signal-Bedingung keine weiteren Positionen durch Buy_Signal eröffnet werden. Ich versuche, es auf diese Weise umzusetzen:

Das ist nicht der Fall.

Warum dieser Code? Es sieht kaum nach dem aus, was ich meinte (ich bezweifle, dass dort alles korrekt ist).

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

Und ich meinte so etwas wie das hier:

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

Zumindest könnte man es in einem Block machen

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

Warum gerade dieser Code? Das ist nicht einmal im Entferntesten mit dem vergleichbar, was ich meinte (ich glaube, es ist überhaupt nicht richtig).

Und ich meinte so etwas wie das hier:

Zumindest kann alles in einem Block erledigt werden.

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

Dieser und der obige Code öffnen eine Position nicht, bis sie geschlossen wird, sondern öffnen sie nach dem Schließen beim nächsten Takt erneut, wenn die Bedingung erfüllt ist. Ich habe es auf diese Weise umgesetzt:

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

Ich danke Ihnen! Ich habe alle Ihre Wünsche berücksichtigt, und jetzt funktioniert alles. Ich habe den Expert Advisor zur Veröffentlichung freigegeben. Ich kann noch einige Änderungen am Code vornehmen. Der Verführung sind keine Grenzen gesetzt)))

 
Ich habe in der Dokumentation keine Beschreibung der Response Codes (Retcode) für die Struktur von MqlTradeCheckResult trade request check results gefunden. Wird es welche geben?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
Grund der Beschwerde: