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?
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.
//Конечная точка 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(); } } }
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.
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.
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
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?
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++; } } }
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++; } } }
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
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?
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?
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.
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, die Eigenschaft OBJPROP_BACK den Linien und Symbolen im Hintergrund zuzuweisen.
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
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();
}
}
}
ps Bitte. Platzieren Sie ein Bild mit dieser Schaltfläche
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?
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?
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?
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):
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):