|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Aufzählfunktion
Hallo Zusammen,
ich habe einen EA geschrieben und dieser ist soweit auch fertig bis auf eine Detailsfrage. Der EA soll im 1 Stunden Chart handeln und hat einen engen SL als auch TP. Leider eröffnet dieser sofort eine neue Order nachdem die alte geschlossen wurde. Eigentlich soll stattdessen gewartet werden bis die laufende Stunde vorbei ist und dann in der darauf folgenden Stunde erneut gehandelt werden. Hier ein Teil des Codes: Code:
//Globale Variablen int BuyTicket; int SellTicket; double UsePoint; int UseSlippage; int openbuy = 0; int opensell = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { UsePoint = PipPoint(Symbol()); UseSlippage = GetSlippage(Symbol(), Slippage); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round); double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round); double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round); //===================== Lets determine lot size and risk =================================== if ( Lot<Minlot ) { Lot=Minlot; } Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot); opensell = 0; openbuy = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) //==> select also on magicnumber and symbol { if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;} if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;} if((OrderOpenTime()+3600) < TimeCurrent() && OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol()) { if (OrderType() == OP_BUY) { bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); openbuy = openbuy-1; //openbuy--; } if (OrderType() == OP_SELL) { Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); opensell = opensell-1; //opensell--; } } } } //BuyOrder if ((TradeHour1==Hour()) && openbuy == 0) //Signal Buy { openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,Bid + TakeProfit * Point,"Kompensation buy",MagicNumber,0,Green); if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() ); } //SellOrder if ((TradeHour1==Hour()) && opensell == 0) //Signal Sell { opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,Ask - TakeProfit * Point,"Kompensation sell",MagicNumber,0,Red); if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() ); } //---- return(0); } Vielen lieben Dank Marc
__________________
Heute Weizen, Abends Corn morgen fangen wir an von vorn... |
|
|||
Aktuell schaut es so aus, aber es hilft noch nichts
Code:
opensell = 0; openbuy = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) //==> select also on magicnumber and symbol { if(OrderMagicNumber()== BuyMagicNumber && (OrderOpenTime()+3600)< TimeCurrent() && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;} if(OrderMagicNumber()== SellMagicNumber && (OrderOpenTime()+3600)< TimeCurrent() && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;} { if (OrderType() == OP_BUY) { bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); openbuy = openbuy-1; //openbuy--; } if (OrderType() == OP_SELL) { Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); opensell = opensell-1; //opensell--; } } } }
__________________
Heute Weizen, Abends Corn morgen fangen wir an von vorn... |
|
|||
Aufzählfunktion
Es scheint mir, dass der Fehler hier ist:
if (TradeHour1==Hour() ...) |
|
|||
Hmm ich weiß nicht...der EA soll ja eigentlich so arbeiten, dass er bei Tradehour 1 = 1 Uhr Nachts den Trade beim ersten Tick eröffnet...
Die Tradehour habe ich borher ja schon deklariert und diese greift er nun ab... da, glaube ich, kann der Fehler nicht unbedingt liegen...
__________________
Heute Weizen, Abends Corn morgen fangen wir an von vorn... |
|
|||
Da steckt der Fehler nicht drin.
Du solltest mal den ganzen Code posten, sonst kann man das nicht nachvollziehen. Gruß naranjoe |
|
|||
Hallo Sandmann...morgen poste ich den kompletten Code mal. Ich kam da heute nicht mehr zu. Ich versuche Deiner Logik mal zu folgen udn deine Vorschläge mal zu integrieren. Inzwischen hatte ich überlegt über die Schiene mit den Bars zu gehen und dem Prog zu sagen, dass pro Bar ein Trade nach oben und nach unten gemacht werden darf...also long und short...so das ich auf max 2 Trades komme bzw...je nach MagicNumber dann einen pro bar habe...
__________________
Heute Weizen, Abends Corn morgen fangen wir an von vorn... |
|
|||
Hallo Zusammen hier ist der Code um den es geht:
Code:
//+------------------------------------------------------------------+ //| Der Stundentrader.mq4 | //| Der Marc | //| Es gibt gar keine Internetseite | //+------------------------------------------------------------------+ #property copyright "Der Marc" #property link "Es gibt gar keine Internetseite" //Wichtige Variablen extern double Minlot=0.01; extern int Digits2Round=2; extern int PercentOfFreeDepo=1; extern int Slippage=5; extern int MagicNumber=1; extern int TradeHour0=0; extern int TradeHour1=1; extern int TradeHour2=2; extern int TradeHour3=3; extern int TradeHour4=4; extern int TradeHour5=5; extern int TradeHour6=6; extern int TradeHour7=7; extern int TradeHour8=8; extern int TradeHour9=9; extern int TradeHour10=10; extern int TradeHour11=11; extern int TradeHour12=12; extern int TradeHour13=13; extern int TradeHour14=14; extern int TradeHour15=15; extern int TradeHour16=16; extern int TradeHour17=17; extern int TradeHour18=18; extern int TradeHour19=19; extern int TradeHour20=20; extern int TradeHour21=21; extern int TradeHour22=22; extern int TradeHour23=23; extern int StopLoss=100; extern int TakeProfit=20; //Globale Variablen int BuyTicket; int SellTicket; double UsePoint; int UseSlippage; int openbuy = 0; int opensell = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { UsePoint = PipPoint(Symbol()); UseSlippage = GetSlippage(Symbol(), Slippage); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round); double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round); double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round); //===================== Lets determine lot size and risk =================================== if ( Lot<Minlot ) { Lot=Minlot; } Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot); opensell = 0; openbuy = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) //==> select also on magicnumber and symbol { if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;} if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;} if((OrderOpenTime()+3600) < TimeCurrent() && OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol()) { if (OrderType() == OP_BUY) { bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); openbuy = openbuy-1; //openbuy--; } if (OrderType() == OP_SELL) { Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); opensell = opensell-1; //opensell--; } } } } //BuyOrder if ((TradeHour1==Hour())||(TradeHour2==Hour())||(TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour5==Hour())||(TradeHour6==Hour())||(TradeHour7==Hour())||(TradeHour8==Hour())||(TradeHour9==Hour())||(TradeHour10==Hour())||(TradeHour11==Hour())||(TradeHour12==Hour())||(TradeHour13==Hour())||(TradeHour14==Hour())||(TradeHour15==Hour())||(TradeHour16==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour19==Hour())||(TradeHour20==Hour())||(TradeHour21==Hour())||(TradeHour22==Hour())||(TradeHour23==Hour())||(TradeHour0==Hour()) && openbuy == 0) //Signal Buy { openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,Bid + TakeProfit * Point,"Kompensation buy",MagicNumber,0,Green); if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() ); } //SellOrder if ((TradeHour1==Hour())||(TradeHour2==Hour())||(TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour5==Hour())||(TradeHour6==Hour())||(TradeHour7==Hour())||(TradeHour8==Hour())||(TradeHour9==Hour())||(TradeHour10==Hour())||(TradeHour11==Hour())||(TradeHour12==Hour())||(TradeHour13==Hour())||(TradeHour14==Hour())||(TradeHour15==Hour())||(TradeHour16==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour19==Hour())||(TradeHour20==Hour())||(TradeHour21==Hour())||(TradeHour22==Hour())||(TradeHour23==Hour())||(TradeHour0==Hour()) && opensell == 0) //Signal Sell { opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,Ask - TakeProfit * Point,"Kompensation sell",MagicNumber,0,Red); if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() ); } //---- return(0); } //+------------------------------------------------------------------+ //Pip Point Function double PipPoint (string Currency) { int CalcDigits = MarketInfo(Currency, MODE_DIGITS); if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01; else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001; return (CalcPoint); } //Get Slippage Function int GetSlippage(string Currency, int SlippagePips) { int CalcDigits = MarketInfo(Currency, MODE_DIGITS); if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips; else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10; return (CalcSlippage); }
__________________
Heute Weizen, Abends Corn morgen fangen wir an von vorn... |
|
|||
Und wo die Funktion Hour ()?
|
|
|||
Wie Sandmann schon geschrieben hat, ist wohl dein Problem, das eine Order die TP oder SL erreicht von deinem Code nicht erfasst wird, und somit sofort eine neue Order geöffnet wird.
Eine Möglichkeit wäre, TP und SL mit dem EA zu überwachen und die Order bei erreichen per OrderClose zu schliessen. Das könntest du komfortabel in der OrderSelect Schleife unterbringen. Gruß naranjoe |
Lesezeichen |
Stichworte |
ea, expert-advisor, mql4, programmierung, programmierung metatrader |
|
|