Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 122
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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):