|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
mein EA reagiert auf Tick statt auf close[0]
Hallo,
warum reagiert mein EA auf den einzelnen Tick statt auf den letzten close-Kurs des aktuellen Timeframes? Also er hat die sell-Position im M5 Chart geschlossen, sobald der Kurs über dem EMA21 gestiegen ist, obwohl von den aktuellen 5 Minuten erst 3 Minuten vorbei waren, also hat er definitiv den Tick statt den close[0] genommen. Könnt ihr mir bitte sagen, was ich da falsch mache? Code:
if((Close[0]>iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,0))) // here is your close sell rule { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red); } bergaufbergab Hier der EA-Code: Code:
extern int MagicNumber=10001; extern double Lots =0.1; extern double StopLoss=99999; extern double TakeProfit=99999; extern int TrailingStop=0; extern int Slippage=3; //+------------------------------------------------------------------+ // expert start function //+------------------------------------------------------------------+ int start() { double MyPoint=Point; if(Digits==3 || Digits==5) MyPoint=Point*10; double TheStopLoss=0; double TheTakeProfit=0; if( TotalOrdersCount()==0 ) { int result=0; } for(int cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() //&& //derMagicNumber()==MagicNumber ) { if(OrderType()==OP_BUY) { if(TrailingStop>0) { if(Bid-OrderOpenPrice()>MyPoint*TrailingStop) { if(OrderStopLoss()<Bid-MyPoint*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green); return(0); } } } } else { if((Close[0]>iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,0))) // here is your close sell rule { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red); } if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop)) { if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } int TotalOrdersCount() { int result=0; for(int i=0;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS ,MODE_TRADES); if (OrderMagicNumber()==MagicNumber) result++; } return (result); } Geändert von bergaufbergab (01.04.13 um 15:56 Uhr) |
|
|||
Moin,
versuch mal folgendes: PHP-Code:
|
|
|||
Hallo Hoschi,
danke, aber kannst du mir kurz grob sagen, was dein Code macht? Ich steh da grad auf dem Schlauch und bin heute schon zu müde, um mich durch die mql-Doku zu lesen. Ich werde deinen Code testen. Grüße bergaufbergab |
|
|||
Zitat:
Carpe Diem, Hoschie |
|
|||
hat mit deinem Code leider nicht geklappt, er hat jetzt garnicht geschlossen.
Ich habe hier einen Screenshot mit drangehängt, der rote MA ist der 21er. Beim Pfeil hätte er nach dem Balkenende die Position schliessen sollen. Hier mein Einbau-Code, hab ich es so eingebaut wie du gemeint hast? Code:
extern int MagicNumber=10001; extern double Lots =0.1; extern double StopLoss=99999; extern double TakeProfit=99999; extern int TrailingStop=0; extern int Slippage=3; int timeframe; static datetime update = 0; int init() { timeframe = Period(); return(0); } //+------------------------------------------------------------------+ // expert start function //+------------------------------------------------------------------+ int start() { if(update == 0 || TimeLocal() > update + Period() * 60) { double MyPoint=Point; if(Digits==3 || Digits==5) MyPoint=Point*10; double TheStopLoss=0; double TheTakeProfit=0; if( TotalOrdersCount()==0 ) { int result=0; } for(int cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() //&& //OrderMagicNumber()==MagicNumber ) { if(OrderType()==OP_BUY) { if((Close[0]<iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,0))) //here is your close buy rule { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red); } if(TrailingStop>0) { if(Bid-OrderOpenPrice()>MyPoint*TrailingStop) { if(OrderStopLoss()<Bid-MyPoint*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green); return(0); } } } } else { if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop)) { if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } update = TimeLocal()- TimeLocal()%timeframe; } return(0); } int TotalOrdersCount() { int result=0; for(int i=0;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS ,MODE_TRADES); if (OrderMagicNumber()==MagicNumber) result++; } return (result); } |
|
|||
1. Ich sehe im Chart keine Order, daher würde keine Order auch geschlossen werden oder?
2. Müsste der Code nicht wie folgt sein: Close[0] < iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1))) D.h. aktueller Close ist kleiner als iMA shift 1 und nicht 0. shift - Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago). Daher versuch das mal mit folgenden Code Snippet von dir was ich etwas leicht angepasst habe: PHP-Code:
|
|
|||
Hi,
das mit den Shifts hab ich noch nie so richtig kapiert...ich dachte, ich vergleiche den Schlusskurs der gerade beendeten Kerze mit dem gleitenden Durchschnitt bei der gerade beendeten Kerze. Der iMA hat ja als Parameter PRICE_CLOSE und "0" als Parameter, ist das nicht auch sowas wie close[0]?daher dachte ich, der holt sich dann auch einfach den letzten close-Wert des gleitenden Durchschnitts? Wo ist denn da dauernd mein Denkfehler? Achso, hab grade in der mql-Doku beim iMA geschaut, der Parameter shift ist relativ vom AKTUELLEN Balken gemeint, und wenn der Schlusskurs feststeht, ist dieser Balken ja schon nichtmehr der aktuelle, verstehe ich das richtig? Grüße bergaufbergab Geändert von bergaufbergab (02.04.13 um 08:09 Uhr) |
|
|||
Zitat:
nur als Denkhilfe was bedeutet für dich Close[0] oder Close[1], wenn du den Satz Schlusskurs, der gerade beendeten Kerze schreibst? Oder schreib ein kleines Programm, der die Close der aktuell beendeten Kerzen ausgibt. Ich hoffe, damit geholfen zu haben. Der Shift ist nichts weiter als eine Zeitachse. shift relative to the current bar the given amount of periods ago Gruss, Hoschie |
|
|||
ich löse das immer mit
Code:
int sBars = 0; init if (sBars ==0) sBars = Bars; start if (sBars != Bars) { //code } sBars = Bars; |
|
|||
Hallo Zusammen,
ich habe jetzt den Shift 1 eingebaut, aber trotzdem reagiert er noch auf Tick statt auf den geschlossenen Balken. Ich hab euch mal den Screenshot angehängt, und hier die Auslösebedingung: Code:
if((Close[0]>iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1))) // here is your close sell rule { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red); } Also ich habe bei diesem Versuch die Zusatzbedingungen von Hoschie diesmal nicht dringehabt, weil ich dachte, es reicht nun allein der Shift1 als Problemlösung. Aber warum sollte denn allein meine Bedingung jetzt mit Shift1 alleine nicht funktionieren? Die Bedingung konnte doch rein logisch so wie hier im Screenshot garnicht erfüllt sein, oder? Warum genau brauche ich da noch zusätzlich eure Snippets? Die wirken sich doch auf die Bedingung Code:
if((Close[0]>iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1))) Grüße Bergaufbergab |
Lesezeichen |
Stichworte |
close[0], ea, expert-advisor, mql4, programmierung, programmierung metatrader, tick |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|