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
Benutzerdefinierte Zeiteingabe bei MQL4
Ist es möglich, einen Code mit MQL4 zu schreiben, der eine horizontale Linie ab einem vom Benutzer definierten Balken bis zum Ende des Charts zeichnen kann?
Hier ist der gleiche Code mit Metastock
Dy:=Input("Day",1,31,1);
Mn:=Input("Month",1,12,1);
Yr:=Input("Year",2000,2012,2010);
{Time Calculation}
Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();
{Formula}
Start:= ValueWhen(1,Time,CLOSE);
{Output}
Start;Und hier ist das Ergebnis
Ich hoffe, dass ich das Gleiche mit MQL4 machen kann
Versuchen Sie es so:
extern string startFrom = "2012.07.06 00:00";
int init() { return(0); }
int deinit() { ObjectDelete("hLine"); return(0); }
int start()
{
string name = "hLine";
int barShift = iBarShift(NULL,0,StrToTime(startFrom));
ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
ObjectSet(name,OBJPROP_PRICE1,Close);
ObjectSet(name,OBJPROP_PRICE2,Close);
ObjectSet(name,OBJPROP_TIME1,Time);
ObjectSet(name,OBJPROP_TIME2,Time[0]);
return (0);
}Kopieren Sie einfach den Code und fügen Sie ihn in einen Indikator ein (es handelt sich um einen bereits funktionierenden Indikator) und fügen Sie ihn in den Chart ein.
Ist es möglich, einen Code mit MQL4 zu schreiben, der eine horizontale Linie ab einem vom Benutzer definierten Balken bis zum Ende des Charts zeichnen kann?
Hier ist der gleiche Code mit Metastock
Dy:=Input("Day",1,31,1);
Mn:=Input("Month",1,12,1);
Yr:=Input("Year",2000,2012,2010);
{Time Calculation}
Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();
{Formula}
Start:= ValueWhen(1,Time,CLOSE);
{Output}
Start;Und hier ist das Ergebnis
Ich hoffe, dass ich das Gleiche mit MQL4 machen kann.Versuchen Sie es so:
extern string startFrom = "2012.07.06 00:00";
int init() { return(0); }
int deinit() { ObjectDelete("hLine"); return(0); }
int start()
{
string name = "hLine";
int barShift = iBarShift(NULL,0,StrToTime(startFrom));
ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
ObjectSet(name,OBJPROP_PRICE1,Close);
ObjectSet(name,OBJPROP_PRICE2,Close);
ObjectSet(name,OBJPROP_TIME1,Time);
ObjectSet(name,OBJPROP_TIME2,Time[0]);
return (0);
}Du bist der Beste, vielen Dank mladen
Hallo Mladen,
Kannst du mir mehr über den Sinn der Funktionen hier erzählen? Ich verstehe es immer noch nicht ganz. Danke
Terrance
Versuchen Sie diese Funktion :
{
int openedOrders = 0;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == type) openedOrders++;
}
return(openedOrders);
}
[/PHP]
To count opened buy orders, call it like this :
to count opened sell orders, call it like this :
[PHP]int openedSells = countOpened(OP_SELL);tkuan77
Sie wollten die Aufträge auf jeweils 1 Kauf und 1 Verkauf beschränken.
Wenn Sie also den Zähler für offene Aufträge aufrufen, bevor Sie eine der Positionen eröffnen, können Sie kontrollieren, wie viele offene Käufe oder Verkäufe Sie haben.
Ein Beispiel:
Wenn openBuys irgendetwas anderes als 0 ist, wird kein neuer Kaufauftrag eröffnet. Dieselbe Logik gilt für Verkäufe (das ist das zweite Beispiel in diesem Beitrag).
Hallo Mladen,
Können Sie mir mehr über die Logik der Funktionen hier erzählen? Ich verstehe es immer noch nicht ganz. Danke
TerranceHallo Mladen,
Vielleicht habe ich mich falsch ausgedrückt. Was ich versuche zu erreichen, ist, wenn meine Kaufkriterien erfüllt sind, wird ein Kauf ausgelöst und wenn ein anderes Kaufkriterium wieder erfüllt ist, wird ein weiterer Kauf ODER Verkauf ausgelöst, wenn das Verkaufskriterium erfüllt ist. Allerdings kann ich zu jedem Zeitpunkt maximal 2 Trades tätigen.
Ich habe Ihre Methode bereits ausprobiert, und ich erlebe immer noch, dass das System 2 Trades gleichzeitig öffnet, weshalb ich versucht habe, es mit der Funktion Bars zu begrenzen, wobei das gleiche Problem auftritt, dass der EA 2 Trades gleichzeitig öffnet.
Was könnte hier die mögliche Ursache sein? Ist es etwas mit meiner Logik zu tun?
Mit freundlichen Grüßen
Terrance
tkuan77
Sie wollten die Aufträge auf jeweils 1 Kauf- und 1 Verkaufsauftrag beschränken.
Wenn Sie also den Zähler für geöffnete Aufträge aufrufen, bevor Sie eine der Positionen öffnen, können Sie kontrollieren, wie viele geöffnete Käufe oder Verkäufe Sie haben.
Ein Beispiel:
Sie können prüfen, ob zu einem aktuellen Takt bereits eine Order irgendeiner Art eröffnet wurde, und auf diese Weise verhindern, dass beim nächsten Tick eine neue Order eröffnet wird. Wenn ja (es wurde bereits eine Order im aktuellen Takt eröffnet), dann wird keine neue Order eröffnet. Wenn nein, können Sie eine neue Order eröffnen. Hier ist eine Funktion, die Ihnen Aufträge vom Typ "rewired" zählen kann, die zu einem aktuellen Takt geöffnet wurden
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != type) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
Hallo Mladen,
Vielleicht habe ich mich falsch ausgedrückt. Was ich zu erreichen versuche, ist, wenn meine Kaufkriterien erfüllt sind, wird ein Kauf ausgelöst, und wenn ein weiteres Kaufkriterium erfüllt ist, wird ein weiterer Kauf oder Verkauf ausgelöst, wenn das Verkaufskriterium erfüllt ist. Allerdings kann ich zu jedem Zeitpunkt maximal 2 Trades tätigen.
Ich habe Ihre Methode bereits ausprobiert, und ich erlebe immer noch, dass das System 2 Trades gleichzeitig öffnet, weshalb ich versucht habe, es mit der Funktion Bars zu begrenzen, wobei das gleiche Problem auftritt, dass der EA 2 Trades gleichzeitig öffnet.
Was könnte hier die mögliche Ursache sein? Ist es etwas mit meiner Logik zu tun?
Viele Grüße
TerranceHallo Mladen,
Vielleicht habe ich mich falsch ausgedrückt. Was ich zu erreichen versuche, ist, wenn meine Kaufkriterien erfüllt sind, wird ein Kauf ausgelöst, und wenn ein weiteres Kaufkriterium erfüllt ist, wird ein weiterer Kauf oder Verkauf ausgelöst, wenn das Verkaufskriterium erfüllt ist. Allerdings kann ich zu jedem Zeitpunkt maximal 2 Trades tätigen.
Ich habe Ihre Methode bereits ausprobiert, und ich erlebe immer noch, dass das System 2 Trades gleichzeitig öffnet, weshalb ich versucht habe, es mit der Funktion Bars zu begrenzen, wobei das gleiche Problem auftritt, dass der EA 2 Trades gleichzeitig öffnet.
Was könnte hier die mögliche Ursache sein? Ist es etwas mit meiner Logik zu tun?
Mit freundlichen Grüßen
TerranceDas liegt daran, dass Sie nicht angegeben haben, wie sich der zweite Handel vom ersten unterscheiden soll. Die Differenzierung könnte in Form von x Balken oder eines Preises weg vom FirstBuyPrice erfolgen.
Vielen Dank Mladen für die Hilfe, aber ich möchte nur mit Ihnen zu überprüfen, setze ich den Code vor dem meine long/short-Funktion, dazwischen oder irgendwo anders? Denn es scheint immer wieder ein Fehler aufzutauchen und ich kann die Quelle dafür nicht finden. Und sollte MagicNumber eine ganze Zahl sein?
Terrance
total = OrdersTotal();
if(gesamt < 2)
{
int countOpenedOnACurrentBar(int type)
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) weiter;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != Typ) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Mein EA",12345,0,Grün);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der BUY-Order : ",GetLastError());
return(0);
}
if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"Mein EA",12345,0,Rot);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der SELL-Order : ",GetLastError());
return(0);
}
return(0);
}
Sie können die Prüfung hinzufügen, ob eine Order irgendeines Typs bereits zu einem aktuellen Takt geöffnet wurde, und auf diese Weise das Öffnen einer neuen Order beim nächsten Tick verhindern. Wenn ja (es wurde bereits eine Order auf dem aktuellen Balken eröffnet), dann wird keine neue Order eröffnet. Wenn nein, können Sie eine neue Order eröffnen. Hier ist eine Funktion, die Ihnen die zum aktuellen Takt geöffneten Orders des Typs "rewired" zählen kann
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != type) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
...
Terrance
Das ist eine Funktion. Stellen Sie sie an das Ende Ihres EA und rufen Sie sie dort auf, wo Sie es für angebracht halten, um zu prüfen, ob zu einem aktuellen Takt bereits eine Order eröffnet wurde.
Vielen Dank, Mladen, für die Hilfe, aber ich möchte nur mit dir abklären, ob ich den Code vor meiner Long/Short-Funktion, dazwischen oder irgendwo anders einfüge? Denn es scheint immer wieder ein Fehler aufzutauchen und ich kann die Quelle dafür nicht finden. Und ist MagicNumber angenommen, um eine ganze Zahl sein?
Terrance
total = OrdersTotal();
if(gesamt < 2)
{
int countOpenedOnACurrentBar(int type)
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) weiter;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != Typ) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Mein EA",12345,0,Grün);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der BUY-Order : ",GetLastError());
return(0);
}
if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"Mein EA",12345,0,Rot);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der SELL-Order : ",GetLastError());
return(0);
}
return(0);
}