Wie programmiert man? - Seite 299

 

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

{Customer Inputs}

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:

#property indicator_chart_window

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.

kappari:
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

{Customer Inputs}

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.
 
mladen:
Versuchen Sie es so:
#property indicator_chart_window

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 es einfach und fügen Sie es in einen Indikator ein (es ist ein bereits funktionierender Indikator) und fügen Sie ihn in den Chart ein.

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

mladen:
Versuchen Sie diese Funktion :
int countOpenedOrders(int type)

{

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 :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
und dann können Sie prüfen
:if openedBuys==0 open buy

if openedSells==0 open 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:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

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).

tkuan77:
Hallo Mladen,

Können Sie mir mehr über die Logik der Funktionen hier erzählen? Ich verstehe es immer noch nicht ganz. Danke

Terrance
 

Hallo 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

mladen:
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:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
Wenn openBuys irgendetwas anderes als 0 ist, wird kein neuer Kaufauftrag eröffnet. Dieselbe Logik gilt für den Verkauf (das ist das zweite Beispiel in diesem Beitrag)
 

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 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) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
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

Terrance
 
tkuan77:
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?

Mit freundlichen Grüßen

Terrance

Das 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);

}

mladen:
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 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) 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.

tkuan77:
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);

}