|
Expert-Advisors Expert-Advisors für Metatrader 4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Sry aber kannst du bitte erläutern was du mit bar 0 oder 1 genauer meinst? Bin wo gesagt nicht so in der Programmierung. Es soll der close wert der letzten candle genutzt werden.
|
|
|||
Also Bar 1.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Zitat:
letzte geschlossene Bar ist 1 |
|
|||
Zitat:
Warum eine max. Anzahl an Trades? |
|
|||
Danke für den artikel. Ganz gut mal die geschichtliche Entwicklung zu kennen. Jedoch geht er eben nur auf die Betrachtung Eder Matringal ein. Ich möchte ja eben durch wahrscheinlichkeinen das momentan zu meinem Gunsten anpassen. Die maximale Anzahl am trades ergibt sich aus einer wahrscheinlichkeitsbetrachtung und dem Risiko was ich max. Eingehen möchte.
|
|
|||
Lass mal den Quell-Code, bzw. die MQL sehn. Dann wird Dir bestimmt geholfen.
|
|
|||
tja leider ist der link bzw. dessen inhalt von einem unwissenden journalisten geschrieben!
denn es gibt noch zig andere martingal (der richtige ausdruck) varianten! hier nur mal die basis martingales! (verdoppelung: 1,2,4,8,...) -open martingale -open stretched martingale -closed martingale -closed stretched martingale -hedged open martingale -hedged open stretched martingale -hedged closed martingale -hedged closed stretched martingale dann gibt es noch: -1-3-2-4 martingale -fibonacci martingale -d'Alembert -Labouchere (auch alle wieder als open, closed, hedged) und noch ein paar andere somit ist der Artikel falsch recherchiert, unvollständig und zeigt wie so oft nicht korrekten journalismus auf! das einzige was stimmt, das der author schreibt das auf mathematik verzichtet wurde-klar wenn das wissen darum fehlt, aber das muss ein journalist (wenn es überhaupt einer ist!) auch nicht können, da er es nicht gelernt hat. fazit: man sollte immer selbst seine hausaufgaben machen, nachforschungen betreiben und sich nicht blindlinks auf das geschreibe von unbekannten personen verlassen! |
|
|||
Guten Abend.
Anbei der Quellcode, welcher mir bisher zur Verfügung gestellt wurde. Wie gesagt, ich würde gern ein Martingal drüber gepackt haben. Am besten wäre wohl eine Abfrage wie "if i<10" dann hat man die Option diesen nach Wunsch anzupassen. Code:
#define SIGNAL_NONE 0 #define SIGNAL_BUY 1 #define SIGNAL_SELL 2 #define SIGNAL_CLOSEBUY 3 #define SIGNAL_CLOSESELL 4 extern int MagicNumber = 0; extern bool SignalMail = False; extern bool EachTickMode = True; extern double Lots = 1.0; extern int Slippage = 3; extern bool UseStopLoss = True; extern int StopLoss = 150; extern bool UseTakeProfit = False; extern int TakeProfit = 60; extern bool UseTrailingStop = False; extern int TrailingStop = 30; int BarCount; int Current; bool TickCheck = False; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { BarCount = Bars; if (EachTickMode) Current = 0; else Current = 1; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int Order = SIGNAL_NONE; int Total, Ticket; double StopLossLevel, TakeProfitLevel; if (EachTickMode && Bars != BarCount) TickCheck = False; Total = OrdersTotal(); Order = SIGNAL_NONE; //+------------------------------------------------------------------+ //| Variable Begin | //+------------------------------------------------------------------+ double Buy1_1 = iBands(NULL, PERIOD_M5, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, Current + 0); double Buy1_2 = iClose(NULL, PERIOD_M5, Current + 0); double Buy2_1 = iRSI(NULL, PERIOD_M5, 10, PRICE_CLOSE, Current + 0); double Buy2_2 = 23; double Sell1_1 = iBands(NULL, PERIOD_M5, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, Current + 0); double Sell1_2 = iClose(NULL, PERIOD_M5, Current + 0); double Sell2_1 = iRSI(NULL, PERIOD_M5, 10, PRICE_CLOSE, Current + 0); double Sell2_2 = 73; double CloseBuy1_1 = iMA(NULL, PERIOD_M5, 60, 0, MODE_EMA, PRICE_CLOSE, Current + 0); double CloseBuy1_2 = iHigh(NULL, PERIOD_M5, Current + 0); double CloseSell1_1 = iMA(NULL, PERIOD_M5, 60, 0, MODE_EMA, PRICE_CLOSE, Current + 0); double CloseSell1_2 = iLow(NULL, PERIOD_M5, Current + 0); //+------------------------------------------------------------------+ //| Variable End | //+------------------------------------------------------------------+ //Check position bool IsTrade = False; for (int i = 0; i < Total; i ++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { IsTrade = True; if(OrderType() == OP_BUY) { //Close //+------------------------------------------------------------------+ //| Signal Begin(Exit Buy) | //+------------------------------------------------------------------+ {SignalCloseBuy} //+------------------------------------------------------------------+ //| Signal End(Exit Buy) | //+------------------------------------------------------------------+ if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy"); if (!EachTickMode) BarCount = Bars; IsTrade = False; continue; } //Trailing stop if(UseTrailingStop && TrailingStop > 0) { if(Bid - OrderOpenPrice() > Point * TrailingStop) { if(OrderStopLoss() < Bid - Point * TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen); if (!EachTickMode) BarCount = Bars; continue; } } } } else { //Close //+------------------------------------------------------------------+ //| Signal Begin(Exit Sell) | //+------------------------------------------------------------------+ {SignalCloseSell} //+------------------------------------------------------------------+ //| Signal End(Exit Sell) | //+------------------------------------------------------------------+ if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell"); if (!EachTickMode) BarCount = Bars; IsTrade = False; continue; } //Trailing stop if(UseTrailingStop && TrailingStop > 0) { if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) { if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange); if (!EachTickMode) BarCount = Bars; continue; } } } } } } //+------------------------------------------------------------------+ //| Signal Begin(Entry) | //+------------------------------------------------------------------+ {SignalBuy} {SignalSell} //+------------------------------------------------------------------+ //| Signal End | //+------------------------------------------------------------------+ //Buy if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if(!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0; if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue); if(Ticket > 0) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("BUY order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy"); } else { Print("Error opening BUY order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; return(0); } } //Sell if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if(!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0; if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink); if(Ticket > 0) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("SELL order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell"); } else { Print("Error opening SELL order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; return(0); } } if (!EachTickMode) BarCount = Bars; return(0); } //+------------------------------------------------------------------+ |
|
|||
-wie soll hier profit generiert werden?
usetake*=false usestoploss=true, dem ea bleibt nur in den sl zu laufen -da fehlen die basis arrays (hat jetzt nichtmal was mit martingale zu tun) -da fehlen die maximal trades -es fehlen die steps zwischen den orders wenn notwendig, ansonsten macht der ea in der sekunde millionen positionen auf, auch weil ein maximum an erlaubten trades fehlt. -martingale: welches? open, closed, hedged, basis oder exoten -martingale auf m5? es gibt tausende grid eas, das brauchst nicht nochmal erfinden -kein emergency exit das minimum an basis arrays um das professional zu machen: int OrderTicket[], OrderType[]; double OrderLots[], OrderOpenPrice[], OrderStopLoss[], OrderTakeProfit[], OrderProfit[], OrderSwap[], OrderCommission[]; datetime OrderOpenTime[], OrderExpiration[]; string OrderComment[]; fazit: -da fehlt es hinten und vorne an basis framework auf das man aufbauen könnte, mit deinem jetzigen "gerüst" ist das so nicht zu machen. -auch muss im klar sein welches martingale du haben willst, -nur ein profi coder programmiert die alle möglichkeiten ein. ich empfehle dringenst! kontakt zu traderdoc aufzunehmen, damit das hier in professionelle bahnen kommt, ausser du hast vor geld zu verlieren oder sinnlos tausende stunden demo zu machen um fehler zu finden! |
|
|||
@ phishinger. Danke das du dir das angeguckt hast. Zu deinen Kritikpunkten:
1) die maximale Anzahl an Trades gibt es bisher nicht, da ich mir das als Gesamtschleife über das Script gedacht hatte, welche mit dem Martingal verbudnen wäre. DH. es sollte nach Möglichkeit das Signal ausgelöst werden, ein Counter für den Trade zählen und solange Aktiv bleiben, bis ein Verkauf erfolgte. Dadurch könnte man ja dann gleich 2 Fliegen mit einer Klappe schlagen ( aus meiner Sicht) und zwar wäre die Ordernr. gleichzeitig dir vorgabe für die Ordergröße (2^Orderzahl). Wie gesagt ich kanns nur leider nicht reinproggen da mir dazu die Kenntnisse der Sprache fehlen. 2) Das mit dem ständigen kaufen dachte ich wäre durch die Vorgabe double Buy1_1 = iBands(NULL, PERIOD_M5, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, Current + 0); double Buy1_2 = iClose(NULL, PERIOD_M5, Current + 0); double Buy2_1 = iRSI(NULL, PERIOD_M5, 10, PRICE_CLOSE, Current + 0); double Buy2_2 = 23; geklärt. Es kann ja nur gekauft werden, wenn der Close Wert der letzten Kerze die Bedingungen erfüllt. Dann wird gekauft und die schleife beginnt von vorne. Aber du hast recht, man sollte einfach eine wait einbauen o.ä. damit durch den Eachtickmode nicht jeden Tick die letzte abgeschlossene Kerze wieder bewertet wird. Da war ein Denkfehler meinerseits da ich dachte er prüft in dem Zeitintervall nur die Kerzen. Vllt. sollte der Eachtickmode geändert werden? 3) Das mit dem open, Close, Hedge etc. Martingal hatte ich gehofft ergibt sich aus meinen Beschreibungen, es soll ja eine Verdoppelung der Order erstellt werden solange nicht die 1. Order geschlossen wurde und es soll nur bei einem erneuten Signal eine Order erfolgen, nicht nach einer bestimmten Zeit oder einem gewissen Punkteabstand. Ein SL erfolgt nach einer festen Anzahl an pips. ich weiß grad nicht ob das als Close Martingal oder Basic durchgeht, ansonsten ist es wohl der Exotik Variante zuzuordnen. 4) Emergency Exit hatte ich mir noch keine Gedanken gemacht, da ich einen festen SL habe und mir gerade keine Sinnvolle Situation einfällt, bei welcher ich diesen bräuchte. Ja dadurch ist dann der Maximalverlust garantiert, jedoch auch nicht mehr. 5) Das das Grundgerüst deiner Meinung nach keines ist, tut mir leid, ich hatte es als solches verstanden. Aber wie gesagt ich konnte mich da bisher nur auf meinen Freund verlassen. Deswegen habe ich ja die Anfrage hier reingestellt, genau um so was aufzuklären. |
Lesezeichen |
Stichworte |
fehleranalyse, hilfe, programmieren expert advisor |
|
|