Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1624

 
EVGENII SHELIPOV #:

Guten Tag !!!

Bitte helfen Sie beim Schreiben von Code für das Schließen von Min- und Max-Aufträgen in einem Grid-EA, wenn eine bestimmte Höhe des Drawdowns erreicht ist

Ich habe zwei Funktionen geschrieben, um den Gewinn von Max- und Min-Aufträgen zu berechnen

Ich habe auch eine Funktion geschrieben, die den Betrag dieser Aufträge berechnet. Es scheint hier kein Problem zu geben.

Die Frage ist, wie man nur diese beiden Aufträge schließen kann. Ich habe die Funktion ClosseAll() gefunden.

Die Frage ist, wie man die Funktion OrderTicket() ändern kann, die alle Aufträge abschließt

die Variablen max_ticket und min_ticket anzuhängen, die nur die Fahrscheine der minimalen und maximalen Bestellungen im Raster bestimmen

Oder haben SIE IHRE Lösung für dieses Problem?

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

und reparieren Sie es.

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

Entschuldigung, ich habe es wieder falsch geschrieben. Lassen Sie es mich noch einmal versuchen)

Es gibt ein Netz von offenen Aufträgen. Ich muss den Eröffnungspreis (OrderOpenPrice) des Auftrags finden, der dem aktuellen Preis am nächsten kommt. Um das Netz weiter zu bauen, aber meine Aufträge sind fast chaotisch aufgebaut.

Ich verstehe, wie man die Überschreitung schreibt, aber ich bin nicht in der Lage, es in der Sprache richtig auszudrücken (ich bin wie ein Hund, ich verstehe alles)).

Wenn Sie Beispiele oder Links zu Beispielen haben, veröffentlichen Sie diese bitte. MQL4

in einer Schleife:

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

vor Schleife initialisieren previous_value=DBL_MAX a nearest_order=0

 
PapaYozh #:

Worin besteht übrigens der Unterschied, abgesehen davon, dass er implizit aufgerufen wird, wenn das Objekt erstellt wird?

und außerdem wird beim Aufruf im Konstruktor noch kein Speicher zugewiesen, es wird nicht kompiliert:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

aber im Körper des Konstruktors, kein Problem:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



über Basisklassenkonstruktoren - sie können explizit aufgerufen werden:

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

Bringen Sie auch das in Ordnung.

Über den Ausrutscher habe ich bereits zu Beginn des Beraters

MakarFX #:

und bringen Sie das in Ordnung.

MakarFX #:

dies beheben

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

Nur maximale Aufträge werden entsprechend den Abschlussergebnissen geschlossen


 
Taras Slobodyanik #:

in der Schleife:

initialisiere previous_value=DBL_MAX a nearest_order=0 vor der Schleife

MakarFX #:

und korrigieren Sie dies

MakarFX #:

und bringen Sie das in Ordnung.

Bei Fehlern im Protokoll


 
Guten Tag, hat jemand schon einmal von MirachLtd-Real gehört und kann etwas dazu sagen?

 
EVGENII SHELIPOV #:

Über den Schlupf habe ich bereits zu Beginn des EA

Dieser Slippage ist genau für diese Funktion gedacht... damit Sie nicht über BUY oder SELL gehen müssen

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
Wie erstellt man ein Klassenobjekt besser: nach der Klassenbeschreibung oder lokal, zum Beispiel in OnTick()? Die zweite Option ist wahrscheinlich nicht sehr wirtschaftlich: CPU- und RAM-Last.
 
MakarFX #:

Dieser Slippage ist nur für diese Funktion... damit Sie nicht über BUY oder SELL gehen müssen

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

Sie brauchen hier nicht mit einem Punkt zu multiplizieren

möglicher Datenverlust aufgrund von Typumwandlung NEVALASHKA.mq4 376 13

Ich erhalte eine Warnung zur Kompilierzeit


 
EVGENII SHELIPOV #:

Es ist nicht notwendig, mit einem Punkt zu multiplizieren

möglicher Datenverlust aufgrund von Typumwandlung NEVALASHKA.mq4 376 13

Ich erhalte eine Warnung zur Kompilierzeit


Nicht multiplizieren MODE_SPREAD - Spread in Pips

können Sie prüfen

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

und machen Sie das so

int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;