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

 
Leser: Bitte geben Sie an, wie und wo im EA die zum Fenster Nr. 2 gehörende MA anzugeben ist. Ich habe zum Beispiel einen MA zu MFI hinzugefügt und möchte diesen MA in meinem EA registrieren. Ich weiß nicht, wo und wie ich es machen soll.
Möchten Sie Einzelheiten erfahren? Ihr Expert Advisor verwendet bereits den MFI-Indikator und Sie möchten, dass er den zweiten Indikator verwendet - den MA-Indikator? Oder Ihr Expert Advisor verwendet überhaupt keine Indikatoren und Sie benötigen den MA-Indikator?
 
Yedelkin:

1. Ich würde Folgendes sagen: Verwenden Sie den Code eines anderen mit großer Sorgfalt. Denn der Code von jemand anderem bedeutet auch die Fehler von jemand anderem.

2. Hier(https://www.mql5.com/ru/forum/6343/page64#comment_357008) habe ich vorgeschlagen, dass Sie versuchen sollten, Variablen vor ihrer Verwendung korrekt auf Null zu setzen. Aber Ihr Code hat diesen Vorschlag noch nicht umgesetzt. Außerdem enthält Ihr Code Konstrukte des folgenden Typs:

In diesem Konstrukt werden die Anfrage- und Ergebnisvariablen nicht vor, sondern nach ihrer Verwendung auf Null gesetzt. Wenn diese lokalen Variablen auf Null gesetzt werden, funktioniert die Funktion nicht mehr, d. h. die Nullsetzung selbst ist sinnlos. Mit anderen Worten: Eine solche Konstruktion ist ein gutes Beispiel dafür, dass die Variablen MqlTradeRequest und MqlTradeResult nicht auf Null gesetzt werden sollten. Wenn Sie also eifrig sind, versuchen Sie bitte, die Variablen korrekt zu löschen. Wenn etwas nicht funktioniert, beschreiben Sie bitte genau, was "nicht funktioniert".

3. Die Standardbibliothek verfügt über eine Handelsklasse"MQL5 Reference / Standard Library / Trade Classes / CTrade". Versuchen Sie herauszufinden, wie Sie es in der Praxis anwenden können. In der Anfangsphase des Eintauchens in die Sprache kann dieser Unterricht völlig ausreichend sein. Diese Klasse hat zum Beispiel die folgende Methode:"MQL5 Referenz / Standardbibliothek / Handelsklassen / 2CTrade/ PositionModify". Es wird wie folgt umgesetzt:

Die Zeile 'ClearStructures();' löscht die Variable m_request , bevor sie verwendet wird.

Yedelkin,

Herzlichen Dank :)

Ich habe es nachgeschlagen und meinen Fehler erkannt.

Ich kann es so machen:

//+------------------------------------------------------------------+
//| Clear structures request,result and check_result                 |
//+------------------------------------------------------------------+
void ClearStructures()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check_result;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
  } 

Aber ich fand Ihre Vorschläge gut:

   MqlTradeRequest request={0};
   MqlTradeResult result={0};
Die Ergebnisse sind jedoch dieselben.

Nun ist die Stelle nicht gefunden, ich werde mich mit dieser Aufgabe überfordern.

Ich danke Ihnen.

 

Yedelkin,

Ich schreibe Ihnen, weil Sie mir angemessen antworten.

Ich habe zwei Soren - MT4 und MT5.

Warum funktioniert es nicht auf MT5, sie sind identisch.

Dateien:
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065: MT4 und MT5: Warum funktioniert es nicht auf MT5 - sie sind identisch.

Leider verstehe ich den MT4 überhaupt nicht. Ich werde mir das ansehen und Ihnen Bescheid geben, wenn ich etwas finde.

Nachtrag. Im Allgemeinen warten Sie die Markteröffnung ab und berichten, was genau hätte funktionieren sollen, aber nicht funktioniert hat.

 
Yedelkin:

Leider verstehe ich den MT4 überhaupt nicht. Ich werde mir das ansehen und Ihnen Bescheid geben, wenn ich etwas finde.

Nachtrag. Im Allgemeinen warten Sie, bis der Markt öffnet, und beschreiben, was hätte funktionieren sollen, aber nicht funktioniert hat.

Also tue ich es für mich selbst und für wen auch immer, wenn nötig.

Hier sind die Kommentare:

Wenn die Anzeige der Pips bolshego Null für Änderung für zwei yazikas (MT4 und MT5):

if(TradeTrailing>0)

if(MStop > 0)

Wenn diese Pips (Bid - Pips) bolshe öffnen posishon:

if((NormalizeDouble(Bid, Digits)-TradeTrailing)>=OrderOpenPrice())

if(NormalizeDouble(Bid - MStop,4) >= Open)
Wenn Stop = 0 oder Bid - pipsi dal trailing >= von Open Posishon + pips Definition:
if(OrderStopLoss()==0 || (NormalizeDouble(Bid, Digits)-TradeTrailing)>=(OrderStopLoss()+0.0005))

if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= NormalizeDouble(SL + MStop,4))

Änderung:

ОrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid, Digits)-TradeTrailing,OrderTakeProfit(),0,Blue);

ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);

Das war's.

Ich möchte eine separate Funktion für die Änderung erstellen.

 
Yedelkin:
Können Sie das genauer erläutern? Ihr Expert Advisor verwendet bereits den MFI-Indikator und soll nun den zweiten Indikator - den MA-Indikator - verwenden? Oder Ihr Expert Advisor verwendet überhaupt keine Indikatoren, aber Sie möchten, dass er den MA-Indikator verwendet?
Mein Expert Advisor verwendet MFI, aber ich weiß nicht, wie ich den MA-Indikator schreiben soll! Die wichtigste Voraussetzung ist der Standort von MA. Der MA befindet sich nicht auf dem Chart (Fenster 1), sondern in dem Fenster mit dem MFI-Indikator (Fenster 2).
 
Leser: Mein Expert Advisor verwendet MFI, aber ich kann nicht herausfinden, wie man den MA-Indikator schreibt! Die wichtigste Bedingung ist der Standort des MV. Der MA befindet sich nicht auf dem Chart (Fenster #1), sondern im Fenster mit dem MFI-Indikator (Fenster #2).

Wenn der Expert Advisor MFI verwendet, muss sein Code eine Zeile enthalten, in der das Handle dieses Indikators abgerufen wird:"MQL5 Reference / Technical Indicators / iMFI". Daher wird der Umgang mit dem Indikator des gleitenden Durchschnitts hier beschrieben:"MQL5 Referenzhandbuch / Technische Indikatoren / iMA ".

Versuchen Sie auch, den Artikel"Indicator by Indicator in MQL5" zu lesen.

 
mario065: Hier ist der Kommentar: Wenn ein Bid-STOPS_LEVEL mehr als Null für die Modifikation ist: Wenn dieser Bid-STOPS mehr als Offene Positionen ist: Wenn Stop = 0 oder Bid-STOPS ist trailing >= von Offenen Positionen + Definition von Pips: Modifikation: Das ist alles. Ich würde gerne eine separate Funktion für die Änderung einrichten.

1. Leider haben Sie nicht angegeben, was "nicht funktioniert". Sie haben die Logik des Programms dargelegt (wie es funktionieren sollte), aber Sie haben nicht angegeben, wo die Logik gebrochen ist und wie sie gebrochen ist. Ohne eine detaillierte Beschreibung des Problems können Sie nur Kommentare zum Code abgeben.

2. Die Funktion bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) enthält solche Zeilen:

   if(!OrderSend(request,result) || result.deal==0)
     {
      Print("Modify error =", GetLastError());
      return(false);
     }

Wenn Sie sich die Beschreibung der MqlTradeResult-Struktur ansehen, können Sie feststellen, dass das Feld "Deal" wie folgt beschrieben wird

Angebot

Abschlussticket, wenn ein Geschäft abgeschlossen wurde. Sie wird während eines Handelsvorgangs gemeldet TRADE_ACTION_DEAL

Da Ihre Funktion ModifyPosition() eine völlig andere Operation durchführt, sollte der Wert von result.deal immer Null sein. Folglich muss der Betreiber
if(!OrderSend(request,result) || result.deal==0)

wird immer ausgelöst, auch wenn die Änderung erfolgreich war, und es wird gleichzeitig eine Fehlermeldung ausgegeben.

2. Sehen Sie sich die Zeilen aus dem vorherigen Punkt 2 an. Sie verwenden dort die Funktion GetLastError(), die den Code des letzten Fehlers zurückgeben soll. Aber Sie löschen die Variable, die den Fehlercode enthält, nicht, bevor Sie sie verwenden. Selbst wenn die Änderung erfolgreich ist, geben Sie einen Fehler aus, der lange vor der Anfrage zur Änderung der Position aufgetreten sein könnte. Sie sollte in etwa so aussehen:

ResetLastError();   
if(!OrderSend(request,result))
   { 
    ... 
    Print("Modify error =", GetLastError());
    ...
   }

3. Sehen Sie sich diese Zeilen an:

          if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= SL) 
           {
            ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);
           }

Nehmen wir an, dass beim nächsten Tick Ihre BedingungNormalizeDouble(Bid - MStop,4) == SL ausgelöst wird. Angenommen, SL==1,11110. Dann aber auch ModifyPosition(Symbol(),1.11110,TP). D.h. diese Änderung wird die zuvor eingestellten Werte festlegen.

Und was wird passieren, wenn die Gleichheit NormalizeDouble(Bid - MStop,4) == SL beim nächsten Tick wieder funktioniert?) Vor allem, wenn man bedenkt, dass (a) die Normalisierung auf vier Ziffern erfolgt, während es fünfstellige Notierungen geben kann, (b) Handelsanfragen auf dem Server mit einer gewissen Verzögerung ausgeführt werden können.

4. Es gibt auch eine solche Zeicheneigenschaft als SYMBOL_TRADE_STOPS_LEVEL. Aber diese Ebene wird in Ihrem Code nicht überprüft. Das heißt, wenn der Kandidat für einen neuen Stop Loss für eine Kaufposition als SL_new angegeben wird, wäre es sinnvoll, die Bedingung if(Bid-STOPS_LEVEL>SL_new) zu prüfen.

 

Versuchen Sie einmal, im Referenzhandbuch den Vergleich von reellen Zahlen nachzuschlagen. Soweit ich mich erinnere, wird dringend davon abgeraten, zwei reelle Zahlen wie folgt zu vergleichen: if(double_1 == double_2).

 

Yedelkin,

Vielen Dank, Reshetov hat mir auch gezeigt, wo der Fehler liegt.

Hier ist die Funktion selbst:

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "";
   StringConcatenate(word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  ",
                     symbol," ============ >>>");
   Print(word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result))
     {
      Print("Modify error =", GetLastError());
      return(false);
     }
   return(true);
  }

Und hier ist, wie ich die Funktion selbst hätte ausführen sollen:

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,TP,Open;
  if(PositionSelect(Symbol())){
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Bid  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
      buy_trail = NormalizeDouble(Bid - Open,Digits());
      if(buy_trail > MStop)
       {
        if(NormalizeDouble((Bid - MStop),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Bid - MStop),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL + 0.001),Digits()),TP);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Ask  = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      sel_trail = NormalizeDouble(Open - Ask,Digits());
      if(sel_trail > MStop)
       { 
        if(NormalizeDouble((Ask + MStop),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Ask + MStop),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL - 0.001),Digits()),TP);
           }
        }
      }
     }

Jetzt funktioniert alles einwandfrei.

Ich danke Ihnen.