[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 276

 
rid >> :

Bei der Verwendung (Aufruf) von Funktionen aus diesen Dateien (bereits in mt4 implementiert), im Falle einer fehlerhaften Arbeit des EA können wir im Log die Nummer des Fehlers von uns in den Code gemacht sehen.

Zum Beispiel rufen wir die Funktion GetLastError() auf:

In diesem Fall, wenn wir einen Fehler im Code gemacht haben oder falsche externe Parameter gesetzt haben, werden wir die Nummer dieses Fehlers im Protokoll sehen.

Zum Beispiel, 130.

Und die Entschlüsselung der Nummer finden Sie auf der Seite -https://book.mql4.com/ru/appendix/errors

Und wir müssen nicht den ganzen Code durchsuchen, weil wir durch diese Nummer bereits wissen, wo genau der Fehler gemacht wurde!

Lassen Sie mich ein wenig korrigieren: die Funktion GetLastError kann ohne die Header-Datei aufgerufen werden, aber um die Fehlerbeschreibung zu erhalten, ohne die Seiten zu navigieren, sollten Sie die Bibliothek verlinken:

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
 
rid писал(а) >>

Sie haben die Funktion nicht korrekt aufgerufen.

Ihre Funktion wird folgendermaßen aufgerufen: if (NumberOfPositions(NULL,Magic)> 1)

Sie sollte folgendermaßen aussehen:


Fühlen Sie den Unterschied (Sie haben die "-1" übersehen) und ändern Sie Ihren Code.

Um dies zu kontrollieren, können Sie einen Kommentar auf das Diagramm drucken. Zum Beispiel so (am Anfang der Funktion START).

Was Ihre zweite Bedingung betrifft, würde ich ("ohne klug zu denken") einen anderen Magier und eine separate Funktion Open_Buy_2() einstellen, um Positionen durch die zweite Bedingung zu öffnen!

Der Code der zweiten Bedingung würde wie folgt aussehen

los,

Ich verstehe auch, warum die zweite Bedingung nicht funktioniert, vielleicht habe ich das Problem falsch erklärt:

Ich möchte, dass mein EA in der Lage ist, zu überprüfen, ob die Aufträge von ihm geöffnet wurden oder nicht, auch wenn sie vor langer Zeit geschlossen wurden. NumberOfPositions funktioniert, aber es zählt nur die Anzahl der offenen Positionen. (deshalb funktioniert es nicht)

Im Code meines EA gibt es ein Skript, das jede nächste Position unter Berücksichtigung der Daten der vorherigen Position eröffnet. Wenn es keine vorherige Position gab, sollte die erste Order ohne diese Bedingung eröffnet werden (andernfalls wird der EA nicht starten). Daher sollte es eine Funktion geben, die erkennt, ob mindestens ein Auftrag dieses EAs geöffnet wurde oder nicht (auch wenn der Auftrag dann geschlossen wurde). Wenn noch keine Aufträge vorliegen (Arbeitsbeginn), wird der erste Auftrag ohne Berücksichtigung der zweiten Bedingung eröffnet, und alle nachfolgenden Aufträge werden unter Berücksichtigung der zweiten Bedingung eröffnet, d. h. unter Verwendung der Daten der vorherigen Aufträge.

Ist es möglich, die Funktion auf diese Weise zu ändern?

 

Bitte sagen Sie mir, was die iTime-Funktion anzeigt.

Was ist das für ein Kauderwelsch mit 10 Ziffern? Sekunden?

Wie würde es in Jahr-Monat-Tag-Stunde-Minute übersetzt?

 

Ich verstehe. Um festzustellen, ob es Positionen in der Historie gab, können Sie wie folgt vorgehen:

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()== Magic)                            {
              позиции = true;
                                                             }}
                  



Aber dann funktioniert Ihr Code nur im Testprogramm. Denn sonst müssen Sie die Magie jedes Mal ändern, wenn Sie den EA online einschalten.

Offensichtlich müssen Sie den Zeitraum festlegen, für den der Kontoverlauf erfasst wird.

D.h. wann wurde der letzte Handel mit der gegebenen Magie eröffnet/geschlossen? War es vor sechs Monaten oder vor 24 Stunden?

Es gibt Funktionen, die die Taktnummer (vom aktuellen Takt bis zum Ende der Historie) des letzten eröffneten oder geschlossenen Handels zurückgeben.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderOpenTime()) t=OrderOpenTime();
            }}}}} }  return(iBarShift( sy, tf, t, True));}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift( sy, tf, t, True));}

Um Ihnen ein Beispiel zu geben. Ich habe diese Funktionen in meinem Code wie folgt verwendet:
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

Oder so:
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
 
Meine Herren, Hilfe! Wie schreibe ich den Code richtig, um eine Meldung anzuzeigen, dass die letzte geschlossene Kerze weiß (aufwärts) oder schwarz (abwärts) ist? Ich weiß, es macht keinen Sinn, aber trotzdem .....

 

Hmm.kämpft mit dem gleichen einfachen Problem...öffnet ein Meer von Positionen, aber braucht nur 1 höchstens und wenn kaufen schließt und ein Signal kommt zu öffnen verkaufen... Große Anfrage Hinweis und korrigieren, was falsch ist.im Code unten... Wo muss ich eine Magie verschreiben? Wenn es Ihnen nichts ausmacht, machen Sie ein dummes Beispiel, wenn kaufen Kreuz nach oben (nicht mehr als 1 Auftrag) und verkaufen nach unten auch nicht mehr als 1. Ich denke, das wird die Fragen vieler Neulinge sofort beantworten. Ich danke Ihnen im Voraus.

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}
 

Noch eine dumme Frage:

- Wie deklariert man ein Array, dessen Anzahl der Elemente durch eine externe Variable gegeben ist?

 
chaynik_1 >> :
Meine Herren, Hilfe! Wie schreibe ich den Code richtig, um eine Meldung anzuzeigen, dass die letzte geschlossene Kerze weiß (aufwärts) oder schwarz (abwärts) ist? Ich weiß, es macht keinen Sinn, aber trotzdem .....

Es ist folgendermaßen.

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
 
alderru >> :

Noch eine dumme Frage:

- Wie deklariert man ein Array, dessen Anzahl der Elemente durch eine externe Variable gegeben ist?

https://docs.mql4.com/ru/array/ArrayResize

 
morok >> :

Hmm.kämpft mit dem gleichen einfachen Problem...öffnet ein Meer von Positionen, aber braucht nur 1 höchstens und wenn kaufen schließt und ein Signal zu öffnen verkaufen kommt... Große Anfrage Hinweis und korrigieren, was falsch ist.im Code unten... Wo muss ich eine Magie verschreiben? Wenn es Ihnen nichts ausmacht, machen Sie ein dummes Beispiel, wenn der Kauf nach oben kreuzt (nicht mehr als 1 Auftrag) und der Verkauf nach unten auch nicht mehr als 1. Ich denke, das wird die Fragen vieler Neulinge sofort beantworten. Vielen Dank im Voraus.

Versuchen Sie es so:

(Sie müssen bei NumberOfPositions() aufmerksamer sein, es steht nicht ohne Grund in der Kopfzeile:

/| Beschreibung : | Beschreibung : Gibt die Anzahl der Positionen zurück.
//| Parameter : |
//| sy - Instrumentenname ("" oder NULL - aktuelles Symbol) |
|| op - Operation ( -1 - beliebige Position) |
//| mn - MagicNumber ( -1 - beliebige magische Zahl) |
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}