Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 121
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
Hallo. Bitte beraten Sie, wie man im Code von MQL4 EA die Regel des Öffnens einer Bestellung vorschreiben kann: es sollte eine Bestellung mit einer bestimmten magischen Zahl auf dem Markt sein; wenn es keine solche Bestellung gibt, öffnet der EA nichts nach seinem Hauptalgorithmus.
Weiter geht es nicht:
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Wie kann ich es einem Benutzer ermöglichen , ein Feld zu füllen?
Wie kann ich es einem Benutzer ermöglichen , ein Feld zu füllen?
Guten Tag, es gibt einen Indikator, der die Auftragshistorie im Diagramm anzeigt, 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()
{
int CountOrders=0;
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";}
//Расчет профита
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();
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");
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);
//Фон профита
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();
}
}
Einzelne Trades zeichnet der Indikator korrekt (Linie>Hintergrund>Gewinn), aber bei der Anzeige von geschlossenen Ordersätzen gibt es einen kleinen "Bug" (Screenshot anbei), 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 mir, das Problem zu beheben.
Wer außer dem Benutzer kann sie ausfüllen?
Ich meine, wie man sie über die Einstellungen ausfüllt. Sagen wir, durch eine Zeichenkette, und dann schieben ihren Wert in ein Array...
Ich meine, wie man sie über die Einstellungen ausfüllt. Sagen wir durch eine Zeichenkette, und dann setzen Sie ihren Wert in ein Array...
Weiter geht es nicht:
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Weiter geht es nicht:
void OnTick()
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Примерно так можно:
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Спасибо большое, попробую.
Es ist in etwa so.
Ich danke Ihnen!
ORDER_TYPE_BUY_STOP ist im MQL4 Editor hervorgehoben, aber nicht in der MQL4 Hilfe. Frage: Funktioniert es in MQL4, entspricht es dem Typ OP_BUYSTOP? Ich habe nur noch keine Zeit, es zu überprüfen.
Ja, das funktioniert zu 100 %, das ist die einzige Art, wie ich jetzt schreibe. Jetzt sind viele Dinge von Fünf nach Vier gewandert.
Sogar das hier funktioniert, obwohl der Compiler schwor, es sei eine Trendlinie
ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,p1);
ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,1,t2);
ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,1,p2);