Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Kerzenwechsel (http://www.expert-advisor.com/forum/showthread.php?t=4993)

dieter23 07.06.16 22:01

Kerzenwechsel
 
Hallo,
1. wie kann ich einen Kerzenwechsel d.h. long Kerze nach short Kerze u. umgekehrt abfragen.

2. nach Eröffnen eines Trades soll nach z.B. 4 Kerzen die Position wieder geschlossen werden.

Bitte um Hilfe.
Gruß Dieter

traderdoc 07.06.16 22:15

zu1.)
Long- zu Short-Kerze:

if (Close[2] > Open[2] && Close[1] < Open[1])

Short- zu Long-Kerze:

if (Close[2] < Open[2] && Close[1] > Open[1])

zu 2.)
if (Time[0] > OrderOpenTime() + 4*Period()*60)

traderdoc

dieter23 08.06.16 08:40

Danke für die schnelle Antwort
LG
Dieter

dieter23 08.06.16 12:09

Hab mal versucht das Schließen der Order in den Ea einzubauen. Klappt leider nicht.Wo ist der Fehler?


extern int StopLoss=50;
extern int TakeProfit=50;

//+------------------------------------------------------------------+

void start()
{
double SL,TP;
int i,Total;
int Dig=MarketInfo(Symbol(),MODE_DIGITS);
int order_ticket;
//+------------------------------------------------------------------+

Total=OrdersTotal();
if(Total>0)
{
for(i=Total-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderStopLoss()==0 && OrderTakeProfit()==0)
{


if(StopLoss>0)SL=OrderOpenPrice()+StopLoss*Point;e lse SL=0;
if(TakeProfit>0)TP=OrderOpenPrice()-TakeProfit*Point;else TP=0;
OrderModify(OrderTicket(),OrderOpenPrice(),Normali zeDouble(SL,Dig),NormalizeDouble(TP,Dig),0,CLR_NON E);
if (Time[0] > OrderOpenTime() + 2*Period()*60)

OrderClose(OrderTicket(),0.1,Bid,3,0);
return(0);


}
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderStopLoss()==0 && OrderTakeProfit()==0)
{
if(StopLoss>0)SL=OrderOpenPrice()-StopLoss*Point;else SL=0;
if(TakeProfit>0)TP=OrderOpenPrice()+TakeProfit*Poi nt;else TP=0;
OrderModify(OrderTicket(),OrderOpenPrice(),Normali zeDouble(SL,Dig),NormalizeDouble(TP,Dig),0,CLR_NON E);
if (Time[0] > OrderOpenTime() + 2*Period()*60)

OrderClose(OrderTicket(),0.1,Ask,3,0);
return(0);

}
}
}
}
}

traderdoc 08.06.16 15:29

"Klappt leider nicht" ist zwar das Endergebnis Deiner Beobachtung, mit der man aber manchmal sehr wenig anfangen kann. In diesem Falle ist der Fehler offensichtlich, dass bei OrderClose() die BuyOrder mit dem Bid und die SellOrder mit dem Ask geschlossen werden muß! Vorausgesetzt die Lotgröße beträgt tatsächlich 0.1.

Also, wenn irgendwas nicht klappt, dann gibt es in der Regel auch eine Fehlermeldung des MT4 im Terminal unter Reiter "Expert". Und in diesem Falle bin ich mir sicher, dass da stand: INVALID_PRICE.

traderdoc

dieter23 08.06.16 16:47

habe Bid und Ask getauscht, Order wird nicht beendet, läuft einfach weiter .
Beim Kompilieren erscheint keine Fehlermeldung nur Warnings.
Gruß
Dieter

traderdoc 08.06.16 17:06

Nein, ich meine nicht beim Compilieren, sondern wenn der EA im Chart läuft, werden alle Fehlermeldungen im Terminal unter dem Reiter "Expert" aufgelistet. Wenn der EA also zum erwarteten Zeitpunkt nicht schließt könnte da eine Meldung stehen.

Und dann nimm bitte zum Schreiben des Codes den Button # über dem Textfeld. Den Code kann man dann viel besser lesen.

Desweiteren wird der EA dann die Orders nicht schließen, weil über

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderStopLoss()==0 && OrderTakeProfit()==0)

in diesen Teil nur eingesprungen wird, wenn auch tatsächlich SL und TP 0 sind. Das aber darunter der SL und TP in der Order gesetzt werden, würde beim nächsten Tick nicht mehr die Bedingung erfüllt sein und damit würde die Zeile

OrderClose(OrderTicket(),0.1,Bid,3,0);

nicht durchlaufen werden - also auch kein Close.

Es macht sich gut, immer an bestimmten Stellen ein Print("Irgendetwas"); einzufügen. Dann sieht man im Reiter Expert des Terminals nämlich, wo der EA langgelaufen ist und wo eben nicht.

traderdoc

dieter23 08.06.16 18:13

ok, hat geklappt. Jetzt noch Punkt 1. Umkehrkerze einbauen. Wo kann man die Abfrage am besten einbauen?
Danke im vorraus
Dieter

traderdoc 08.06.16 18:19

Am Anfang mittels:

Code:

//global datetime OldBar; deklarieren
if (OldBar != Time[0]) {
  //Abfrage und evtl. Aktion oder Variablensetzung zur späteren Verarbeitung
  OldBar = Time[0]
}

Diese if-Abfrage wird nur einmal am Anfang der Kerze durchlaufen.

traderdoc

dieter23 08.06.16 19:13

verstehe ich jetzt nicht. Wird mit dieser Abfrage festgestellt ob ein Kerzenwechsel vorliegt?


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:50 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum