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

 

Gumko:

Gumko : Und wie lange wird es dauern, bis diese Aufgabe zum ersten Mal auftaucht...?

Er steht jetzt schon seit zwei Tagen.

Ich habe 8-10 Tage gewartet, dann habe ich aufgegeben und es ausgeschaltet.
 
Ich frage mich, wie viel CPU-Belastung die Tester-Software im Hintergrund hat?
 

Hallo zusammen.

Modifikation und Probleme.

Externe Funktion:

bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- verbindliche Struktur und Handelsergebnisse
MqlTradeRequest-Anfrage;
MqlTradeResult Ergebnis;
//---- Strukturinitialisierung der Geschäftssuche MqlTradeRequest für Positionsänderung
request.action = TRADE_ACTION_SLTP;
request.symbol = symbol;
request.sl = StopLoss;
request.tp = Takeprofit;
string word = "";
StringConcatenate(Wort,
"<< ============ Modifyposition(): Ändern Sie die Position ",
Symbol," ============ >>>");
Print(word);
//---- Position ändern und die Ergebnisse der Handelssuche überprüfen
if(!OrderSend(request,result)|| result.deal==0)
{
Print("Änderungsfehler =", GetLastError();
return(false);
}
return(true);
}

Aber so funktioniert es nicht.

Was ist zu tun?

Vielen Dank :)

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
mario065: Aber so funktioniert es nicht, wie kann ich das machen? Danke :)

Versuchen Sie es auf diese Weise:

MqlTradeRequest request={0};
MqlTradeResult  result ={0};
 
Yedelkin:

Versuchen Sie es auf diese Weise:

Yedelkin,

Danke, es hat nicht funktioniert.

Ich habe überprüft, ob der Beginn des Funktionsaufrufs korrekt gezählt wird.

Ich habe es folgendermaßen gemacht:

double Bid = NormalizeDouble(SymbolInfoDouble(Währung,SYMBOL_BID),_Digits);
double Ask = NormalizeDouble(SymbolInfoDouble(Währung,SYMBOL_ASK),_Digits);
double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
double SL = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
if(Offen > 0){
start_buy = Ask - Open; Print("start_buy=",start_buy);
start_sel = Open - Bid;Print("start_sel=",start_sel);
}

Überraschung im Logbuch:

MR 0 Core 1 10:21:49 2012.10.01 10:12:42 deal #2 sell 0.10 EURUSD at 1.28146 done (based on order #2)
GH 0 Core 1 10:21:49 2012.10.01 01 01:12:42 deal performed [#2 sell 0.10 EURUSD at 1.28146]
NI 0 Core 1 10:21:49 2012.10.01 01 01:12:42 Auftrag ausgeführt sell 0.10 at 1.28146 [#2 sell 0.10 EURUSD at 1.28146 (0.00000)
OF 0 Kern 1 10:21:49 2012.10.01 01 01:12:43 start_buy=0.0001299999999999635
DR 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=5.000000000010552e-005
LE 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_buy=0.0001099999999998325
DE 0 Kern 1 10:21:49 2012.10.01 01:12:43 start_sel=7.00000000000145e-005

Natürlich habe ich mich gerade gefragt, woher die Zahlen kommen?

Ich denke, ich habe die Funktion wie gezeigt richtig geschrieben:

SL- und TP-Änderung

Handelsauftrag zur Änderung von StopLoss- und/oder TakeProfit-Niveaus. Benötigt 4 Felder:

  • aktion
  • symbol
  • sl
  • tp
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
mario065: Danke, es hat nicht funktioniert.

Was genau ist also "fehlgeschlagen"?

mario065 : Ich habe überprüft, ob der Funktionsaufruf korrekt gezählt wird, so habe ich es gemacht:

Fügen Sie den Code korrektein (Strg+Alt+M):

  double Bid  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
  double Ask  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
  double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
  double SL   = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
  if(Open > 0)
    {
     start_buy = Ask - Open;Print("start_buy=",start_buy);
     start_sel = Open - Bid;Print("start_sel=",start_sel);
    }

Hier muss die Normalisierung in einer anderen Reihenfolge angewendet werden.

1. Da die Werte vom Typ SymbolInfoDouble(Currency,SYMBOL_BID) vom Server kommen, werden sie bereits als normalisiert betrachtet. Und es ist nicht nötig, sie ein zweites Mal zu normalisieren. Das heißt, Sie können sie einfach schreiben:

double Bid  = SymbolInfoDouble(Currency,SYMBOL_BID);

2. aber nach jeder arithmetischen Operation ist die Normalisierung verschwunden, wenn Sie also eine normalisierte Zahl benötigen, sollten Sie sie so schreiben:

start_buy = NormalizeDouble(Ask - Open,_Digits);

Über den Rest denke ich noch nach.

 
mario065: Überraschung im Logbuch:

DR 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=5.000000000010552e-005
DE 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_sel=7.0000000145e-005

Natürlich interessiert nur das sel - woher kommen solche Zahlen?

7,00000000000145e-005 ist nur eine Möglichkeit, den Wert einer reellen Zahl zu schreiben. Ich glaube, man nennt es "wissenschaftlich". Für weitere Einzelheiten siehe."MQL5 Referenzhandbuch / Grundlagen der Sprache / Datentypen / Reelle Typen (double, float)".
 
Yedelkin:
7,00000000000145e-005 ist nur eine der Möglichkeiten, den Wert einer reellen Zahl zu schreiben. Ich glaube, man nennt es "wissenschaftlich". Für weitere Einzelheiten siehe."MQL5 Referenzhandbuch / Grundlagen der Sprache / Datentypen / Reelle Typen (double, float)".

Yedelkin,

Danke, dass Sie das Problem angegangen sind.

Die Funktionen zum Öffnen der Position wurden von Nikolay Kositsin geschrieben.

Dateien:
MTB_E.mq5  9 kb
 
Bitte geben Sie an, wie und wo im EA der 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.

Vielen Dank für Ihre Antwort)
 
mario065: Hier ist der Code. Die Funktionen zur Eröffnung der Stelle wurden von Nikolay Kositsin geschrieben. Nikolai Kositsin.

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:

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit)
  {
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request;
   MqlTradeResult result;
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = ...
   request.symbol       = ...
   request.sl           = ...
   request.tp           = ...
   ...
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result) || result.deal==0)
     {
      ...
     }
   ZeroMemory(request);
   ZeroMemory(result);
   return(true);
  }

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:

//+------------------------------------------------------------------+
//| Modify specified opened position                                 |
//+------------------------------------------------------------------+
bool CTrade::PositionModify(const string symbol,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__)) return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action=TRADE_ACTION_SLTP;
   m_request.symbol=symbol;
   m_request.magic =m_magic;
   m_request.sl    =sl;
   m_request.tp    =tp;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

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