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

 

Ich habe beschlossen, die vorherige Frage zu ergänzen.

1)

Angenommen, ich habe ein Signal - wenn sich der Spread stark ausweitet (aufgrund der Nachrichten)

Alle laufenden Geschäfte schließen

Aber die Aufträge werden nicht nur während der Nachrichten geschlossen oder geöffnet.

Wenn wir also einen Befehl, z. B. OrderClose, in eine Schleife + Sleep (3000) packen und ihn ausführen, bis er geschlossen wird

2)

Wenn wir eine interne Variable in der Schaltfläche binden und den Wert "gedrückt/geschlossen" der Möglichkeit zum Öffnen der Bestellung zuweisen, wird dies in Echtzeit funktionieren?

 
trader781:

Ich habe beschlossen, die vorherige Frage zu ergänzen.

1)

Angenommen, ich habe ein Signal - wenn sich der Spread stark ausweitet (aufgrund der Nachrichten)

Alle laufenden Geschäfte schließen

Aber die Aufträge werden nicht nur während der Nachrichten geschlossen oder geöffnet.

Wenn wir also einen Befehl, z. B. OrderClose, in eine Schleife + Sleep (3000) packen und ihn ausführen, bis er geschlossen wird

2)

Wenn wir eine interne Variable in der Schaltfläche binden und den Wert "gedrückt/geschlossen" der Möglichkeit zum Öffnen der Bestellung zuweisen, wird dies in Echtzeit funktionieren?

1) Es ist nicht Sleep(3000), sondern die Fehlerbehandlung, die hilft.
 

Guten Tag, ich schreibe einen Indikator, der dieAuftragshistorie in einem Diagrammzeichnet, Code:

//+------------------------------------------------------------------+
//|                                                      history.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern int        MagicNumber                = 1110;
extern datetime   HistoryOrdersFromDateTime  = 0;
extern color      SellColor                  = clrRed;
extern color      BuyColor                   = clrBlue;
extern color      ProfitColor                = clrWhite;
extern bool       DeleteHistoryOrders        = false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
      {
         if(HistoryOrdersFromDateTime<OrderCloseTime())
         {
            if((TimeCurrent()-OrderCloseTime())>60)
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
   datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
   string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
   color col=SellColor;
   if(OrderType()==0) {col=BuyColor; type="Buy";}

   if(DeleteHistoryOrders==false)
   {
      //Начальная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
      
      //Линия  
      ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
  
      //Конечная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
      
      //Размер фона  
      for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
         StringAdd(Background,"g");
      
      //Фон профита
      ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
      ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
  
      //Профит
      ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
   } else ObjectsDeleteAll(0, "#"+Ticket+" ");  
}

void OnDeinit(const int reason)
{  
   //Удалаение истории ордеров
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      DeleteHistoryOrders=true;
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         HistoryOrders();
   }
}

Der Indikator zeichnet einzelne Trades korrekt (Linie>Hintergrund>Gewinn), aber es gibt einen kleinen "Bug" in der Anzeige von geschlossenen Ordersätzen (Screenshot angehängt), die Linien überlagern den Hintergrund und den Gewinn (Linie(1)>Hintergrund>Gewinn>Linie(2)>Linie(3)>Linie(4) .. . . . .).

Sie sollte folgendermaßen aussehen: (Zeile(1)>Zeile(2)>Zeile(3)>Zeile(4) . . . >Fon>Gewinn). Verschiedene Manipulationen waren nicht erfolgreich, bitte helfen Sie bei der Verfeinerung.

Dateien:
 
ilnur17021992:

Guten Tag, ich schreibe einen Indikator, der dieAuftragshistorie in einem Diagrammanzeigt,


Der Indikator rendert ein einzelnes Geschäft korrekt (Linie>Hintergrund>Gewinn), aber in der Anzeige eines geschlossenen Ordersatzes gibt es ein kleines "Shosh" (ich füge einen Screenshot bei), die Linien (Linie(1)>Hintergrund>Gewinn>Linie(2)>Linie(3)>Linie(4) . . . ...) werden vom Hintergrund und dem Gewinn überlagert. ).

Sie sollte folgendermaßen aussehen: (Zeile(1)>Zeile(2)>Zeile(3)>Zeile(4) . . . >Fon>Gewinn). Verschiedene Tamburine haben sich nicht bewährt, bitte helfen Sie mir, sie zu verfeinern.

Versuchen Sie, der Eigenschaft OBJPROP_BACK Linien und Symbole im Hintergrund zuzuweisen.
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov:
Versuchen Sie, die Eigenschaft OBJPROP_BACK den Linien und Symbolen im Hintergrund zuzuweisen.
Die Linien werden im Hintergrund (hinter den Kerzenständern) gezeichnet, während die Zeichnung über den Kerzenständern liegen sollte: Kerzenständer>Linien>Gewinn Hintergrund>Gewinn
Dateien:
 
ilnur17021992:
Keine Option, also sind die Linien im Hintergrund (hinter den Kerzenständern), und die Zeichnung sollte über den Kerzenständern sein: Kerzenständer>Linien>Gewinn>Gewinn Hintergrund
Dann nur die Reihenfolge der Zeichnung auf der Karte. Oder wir sollten beim Zeichnen des Hintergrunds und des Gewinns das Vorhandensein dieser Objekte nach Zeit prüfen, den Gewinnwert im OBJ_TEXT-Objekt lesen und ihn zum Gewinn des aktuellen Auftrags hinzufügen. Dann sollten wir den Hintergrund und den Gewinn löschen und sie neu zeichnen.
Dadurch entfällt übrigens ein zusätzlicher Zyklus für die Gewinnberechnung.

Sie können dies tun
      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
legen Sie den Gewinn am Anfang zusammen mit allen anderen Auftragsparametern fest.

ps Bitte. Platzieren Sie ein Bild mit dieser Schaltfläche
 
Alexey Viktorov:
Dann nur die Reihenfolge der Zeichnung auf der Karte. Oder wir sollten beim Zeichnen von Hintergrund und Gewinn die Verfügbarkeit dieser Objekte nach Zeit prüfen, den Wert des Gewinns im OBJ_TEXT-Objekt lesen und ihn zum Gewinn des aktuellen Auftrags addieren. Dann sollten wir den Hintergrund und den Gewinn löschen und sie neu zeichnen.
Damit entfällt übrigens ein zusätzlicher Zyklus für die Gewinnberechnung.
Den Gewinn legen Sie zu Beginn zusammen mit allen anderen Auftragsparametern fest.

Wie lege ich diese Zeichenreihenfolge fest, d. h. ich zeichne zuerst alle Punkte und die sie verbindenden Linien und fahre dann fort, den Hintergrund und den Gewinn zu zeichnen?

 
ilnur17021992:

Wie lege ich diese Zeichenreihenfolge fest, d. h. ich zeichne zuerst alle Punkte und die sie verbindenden Linien und fahre dann fort, den Hintergrund und den Gewinn zu zeichnen?

Nun, wenn es nach meiner ersten Annahme geht, dann ja. Und dann hatte ich sofort einen spontanen Gedanken und habe den ersten Satz nicht gelöscht, aber der zweite gefällt mir besser.

Sie sollten diese Variante in Betracht ziehen.

ObjectFind() dann wenn das Objekt gefunden wird ObjectGetString() konvertiert es von Text in Zahl, addiert den Gewinn der letzten Bestellung zum erhaltenen Wert, löscht den veralteten OBJ_TEXT und zeichnet einen neuen.
Wenn es sich um den ersten oder einzigen Auftrag handelt, der auf diesem Balken geschlossen wurde, zeichnen wir einfach
OBJ_TEXT und das war's.
Um die Sache zu vereinfachen, sollten wir anstelle des Tickets die Uhrzeit der Öffnung der Bar angeben. Oder wird das Ticket für weitere Arbeiten benötigt?

 
Alexey Viktorov:
Nun, wenn ich das richtig sehe, schon. Und dann hatte ich sofort einen spontanen Gedanken und habe den ersten Satz nicht gelöscht, aber der zweite gefällt mir besser.

Sie sollten diese Variante in Betracht ziehen.

ObjectFind() dann wenn das Objekt gefunden wird ObjectGetString() konvertiert es von Text in Zahl, addiert den Gewinn der letzten Bestellung zum erhaltenen Wert, löscht den veralteten OBJ_TEXT und zeichnet einen neuen.
Wenn es sich um den ersten oder einzigen Auftrag handelt, der auf diesem Balken geschlossen wurde, zeichnen wir einfach
OBJ_TEXT und das war's.
Um die Sache zu vereinfachen, sollten wir anstelle des Tickets die Uhrzeit der Öffnung der Bar angeben. Oder wird das Ticket für weitere Arbeiten benötigt?

Ja, das Ticket wird für die spätere Analyse der Geschichte benötigt. Vielen Dank für den Tipp zum Umzeichnen. Ich habe das Problem etwas einfacher gelöst, indem ich diese Prüfung hinzugefügt und den Code neu gezeichnet habe:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Ich weiß nicht, ob es richtig ist, aber im Prinzip zeichnet es so, wie es sein sollte (Linien>Fon>Gewinn):

 
ilnur17021992:

Ja, das Ticket wird benötigt, um den Verlauf später zu analysieren. Ich habe das Problem etwas einfacher gelöst, indem ich dem Code eine solche Prüfung und ein erneutes Zeichnen hinzugefügt habe:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Grundsätzlich wird korrekt gezeichnet (Linien>Hintergrund>Gewinn):

Nun, das ist gut, ich freue mich für dich.