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

 

@STARIJ Danke, ich habe mir beim Schreiben vonObjectSet Zeit gelassen! Es ist schon lange geschrieben, nicht kommentiert, und der Code stört nicht! Sie habenStringSubstr(str,20,7)geschrieben, ich dachte nicht, dass das alles wörtlich zu nehmen ist! Nach dem Abendessen wurde mir klar, dass es nur um die Räume ging! Ich hätte jedes Zeichen und jedes Leerzeichen zählen müssen! Danke Freund!!!!


 

Hallo, liebe Freunde. Eine weitere Frage von einem μl4-Neuling. Ich verwende die im Lehrgang empfohlene Funktion Fun_New_Bar(), um einen neuen Balken zu definieren:


void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }
Aus irgendeinem Grund funktioniert dies jedoch nicht immer. Ich habe einen Druckcheck eingereicht:
if(Hour()>=8 && Hour()<20) 
      {
      Fun_New_Bar();
      if(New_Bar==false) Print("Нового бара нет");
      if(New_Bar==true )      
       {     
       RefreshRates();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Es wird also eine Position auf einem neuen Balken eröffnet, dann wird "Kein neuer Balken" gedruckt und eine Position auf dem aktuellen Balken eröffnet. Ich kann nicht verstehen, warum. Ich danke Ihnen.

 
novichok2018:

Hallo, liebe Freunde. Eine weitere Frage von einem μl4-Neuling. Ich verwende die im Lehrgang empfohlene Funktion Fun_New_Bar(), um einen neuen Balken zu definieren:

Aber irgendwie funktioniert das nicht immer. Ich habe einen Druckcheck eingereicht:

Es wird also eine Position auf einem neuen Balken eröffnet, dann wird "Kein neuer Balken" gedruckt und eine Position auf dem aktuellen Balken eröffnet. Ich kann nicht verstehen, warum. Ich danke Ihnen.

Wie unterscheiden Sie zwischen dem neuen Balken und dem aktuellen Balken? Wie oft wird dieser Teil des Codes ausgeführt - bei jedem Tick oder nur, wenn ein neuer Balken gebildet wird?

 
STARIJ:

Wie unterscheiden Sie zwischen dem neuen Balken und dem aktuellen Balken? Wie oft wird dieser Teil des Codes ausgeführt - bei jedem Tick oder nur, wenn ein neuer Balken gebildet wird?

Neue Leiste - nach Funktion. Aktueller Balken - bei dem eine Position geschlossen wurde, die Balkenzeit aber noch nicht abgelaufen ist. Der Code muss im Moment der Entstehung einesneuen Balkens ausgeführt werden.Oder besser gesagt, nicht so. Der Teil des Codes, in dem die Bedingungen für das Schließen der Position definiert sind, wird bei jedem Tick ausgeführt, während die Bedingungen für das Öffnen der Position bei einem neuen Takt ausgeführt werden.

 
novichok2018:

Neue Leiste - nach Funktion. Aktuell - wenn die Position geschlossen wurde, die Sperrzeit aber noch nicht abgelaufen ist. Der Code muss in dem Moment ausgeführt werden, in dem derneue Balken gebildet wird.Oder besser gesagt, sie ist es nicht. Der Teil des Codes, in dem die Bedingungen für das Schließen der Position definiert sind, wird bei jedem Tick ausgeführt, während die Bedingung für das Öffnen der Position bei einem neuen Takt ausgeführt wird.

Hier ist also alles klar. Aber wenn Sie beim Schreiben sehen, dass Sie es genauer schreiben sollten, bewegen Sie den Cursor zurück und korrigieren Sie. Andernfalls ist es schwierig, sie so und so zu lesen.

Der Code wird bei jedem Tick ausgeführt. D.h. die Frage "Gibt es eine neue Bar? Gibt es eine neue Bar? Gibt es einen neuen Balken? und jedes Mal wird eine Meldung gedruckt, dass es keinen neuen Balken gibt. Und dann gibt es noch eine neue Bar. Die Bestellung wird eröffnet? Zunächst wird ein Befehl an den Server gesendet. Und dann kommen die Zecken rein und es gibt einen neuen Balken? Es gibt eine neue Bar und jedes Mal, wenn es keine neue Bar gibt, eröffnet der Kellner endlich eine Bestellung und man schaut auf die Uhr und fragt sich, wie spät es ist. Sie können Print(TimeCurrent()) vor der Eröffnung eines Auftrags verwenden, 4 Zeilen unterhalb der ersten. Oder noch besser: Verwenden Sie Alert - direkt auf dem Bildschirm. Das können Sie auf einen Blick sehen.

Noch etwas: Anstelle von if(New_Bar==false) if(New_Bar==true) können Sie if(!New_Bar) if(New_Bar) verwenden, sonst bekommen Sie butterweiches Öl

 
STARIJ:

Kurzum, hier ist alles klar. Aber wenn Sie schreiben und sehen, dass Sie genauer schreiben müssen, bringen Sie den Cursor zurück und korrigieren Sie ihn. Es ist schwer, sie so und so zu lesen.

Der Code wird bei jedem Tick ausgeführt. D.h. die Frage "Gibt es eine neue Bar? Gibt es eine neue Bar? Gibt es einen neuen Balken? und jedes Mal wird eine Meldung gedruckt, dass es keinen neuen Balken gibt. Und dann gibt es noch eine neue Bar. Die Bestellung wird eröffnet? Zunächst wird ein Befehl an den Server gesendet. Und dann kommen die Zecken rein und es gibt einen neuen Balken? Es gibt einen neuen Balken, und jedes Mal, wenn es keinen neuen Balken gibt, eröffnet die Bedienung endlich eine Bestellung, und man schaut auf die Uhr und fragt sich, wie spät es ist. Sie können Print(TimeCurrent()) vor der Eröffnung eines Auftrags verwenden, 4 Zeilen unterhalb der ersten. Oder noch besser: Verwenden Sie Alert - direkt auf dem Bildschirm. Das können Sie auf einen Blick sehen.

Und noch etwas: Anstelle von if(New_Bar==false) if(New_Bar==true) können Sie if(!New_Bar) if(New_Bar) verwenden, sonst erhalten Sie Öl

Ok, mit der Meldung über das Fehlen einer neuen Leiste ist alles klar. Der von der Plattform im Journal angezeigte Zeitpunkt der Auftragseröffnung ist für mich auch ohne einen zusätzlichen Druck ausreichend. Ich verstehe jedoch immer noch nicht, warum eine Order einmal auf einem neuen Balken und das zweite Mal auf dem aktuellen Balken eröffnet wird, obwohl laut Code ein neuer Balken erscheinen sollte, bevor nach Bedingungen für die Eröffnung der Position gesucht wird.

 
novichok2018:

OK, mit der Nachricht über das Fehlen einer neuen Leiste ist alles klar. Der von der Plattform im Protokoll ausgedruckte Zeitpunkt der Auftragseröffnung ist für mich auch ohne den zusätzlichen Druck ausreichend. Ich verstehe jedoch immer noch nicht, warum die Order einmal auf einem neuen Balken und das zweite Mal auf dem aktuellen Balken eröffnet wird, obwohl laut Code ein neuer Balken erscheinen sollte, bevor nach Bedingungen für die Eröffnung der Position gesucht wird.

Zunächst wird ein Befehl an den Server gesendet. In der Zwischenzeit kommen die Zecken und Gibt es einen neuen Balken? Es gibt einen neuen Balken, und jedes Mal, wenn es keinen neuen Balken gibt, eröffnet der Server schließlich eine Bestellung, und man schaut auf die Uhrzeit und wundert sich. Sie können Print(TimeCurrent( )) vor der Eröffnung eines Auftrags verwenden, 4 Zeilen unterhalb der ersten. Oder noch besser: Verwenden Sie Alert - direkt auf dem Bildschirm. Sie können auf einen Blick sehen, dass der Befehl zum Öffnen des Auftrags früher gesendet wurde, in der neuen Leiste

 

Können Sie mir sagen, wie man eine Schattierungsfarbe zwischen den 2 Indikatorlinien einrichten kann?

Wie in ishimoku

 
Roman Sharanov:

Können Sie mir sagen, wie es möglich ist, eine Schattierungsfarbe zwischen den 2 Linien des Indikators zu haben, wie beim ishimoku

Schauen Sie sich an,wie esdort gemacht wird... Und das Terminal hat wahrscheinlich...

 

Hallo, ich habe begonnen, MQL4 mit den 2013 Video-Tutorials zu studieren, ich habe den Code genau aus dem Video umgeschrieben, einige kleinere Änderungen aus einem anderen hinzufügen, wie ich sie brauche. Als Ergebnis bekomme ich 25 Fehler. Ich habe versucht, nach einer Lösung für diese Fehler zu suchen, aber da sich der Build des Terminals geändert hat und einige Änderungen in der Codierung vorgenommen wurden. Ich wäre dankbar, wenn mir jemand helfen kann, den Code zu bearbeiten oder mir zumindest nützliche Ratschläge zu geben, vielen Dank im Voraus.

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit *= 10;
       Step       *= 10;
       Slippage   *= 10;  
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0)
   {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);
      
      if (ima_1 > ima_2)
      {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      else if(ima_1 < ima_2)
      {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      
   }
   else
   {
      int order_type = FindLastType();
      if (order_type == OP_BUY)
      {
         price = FindLastOrderPrice(OP_BUY);
         if(Ask <= price - Step * Point)
         {
            Lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
            if (ticket > 0)
               ModifiOrders(OP_BUY);
         }
      }
      else if (order_type == OP_SELL)
      {
          price = FindLastOrderPrice(OP_SELL);
         if(Bid <= price + Step * Point)
         {
            Lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
            if (ticket > 0)
               ModifiOrders(OP_SELL);
         }        
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
{
   double avgprice = 0,
          order_lots= 0;
   
   price = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelecti(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
         }
      }
   }
   avgprice = NormalizeDouble(price / order_lots, Digits);
   
   if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
   
   for (i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0;
   for(int i = OrdersTotal ()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ++ otype)
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldlots = OrderLots();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   double oldopenprice;
   int    oldticket;
   
   ticket = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for (int i= OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magic)
              return(OrderType());
      }
   }
   return(-1);   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0;
   for (int i=OrdersTotal()-1 i>=0; i--)
   {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
        }
   }
   
   return(count);

//-------------------------------------------------------------------+

Fehler

Grund der Beschwerde: