|
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 |
|
|||
Kopfschmerzen sind fast weg.
Ich plane 2 Erweiterungen. 1. Orders öffnen nur zwischen angegebenen Zeiten, schließen möglich zu jeder Zeit extern time Open_Orders_from:08:00 extern time Open_Orders_till:22:00 if(time >= Open_Orders_from && time <= Open_Orders_till "restliche Bedingungen" OP_BUY/OP_SELL je nach Signal der GDs und restlichen Bedingungen. 2. Automatisches RM/MM, bei dem er immer einstellbare %te des Gesamtkapitals riskiert. Das muss aber aktivierbar/deaktivierbar sein extern bool Automatic_RM/MM: false/true If true:double Lotsize = ""(double)% of Gesamtkapital Hab keine Ahnung davon und es ist spät |
|
|||
@MA-EA findest Du alles hier im Forum, musst Du nur die Suchfunktion benutzen.
traderdoc hat ein paar schöne Codeschnipsel dazu veröffentlicht. Zur Zeitsteuerung findest Du hier etwas: http://www.expert-advisor.com/forum/...sschalten.html Und zum Moneymanagemet hier: http://www.expert-advisor.com/forum/...m-einsatz.html Das Ein- und Ausschalten der Bedingungen solltest Du ja hinkriegen, oder? Ich mach das über ne einfache Abfrage einer bool Variablen. zb: extern bool MM=true; und dann die Abfrage ab der entsprechenden Stelle im Code mit einer if Bedingung. Ansonsten kann ich nur empfehlen die Sprache zu lernen und vielen anderen Code zu lesen. Du kommst viel schneller vorwärts als mit ständigen rumprobieren. |
|
|||
Mahlzeit.
Jemand ne Idee, wie man die Einstiegs-Bedingungen abkürzen könnte, ohne das irgendwelche Bedingungen verloren gehn? Code:
//GDs //Bestaetigung GDs double B1 = iMA(Symbol(), TimeFrame, Bestaetigung_Moving_Average_1, GD_Shift, GD_Type, PRICE_CLOSE, 1);//2 Auch Ausstieg double B2 = iMA(Symbol(), TimeFrame, Bestaetigung_Moving_Average_2, GD_Shift, GD_Type, PRICE_CLOSE, 1);//4 Auch Ausstieg double B3 = iMA(Symbol(), TimeFrame, Bestaetigung_Moving_Average_3, GD_Shift, GD_Type, PRICE_CLOSE, 1);//5 Bestaetigung //Einstieg GDs double E1 = iMA(Symbol(), TimeFrame, Einstieg_Moving_Average_1, GD_Shift, GD_Type, PRICE_CLOSE, 1);//3 Einstieg double E2 = iMA(Symbol(), TimeFrame, Einstieg_Moving_Average_2, GD_Shift, GD_Type, PRICE_CLOSE, 1);//6 Einstieg Code:
//Open Trade if (!IsInvested){ if (Spread <= Max_Spread && LC>E1 && E1>E2 && LC>B1 && B1>B2 && B2>B3 && B1>E1 && B2>E2 && B3>E2 && C>LC) OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Name + " Buy(#" + MagicNumber + ")", MagicNumber, 0, Blue); if (Spread <= Max_Spread && LC<E1 && E1<E2 && LC<B1 && B1<B2 && B2<B3 && B1<E1 && B2<E2 && B3<E2 && C<LC) OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Name + " Sell(#" + MagicNumber + ")", MagicNumber, 0, Red); } |
|
|||
Anscheinend gar nicht. Ich weiß nicht, ob 5 GDs zu viel sind, 60M besser als 30M ist, und ob der Vergleich der Kerze 0 mit Kerze 1 Sinn macht.
Werd morgen mal im Demo mit 4 GDs probieren im 30M und mit Vergleich Kerze 0 und Kerze 1. |
|
|||
Hab nen 4er geschrieben. Wenn das Teil
nicht wenigstens 60% Gewinn-Trades macht, dann weiß ichs auch nicht. Bin mir aber noch nicht ganz sicher beim Ausstieg. 2</>3 oder 2</>4 Da Verluste schneller kommen als Gewinne, wär 2</>3 wohl besser. Besser zu früh raus als zu spät. :wonder: Code:
if (TimeFrame==0) TimeFrame=NULL; double C=iClose(Symbol(), TimeFrame, 0); double LC=iClose(Symbol(), TimeFrame, 1); //GDs double OF=iMA(Symbol(), TimeFrame, Open_Fast_Moving_Average, GD_Shift, GD_Type, PRICE_CLOSE, 1);//3 Open double OS=iMA(Symbol(), TimeFrame, Open_Slow_Moving_Average, GD_Shift, GD_Type, PRICE_CLOSE, 1);//6 Open double BCF=iMA(Symbol(), TimeFrame, Bestaetigung_Close_Fast_Moving_Average, GD_Shift, GD_Type, PRICE_CLOSE, 1);//2 Bestaetigung Close double BCS=iMA(Symbol(), TimeFrame, Bestaetigung_Close_Slow_Moving_Average, GD_Shift, GD_Type, PRICE_CLOSE, 1);//4 Bestaetigung Close //Check position IsInvested=false; for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if((OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) IsInvested=true;}} //Open Trade if (!IsInvested){ if (Spread<=Max_Spread && LC>OF && OF>OS && BCF>BCS && BCF>OF && OF>BCS && C>LC) OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Name + " Buy(#" + MagicNumber + ")", MagicNumber, 0, Blue); if (Spread<=Max_Spread && LC<OF && OF<OS && BCS<BCS && BCF<OF && OF<BCS && C<LC) OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Name + " Sell(#" + MagicNumber + ")", MagicNumber, 0, Red);} //Close Trade if (IsInvested){ for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()){ if (LC<BCF && BCF<BCS) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, DarkBlue);} if (OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()){ if (LC>BCF && BCF>BCS) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, FireBrick);}}}} |
|
|||
Was ist hier falsch?
Es geht nicht darum, den ganzen EA nur zu bestimmten Zeiten laufen zu lassen. Sondern nur darum, ihm das Öffnen von Orders zu bestimmten Tageszeiten zu verbieten, besser gesagt zu erlauben. Code:
///Zeit/Open Von/Bis extern datetime Time Open_Orders_From = 13:00; extern datetime Time Open_Orders_Till = 17:00; extern int TimeFrame = 30; extern string TimeFrames= "Current:0;M1:1; M5:5; M15:15; M30:30; H1:60; H4:240; D1:1440"; //GDs extern int Fast_GD = 3; extern int Slow_GD = 6; extern int GD_Type = 0; extern string GD_Types = "SMA:0; EMA:1; SMMA;2; LWMA:3"; int GD_Shift = 0; //Sonstige Globale Variablen extern double Lots = 0.01; int Slippage = 1000; extern int Max_Spread = 40; int Ticket, i; double Spread, PointSet; bool IsInvested, CloseTicket; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (Digits <= 3) PointSet = 0.01; else PointSet = 0.0001; if (Digits <= 1) PointSet = 1; Spread=Ask-Bid; Lots = MathMax(MathMin(Lots, MarketInfo(Symbol(),MODE_MAXLOT)),MarketInfo(Symbol(),MODE_MINLOT)); //Define Vars if (TimeFrame==0) TimeFrame=NULL; double C=iClose(Symbol(), TimeFrame, 0); double LC = iClose(Symbol(), TimeFrame, 1); double GD1c = iMA(Symbol(), TimeFrame, Fast_GD, GD_Shift, GD_Type, PRICE_CLOSE, 1); double GD2c = iMA(Symbol(), TimeFrame, Slow_GD, GD_Shift, GD_Type, PRICE_CLOSE, 1); datetime TC = TimeCurrent; datetime F = Time, (Open_Orders_From); datetime T = Time, (Open_Orders_Till); //Check position IsInvested = false; for (i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if((OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) IsInvested=true; } } //Open Trade if (!IsInvested){ if (TC>=F && TC<=T && Spread <= Max_Spread && LC>GD1c && GD1c>GD2c && C>LC) OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Name + " Buy(#" + MagicNumber + ")", MagicNumber, 0, Blue); if (TC>=F && TC<=T && Spread <= Max_Spread && LC<GD1c && GD1c<GD2c && C<LC) OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Name + " Sell(#" + MagicNumber + ")", MagicNumber, 0, Red); } |
|
|||
Wenn Du nur das Order öffnen über die Zeitsteuerung laufen lassen willst, dann pack nur den Code dazu zwischen die geschweiften Klammern für die Zeitsteuerungsabfrage. Den Rest des Codes läßt Du außerhalb so dass er auch nach Open_Orders_Till ausgeführt wird.
Die Links hierzu hatte ich ja bereits gepostet. In deinem Code-Rätsel "was ist hier falsch" sind wieder mehrere Dinge enthalten, deren Sinn sich mir nicht erschließt. Die Fehlermeldungen sollte der Compiler auswerfen. Was bezweckst Du mit diesen Zeilen hier: datetime TC = TimeCurrent; datetime F = Time, (Open_Orders_From); datetime T = Time, (Open_Orders_Till); |
|
|||
Sorry, versteh nur Bahnhof. Weshalb so einige Sachen wohl keinen Sinn ergeben.
Edit:Jetzt sinds nur noch 5 Fehler. Code:
//Globale Variablen ///Zeit/Open Orders Von/Bis extern datetime Time Open_Orders_From = 13:00:00; extern datetime Time Open_Orders_Till = 17:00:00; extern int TimeFrame = 30; extern string TimeFrames= "Current:0;M1:1; M5:5; M15:15; M30:30; H1:60; H4:240; D1:1440"; //GDs extern int Fast_GD = 3; extern int Slow_GD = 6; extern int GD_Type = 0; extern string GD_Types = "SMA:0; EMA:1; SMMA;2; LWMA:3"; int GD_Shift = 0; //Sonstige Globale Variablen extern double Lots = 0.01; int Slippage = 1000; extern int Max_Spread = 40; int Ticket, i; double Spread, PointSet; bool IsInvested, CloseTicket; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init(){ return(0);} //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit(){ return(0);} //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start(){ if (Digits <= 3) PointSet = 0.01; else PointSet = 0.0001; if (Digits <= 1) PointSet = 1; Spread=Ask-Bid; Lots = MathMax(MathMin(Lots, MarketInfo(Symbol(),MODE_MAXLOT)),MarketInfo(Symbol(),MODE_MINLOT)); //Define Vars if (TimeFrame==0) TimeFrame=NULL; double C=iClose(Symbol(), TimeFrame, 0); double LC = iClose(Symbol(), TimeFrame, 1); double GD1c = iMA(Symbol(), TimeFrame, Fast_GD, GD_Shift, GD_Type, PRICE_CLOSE, 1); double GD2c = iMA(Symbol(), TimeFrame, Slow_GD, GD_Shift, GD_Type, PRICE_CLOSE, 1); datetime F = TimeCurrent,(Open_Orders_From); datetime T = TimeCurrent,(Open_Orders_Till); //Check position IsInvested = false; for (i=OrdersTotal()-1; i>=0; i--);{ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES));{ if((OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) IsInvested=true; } } //Open Trade if (!IsInvested){ if (Spread <= Max_Spread && LC>GD1c && GD1c>GD2c && C>LC) OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Name + " Buy(#" + MagicNumber + ")", MagicNumber, 0, Blue); if (Spread <= Max_Spread && LC<GD1c && GD1c<GD2c && C<LC) OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Name + " Sell(#" + MagicNumber + ")", MagicNumber, 0, Red); } //Close Trade if (IsInvested) { for (i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { if(LC<GD1c && GD1c<GD2c) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, DarkBlue); } if (OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { if(LC>GD1c && GD1c>GD2c) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, FireBrick); } } } } Geändert von MA-EA (20.03.16 um 19:28 Uhr) |
|
|||
Jo genau, wenn ich deinen Code lese verstehe ich auch nur Bahnhof.
TimeCurrent() liefert dir die Serverzeit als Ergebnis. Bei Dir fehlen da die Klammern hinter TimeCurrent. Du kannst die Funktion aber so nicht verwenden um dem EA beizubringen wann er handeln soll. Bei Dir steht hinter TimeCurrent ein Komma, danach folgen Klammern in denen Variablen stehen. Warum stehen die Variablen da? Time ist ein reserviertes Wort und erfordert eckige Klammern. Time[0] z.B liefert Dir die Zeit des aktuellen Bars. wenn Du jetzt die Klammern setzt, den Code hinter den Kommas weglässt bleiben nur noch zwei Fehler übrig aber der Code ist sinnlos. Warum lernst du nicht erstmal die Sprache in den Grundzügen? |
|
|||
Ist das alles richtig? Kapiert er so, was er machen soll?
Code:
extern int High_GD = 6; extern int Close_GD = 3; extern int Low_GD = 6; Code:
extern int Max_Spread = 35; Code:
double O = iOpen(Symbol(), TimeFrame, 0); double LC = iClose(Symbol(), TimeFrame, 1); double H = iMA(Symbol(), TimeFrame, High_GD, GD_Shift, GD_Type, PRICE_HIGH, 1); double C = iMA(Symbol(), TimeFrame, Close_GD, GD_Shift, GD_Type, PRICE_CLOSE, 1); double L = iMA(Symbol(), TimeFrame, Low_GD, GD_Shift, GD_Type, PRICE_LOW, 1); Code:
//Open Trade if (!IsInvested){ if (Spread <= Max_Spread && O>H && LC>H) OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Name + " Buy(#" + MagicNumber + ")", MagicNumber, 0, Blue); if (Spread <= Max_Spread && O<L && LC<L) OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Name + " Sell(#" + MagicNumber + ")", MagicNumber, 0, Red);} //Close Trade if (IsInvested){ for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()){ if(LC<H && LC<C) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, DarkBlue);} if (OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()){ if(LC>L && LC>C) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, FireBrick);}}}} return(0);} |
Lesezeichen |
Stichworte |
expert advisor, gleitender durchschnitt, mql4, programmierung, programmierung metatrader, programmierung mql4, trading |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|