Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 176

 

Leute, helft mir, den EA zu reparieren. Anstatt Aufträge zu prüfen, kauft er ohne Unterbrechung beim ersten Signal, bis er die gesamte Einlage ausgegeben hat. Ich danke Ihnen allen im Voraus

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
extern double Lots            = 1;
extern int    TakeProfit      = 300;
extern int    StopLoss        = 50;
extern int    Magic           = 111;
extern int    Slippage        = 3;
//+------------------------------------------------------------------+
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56;
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
//+------------------------------------------------------------------+
double PriceHigh,PriceLow,SL,TP,OrderMagicNumber;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
      TakeProfit *= 10;
      StopLoss   *= 10;
      Slippage   *= 10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   PriceHigh= iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
   PriceLow = iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);

   if(CountSell()==0 && Bid>=PriceHigh)
     {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"ТМА",Magic,0,Red);
      if(ticket>0)
        {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
        }
      else Print("Ошибка открытия ордера на продажу");
     }
   if(CountBuy()==0 && Ask<=PriceLow)
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"ТМА",Magic,0,Blue);
      if(ticket>0)
        {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на покупку");
        }
      else Print("Ошибка открытия ордера на покупку");
     }
   if(Ask<=PriceLow && CountSell()>0)
     {
      for(int i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black))
                  Print("Ошибка закрытия ордера на продажу");
           }
        }
     }
   if(Bid>=PriceHigh && CountBuy()>0)
     {
      for(i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black))
                  Print("Ошибка закрытия ордера на покупку");
           }
        }
     }
  }
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+------------------------------------------------------------------+
 
Zelimhannahal00:

Leute, helft mir, den EA zu reparieren. Anstatt Aufträge zu prüfen, kauft er ohne Unterbrechung beim ersten Signal, bis er die gesamte Einlage ausgegeben hat. Ich danke Ihnen allen im Voraus.

Der Code kann direkt im Code-Editor mit Hilfe des Code-Stylers normal formatiert werden: Strg + <

Ich habe ihn für Sie formatiert - jetzt ist er normal lesbar.

 
Zelimhannahal00:

Leute, helft mir, den EA zu reparieren. Anstatt Aufträge zu prüfen, kauft er ohne Unterbrechung beim ersten Signal, bis er die gesamte Einlage ausgegeben hat. Ich danke Ihnen allen im Voraus.

Sie haben es richtig erkannt, der Fehler liegt in der Funktion "Positionen prüfen".

//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }

   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+----------------------

Ich habe in rot hervorgehoben, behoben.

Ich habe sie korrigiert.

 
Alekseu Fedotov:

Sie haben den Fehler in den Funktionen der Positionskontrolle richtig erkannt

rot hervorgehoben, korrigiert.

Das war's dann auch schon.

Ich habe es korrigiert, es ist immer noch dasselbe. Das Problem ist immer noch vorhanden.
 
Zelimhannahal00:
Ich habe es korrigiert, es ist immer noch dasselbe. Das Problem ist immer noch vorhanden.
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
return(count);


Haben Sie den gesamten Code dort hineinkopiert?

 
Vladislav Andruschenko:


Haben Sie den gesamten Code dort hineinkopiert?

Ich habe nicht versehentlich den gesamten Code kopiert. Dort ist es in Ordnung return(count);

}

So endet der Code, wie er sollte. Beim Kompilieren des Codes treten keinerlei Fehler oder Warnungen auf. Ich muss einen Fehler in den Funktionen gemacht haben, ich kann nicht herausfinden, wo. Ich habe es wie oben beschrieben repariert. Ich habe auch keine Fehler, aber der Berater selbst funktioniert die gleiche Art und Weise (das erste Signal, es kauft für die gesamte Kaution, gegeben Lose, wie 1 Lot gesetzt und er kauft 1 Lot von Geschäften 200 oder mehr, solange die Kaution ist genug. Aber das Signal ist richtig, kauft auch richtig, nur viel)

 
Zelimhannahal00:

Ich habe nicht versehentlich den gesamten Code kopiert. Es ist in Ordnung return(count);

}

So endet der Code, wie er sollte. Beim Kompilieren treten keinerlei Fehler oder Warnungen auf. Ich muss einen Fehler in den Funktionen gemacht haben, ich kann nicht herausfinden, wo. Ich habe es wie oben beschrieben repariert. Ich habe auch keine Fehler, aber der Berater selbst funktioniert die gleiche Art und Weise (das erste Signal, es kauft für die gesamte Kaution, gegeben Lose, wie 1 Lot gesetzt und er kauft 1 Lot von Geschäften 200 oder mehr, solange die Kaution ist genug. Aber das Signal ist richtig, kauft auch richtig, aber viel)

Ich habe es überprüft und korrigiert.

Dateien:
ProjectName.mq4  11 kb
 
Wie findet man die Anzahl der Kerzen zwischen den Daten?
 
Alexander Fedosov:
Wie findet man die Anzahl der Kerzen zwischen den Daten?

Wenn die TF synchronisiert ist, kann jede CopyXXXX()-Funktion :

Bezugnahme auf das Start- und Enddatum des gewünschten Zeitintervalls

intCopyTime(
stringsymbol_name,// Name des Symbols
ENUM_TIMEFRAMEStimeframe,// Zeitraum
datetimestart_time,// ab welchem Datum
datetimestop_time,// bis zu welchem Datum
datetimetime_array[]//Array zum Kopieren der Öffnungszeit
);

Zurückgegebener Wert

Anzahl der kopierten Array-Elemente oder -1 im Falle eines Fehlers.


Sie können iBarShift() verwenden, um 2 Balken nach Zeit zu finden


 
Igor Makanu:

Wenn die TF synchronisiert ist, kann jede CopyXXXX()-Funktion :

Bezugnahme auf das Start- und Enddatum des gewünschten Zeitintervalls

intCopyTime(
stringsymbol_name,// Name des Symbols
ENUM_TIMEFRAMEStimeframe,// Zeitraum
datetimestart_time,//ab welchem Datum
datetimestop_time,// bis zu welchem Datum
datetimetime_array[]//Array zum Kopieren der Öffnungszeit
);

Zurückgegebener Wert

Anzahl der kopierten Array-Elemente oder -1 im Falle eines Fehlers.


Das ist seltsam... Ich kann mich nicht erinnern, dass es diese Funktionen in mt4 vorher gab. Wurden sie auch zu Fünfen hinzugefügt?