Hi,
ich möchte gerne automatisch einen SL errechenen wenn ein Kauf-/Verkauf Signal kommt.
Ich würde gerne das jeweilige Swinging High bzw. Swinging Low dafür nutzen.
Hat jemand einen Tipp wie ich das am besten programmiere?
Bisher habe ich immer nur mit
Low[iLowest...
High[iHighest...
und einer festen Anzahl an Kerzen/Perioden gearbeitet, was relativ starr und wenig aussagekräftig ist
Gerne auch Tipps/Diskussionen auf welcher Basis/Annahme ein SL ermittelt werden könnte oder sollte ;-)
Hallo,
gibt es ein Tool für den MT4 der genau umgekehrt eine Position öffnet? Ich möchte long gehen und er geht short.
Hab die Erfahrung, dass wenn ich eine Umkehr sehe, dass der Markt immer noch weiter läuft.
Möchte was testen :-)
"bis zu 80% der Trader machen Verlust" so kann man es in vielen Warnhinweisen unter den CFD Brokern lesen. Und Ja, ich habe auch dazu gehört. Nun habe ich aber einen Weg daraus gefunden und teile mit Euch gerne diese Erfahrungen - die natürlich nur meine persönlichen Erfahrungen sind.
Am Anfang des Tradings habe ich mich ausnahmslos auf Indizes und Forex gestürzt und das in kleinen Zeiteinheiten getradet.... das war natürlich insbesondere als Anfänger ein Satz mit X .... Dann habe ich die Strategien gewechselt und die Zeiteinheiten geändert und die Erfolge waren eher mehr als dürftig. Das Gesamtergebnis blieb negativ. Erst die folgenden Regeln haben mich dann nun langsam in den Gewinn gebracht - heute erreiche ich ungehebelt eine Rendite zwischen 30% und 100% p.a. und gehebelt mindestens 100% p.a.:
1. Ausschließlich AKTIEN CFDs
Die Tradingweltmeister erzielen im Forex Bereich ca eine durchschnittliche Rendite von 70% pro Jahr. Bei Aktien, Futures und Indizes liegt dies bereits über 150% bis zu 1000% im Jahr (Quelle: https://www.worldcupchampionships.com/world-cup-trading-championship-standings ) -also mehrfach so hoch. Auch wenn man sich einzelne Aktien anschauft erkennt man, dass dort bereits ungehebelt viel stärkere Impulse nach oben existieren. (z.B. https://www.comdirect.de/inf/aktien/..._SPAN=INTRADAY )
Als ich verstanden haben, dass man mit starken trendstarken Aktien leichter Geld verdienen kann, da sich ein starker Trend auch nur in eine Richtung entwickelt, nämlich nach oben, habe ich mir einen Broker gesucht, der viele Aktien zu guten Konditionen anbietet ....in meinem Fall war das Admiral Markets...wobei ich aber auch noch gerade andere teste.... wie FXFLAT oder ungehebelt natürlich interactivebrokers.
2. RISIKOSTREUUNG
Das Moneymanagement war das eigentlich interessante - auch das zu verstehen war für mich LangsamDenker etwas schwerer. Ungehebelt erreiche ich mit der Strategie Renditen zwischen 30% und 100% im Jahr.
Aber wie funktionieren cfds? Erst das Verständnis, dass ich hier das Risiko trade hat mich dann auf die richtigen Formeln gebracht. Wenn ich eine Aktie habe mit einem Kurswert von 1.000 Euro. Ich möchte nun auf einen weiter steigenden Kurs setzen und in 10 Aktien investieren. Wenn ich die Aktien real kaufe benötige ich dazu 10x1000 Euro = 10.000 Euro. Den StoppLoss setze ich bei einem Kurs von 950 Euro und den TakeProfit bei 1100 Euro. Mein Risiko ist also 50 Euro je Aktie. Im cfd Trading benötige ich nun aber nicht 10.000 Euro Kapital um in die Aktien zu investieren, sondern lediglich das Risiko - also die 10x50 Euro = 500 Euro. D.h. ich kann mit nur einem Bruchteil des Kapitals den selben Verlust oder Profit machen wie mit 10.000 Euro.
Ich verteile nun mein Kapital auf mindestens 10 unterschiedliche Werte um eine Riskiostreuung zu erzielen - ähnlich wie man es auch im normalen Aktienhandel macht.
Dabei muss ich noch die MarginAnforderung beachten....Wie berechne ich nun meine LOTGröße also die Höhe dessen, was ich je Aktie im cfd Handel einsetze. Das mache ich mit der groben Formel:
Code:
Gesamtkapital (GK) geteilt durch 28 = X
und diesen X Wert geteilt durch das Ergebnis von Kurswert (KW) der Aktie
geteilt durch 100
also
GK/28=X
KW/100=Y
Einsatz je Aktie = X/Y
Ist allerdings X/Y multipliziert mit der Strecke zwische Einstieg und SL größer
als GK/Gesamtanzahl an Aktien
dann setze ich als EInsatzgröße = GK/Gesamtanzahl an Aktien
Andere rechnen, dass das Risiko maximal 2% des Gesamtkaptals ausmachen soll..... Wenn man das aber alleine einsetzt, ist meiner Ansicht nach zuviel Kapital im toten Bereich ...sprich liegt rum ohne Rendite zu erwirtschaften...Daher wähle ich den oben genannten Ansatz und streue auf mindestens 10 unterschiedliche Aktien.
3. PLATTFORM
Nur mit dem Metatrader 5 erhält man bei den Brokern Zugriff auf eine Vielzahl an Aktien. Daher MetaTrader 5.
4. STOPP LOSS und EINSTIEG
Ich nutze den ZIGZAG Indikator. Der StopLoss(SL) wird auf das letzte ZIGZAG Tief gelegt, und dann der SL nachgezogen sobald ein neues Hoch erreicht wurde. Die Einstellung des ZigZag Indikators muss jeder für sich heraus fnden..... Ich bleibe solange in der Aktie bis ich ausgestoppt werde. Ich Trade im D1 oder maximal im H1 Chart..... Den Einstieg suche ich aber im D1 Chart.
Der Einstieg wird ausschließlich in extrem trendstarken Aktien gesucht.... Ich nutze also eine reinen markttechnischen Ansatz. Sehr schön erklärt ist das hier von Mario Lüddemann: https://www.youtube.com/watch?v=AbHtfiWgzBg
Trendstarke Aktien laufen auch auf Jahrzehnte hinweg von links unten nach rechts oben im Chart..... Jetzt muss man nur noch die aktuellen Bullen daraus selektieren und wie oben beschrieben traden....
Ich hoffe wir bekommen so die Quote ein wenig auch im cfd Traden gehoben - denn das 80% noch Geld verbrennen - das muss nicht sein.....
Wie gesagt, alles meine persönliche Meinung und Erfahrung und keineswegs zur Nachahmung empfohlen
mein EA funktioniert eigentlich ganz gut. Allerdings habe ich heute ein Problem festgestellt.
Wenn man in einen laufenden EA, der momentan keinen Trade auf hat, ein anderes Asset in den Chart zieht, arbeitet der EA nicht mehr. Es kommt aber auch kein Fehler. Es wird normal initialisiert (unter Experten).
Ich denke, das hängt mit der Initialisierung zusammen. Wie kann man dieses Problem lösen? Muss da irgendetwas zurück gesetzt werden? Und wenn ja, wie?
Danke
Ralph
Da mein altes Thema dazu dicht ist, mach ich einfach mal nen Neues auf.
Im Anhang die neueste Version von LoShDistV3 EA. Soll nach und nach immer mehr Sell/Buy-Orders auf machen. Wenn eine der Allerersten ne einstellbare Gewinn-Distanz erreicht hat, sollen alle noch offenen Orders geschlossen und das Ganze von vorn gestartet werden.
1.
Bin ich eher noch Anfänger...
2.
...deswegen kann man bestimmt Einiges optimieren.
3.
Bin ich unschlüssig, wie ich das mit der Order-Zählerei machen soll. Ein paar Zähler müssen immer mit zählen, wie viele Orders geöffnet wurden. Mit diesen Zählern wird dann berechnet, wie viele Orders in Gegenrichtung eröffnet werden müssen, um irgendwelche Verluste mit der richtigen Orderanzahl in Gegenrichtung wieder auszugleichen.
4.
Werden die allerersten und die neuesten Orders immer wieder übers Ticket aufgerufen, um zu berechnen, wann weitere Orders geöffnet werden sollen, wie viele, bzw. ob Alle geschlossen werden können. Hatte immer wieder die Fehlermeldung, dass Ticket für irgendne ausgewählte Order nicht mehr gefunden wurde. Oder umgedreht. Jedenfalls weiß ich nicht, ob das für Abstürze oder Fehler oder sonswas für Probleme sorgt, wenn man irgendwie Tickets oder sonstwas für Infos von Orders aufruft, die inzwischen geschlossen wurden.
Code:
/*=============================================================================================================
// N O T I Z E N U N D I N F O S
//=============================================================================================================
//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict
// #property strict sorgt anscheinend dafür,
// dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.
#property copyright"LoShDistV3.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string TOY="true = on / yes";
extern string FON="false = off / no";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FirstSel=2;
extern int MN_FirstBuy=4;
extern int MN_NextSel=6;
extern int MN_NextBuy=8;
//-----------------------------------------------------------------------------------------------------------*/
extern string OOO1="Open Orders";
extern string OOO2="from/till Hour";
extern string OOO3="(Server Time)";
extern int OpenFromHour=5; // Zum Testen ab 5 Uhr Orders öffnen lassen.
extern int OpenTillHour=22; // Zum Testen bis einschließlich 22 Uhr öffnen lassen.
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=275; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=425; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep Milli Seconds";
extern int slMS=16; // Zum Testen 16 MS
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int Dist_ONO = 25; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOCAO1="Dist to OrderOpenPrice()";
extern string esDOCAO2="close all Orders";
extern int Dist_CAO = 65; // Zum Testen 65. Weniger als ... ist wahrscheinlich nicht ausreichend?
//-----------------------------------------------------------------------------------------------------------*/
extern int OrdersNeed_Multi = 2;
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
extern double LotsPlus=0.01; // ?
//=============================================================================================================
// G L O B A L E D E K L A R A T I O N E N
//=============================================================================================================
bool
fiSH,fiLO,
neSH,neLO,
OCsel,OCbuy
;
//-----------------------------------------------------------------------------------------------------------*/
double
SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
FiSelOOP_DistONO,FiBuyOOP_DistONO,
NeSelOOP_DistONO,NeBuyOOP_DistONO,
FiSelOOP_DistCAO,FiBuyOOP_DistCAO
;
//-----------------------------------------------------------------------------------------------------------*/
int
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
i,j,k,l,m,n,o,p,q,
FL_opSel,FL_neSel,FL_opBuy,FL_neBuy, // Temporäre Opened/Need-Werte, nur für forLoops ( ? )
Opened_Sel,Opened_Buy,
Need_Sel,Need_Buy
;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){}
//=============================================================================================================
// D E I N I T ?
//=============================================================================================================
void OnDeinit(const int reason){}// ?
//=============================================================================================================
// E A F U N K T I O N E N S T A R T
//=============================================================================================================int
void OnTick(){
//=============================================================================================================
// S T O P L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
SL_Sel=0.0;
SL_Buy=0.0;}
else{
SL_Sel=NormalizeDouble(Bid+SL*_Point,_Digits);
SL_Buy=NormalizeDouble(Ask-SL*_Point,_Digits);}
//SL genauso groß wie Minstoplevels machen, wenn er kleiner ist:
MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(SL_Sel<MSL)SL_Sel=MSL;
if(SL_Buy<MSL)SL_Buy=MSL;
//=============================================================================================================
// T A K E P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
TP_Sel=0.0;
TP_Buy=0.0;}
else{
TP_Sel=NormalizeDouble(Bid-TP*_Point,_Digits);
TP_Buy=NormalizeDouble(Ask+TP*_Point,_Digits);}
//=============================================================================================================
// C H E C K H O U R
//=============================================================================================================
// Prüfen, ob zur Zeit Orders geöffnet werden dürfen.
if(
(Hour()>=OpenFromHour&&Hour()<=OpenTillHour)||
(Hour()>OpenTillHour&&Hour()<OpenFromHour && Opened_Sel>=1 && Opened_Buy>=1 )
){
//=============================================================================================================
// 1 . O R D E R S E A R C H
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FirstSel)fiSH=true;
if(OrderMagicNumber()==MN_NextSel )neSH=true;
if(OrderMagicNumber()==MN_FirstBuy)fiLO=true;
if(OrderMagicNumber()==MN_NextBuy )neLO=true;}}}
//=============================================================================================================
// O P E N F I R S T S E L L / O P E N F I R S T B U Y
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
// Wenn gar keine Orders offen sind...
if(fiSH==false&&neSH==false&&fiLO==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/
//...Zähler auf 0 setzen.
Opened_Sel=0;
Opened_Buy=0;
Need_Sel =0;
Need_Buy =0;
//-----------------------------------------------------------------------------------------------------------*/
// ...FirstSell öffnen:
if(IsTradeAllowed()==true){
TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FirstSel,clrBlue);
if(IsTradeContextBusy()==true)Sleep(slMS);} // ?
// ...FirstBuy öffnen:
if(IsTradeAllowed()==true){
TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FirstBuy,clrBlue);
if(IsTradeContextBusy()==true)Sleep(slMS);} // ?
}
//=============================================================================================================
// 2 . O R D E R S E A R C H
//=============================================================================================================
// Prüfen, ob 1.Sell und 1.Buy geöffnet wurden,
// und ob next Sell und next Buy schon geöffnet wurden.
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FirstSel)fiSH=true;
if(OrderMagicNumber()==MN_NextSel )neSH=true;
if(OrderMagicNumber()==MN_FirstBuy)fiLO=true;
if(OrderMagicNumber()==MN_NextBuy )neLO=true;}}}
//=============================================================================================================
// O P E N F I R S T N E X T O R D E R S
//=============================================================================================================
// Wenn nur FirstSell und FirstBuy offen sind,
// bei entsprechenden Bedingungen
// next Sel / next Buy öffnen.
if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/
// Wenn FirstSell Bedingungen erfüllt, next Sell öffnen.
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){ // ?
FiSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits);
if(Bid <= FiSelOOP_DistONO){
for( k=OrdersNeed_Multi ; k>0 ; k--){
if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NextSel,clrBlue);
if(IsTradeContextBusy()==true)Sleep(slMS);
Opened_Sel++;
Need_Sel = Opened_Sel * OrdersNeed_Multi;
Need_Buy = Need_Sel * OrdersNeed_Multi;} // ?
} } }
//-----------------------------------------------------------------------------------------------------------*/
// Wenn 1.Buy Bedingungen erfüllt,
// next Buy öffnen.
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
FiBuyOOP_DistONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO*_Point,_Digits);
if(Ask>=FiBuyOOP_DistONO){
for( l=OrdersNeed_Multi ; l>0 ; l--){
if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NextBuy,clrBlue);
if(IsTradeContextBusy()==true)Sleep(slMS);
Opened_Buy++;
Need_Buy = Opened_Buy * OrdersNeed_Multi;
Need_Sel = Need_Buy * OrdersNeed_Multi;}
} } }
//-----------------------------------------------------------------------------------------------------------*/
}
//=============================================================================================================
// 3 . O R D E R S E A R C H
//=============================================================================================================
// 1.Sell und 1.Buy müssen offen sein.
// nextSell und/oder nextBuy müssen offen sein.
for(m=OrdersTotal()-1;m>=0;m--){
if(OrderSelect(m,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FirstSel)fiSH=true;
if(OrderMagicNumber()==MN_NextSel )neSH=true;
if(OrderMagicNumber()==MN_FirstBuy)fiLO=true;
if(OrderMagicNumber()==MN_NextBuy )neLO=true;}}}
//=============================================================================================================
// C H E C K F I R S T O R D E R S A N D N E X T O R D E R S
//=============================================================================================================
// Wenn FirstSell und FirstBuy offen sind...
if(fiSH==true&&fiLO==true){
// ...und nextSell oder nextBuy offen sind,
if(neSH==true||neLO==true){
// Weitere nextOrders öffnen,
// wenn Bedingungen erfüllt sind.
//=============================================================================================================
// C H E C K F I R S T A N D N E X T S E L L O R D E R S
//=============================================================================================================// Letzten next Sell über Ticket auswählen.
// Letzten NextSell auswählen.
if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
// Prüfen, ob letzter NextSell OpenNextOrder-Dist erreicht hat.
NeSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits );
if(Bid <= NeSelOOP_DistONO){
// Wenn ja, FirstSell über Ticket auswählen.
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
//=============================================================================================================
// O P E N N E W S E L L O R D E R S B Y D I S T
//=============================================================================================================
// Wenn FirstSell Gewinn-Distanz nicht erreicht hat, weitere Sell-Orders öffnen.
if( Ask > FiSelOOP_DistCAO ){
FL_opSel=Opened_Sel; // ?
FL_neSel=Need_Sel; // ?
for( n=FL_neSel ; n>0 ; n--){
if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NextSel,clrYellow);
if(IsTradeContextBusy()==true)Sleep(slMS);
Opened_Sel++;
Need_Sel = Opened_Sel * OrdersNeed_Multi;
Need_Buy = Need_Sel * OrdersNeed_Multi;} }
//=============================================================================================================
// C L O S E A L L O R D E R S B Y S E L L D I S T
//=============================================================================================================
// Wenn FirstSell Gewinn-Dist doch erreicht hat...
if( Ask <= FiSelOOP_DistCAO ){
// ...Lots erhöhen...
Lots = OrderLots() + LotsPlus; // ?
// ...und alle Orders schließen.
for(p=OrdersTotal()-1;p>=0;p--){
if(OrderSelect(p,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_NextBuy){
if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
if(OrderMagicNumber()==MN_FirstBuy){
if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
if(OrderMagicNumber()==MN_NextSel){
if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
if(OrderMagicNumber()==MN_FirstSel){
if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//=============================================================================================================
// C H E C K F I R S T A N D N E X T B U Y O R D E R S
//=============================================================================================================
// Letzten NextBuy über Ticket auswählen.
if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
// Prüfen, ob NextBuy OpenNextOrder-Dist erreicht hat.
NeBuyOOP_DistONO=NormalizeDouble(OrderOpenPrice() + Dist_ONO*_Point,_Digits);
if(Ask >= NeBuyOOP_DistONO){
// Wenn ja, FirstBuy über Ticket auswählen.
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
// Prüfen, ob 1.Buy Gewinn-Distanz erreicht hat.
FiBuyOOP_DistCAO=NormalizeDouble( OrderOpenPrice() + Dist_CAO*_Point,_Digits);
//=============================================================================================================
// O P E N N E W B U Y O R D E R S B Y D I S T
//=============================================================================================================
// Wenn 1.Buy Gewinn-Distanz nicht erreicht hat weitere Buy-Orders öffnen.
if(Bid < FiBuyOOP_DistCAO){
FL_opBuy=Opened_Buy; // ?
FL_neBuy=Need_Buy; // ?
for( o=FL_neBuy ; o>0 ; o--){
if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NextBuy,clrYellow);
if(IsTradeContextBusy()==true)Sleep(slMS);
Opened_Buy++;
Need_Buy = Opened_Buy * OrdersNeed_Multi;
Need_Sel = Need_Buy * OrdersNeed_Multi;} }
//=============================================================================================================
// C L O S E A L L O R D E R S B Y B U Y D I S T
//=============================================================================================================
// Wenn FirstBuy Gewinn-Dist doch erreicht hat...
if( Bid >= FiBuyOOP_DistCAO ){
// ...Lots erhöhen...
Lots = OrderLots() + LotsPlus; // ?
// ...und alle Orders schließen.
for(q=OrdersTotal()-1;q>=0;q--){
if(OrderSelect(q,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_NextSel){
if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
if(OrderMagicNumber()==MN_FirstSel){
if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
if(OrderMagicNumber()==MN_NextBuy){
if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
if(OrderMagicNumber()==MN_FirstBuy){
if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
if(IsTradeContextBusy()==true)Sleep(slMS);}
} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//-----------------------------------------------------------------------------------------------------------*/
} }
//-----------------------------------------------------------------------------------------------------------*/
} // Öffnende Klammer nach Hour Check
//=============================================================================================================
// E A F U N K T I O N E N B E E N D E N
//=============================================================================================================
}//(void OnTick)
ich schildere kurz was ich machen möchte und was eben nicht klappt:
Was ich möchte:
Ich sammle mit einer Liste CandlePattern (Dojis und Hammer) von denen ich dann einen Screentshot machen möchte, den ich mir dann per Email zusenden lassen möchte. Bevor die Screenshots gemacht werden, soll erst mal der Chart den TimeFrame und das Symbol des Signales laden/selektieren.
Was nicht klappt:
Obwohl ich die Abfolge Loope, werden sie anscheinend nicht prozedual abgearbeitet. So werden die Charts nicht sauber selektiert und die Screenshots passen nicht zu den Signalen. Beim Debuggen ist mir aufgefallen das bei aktuell 4 Signalen, die ersten 2 nacheinander abgearbeitet werden und die restlichen 2 nicht. Auch wenn ich am Haltepunkt stehen bleibe, läuft die Ausgabe weiter. Bedeutet bevor ich überhaupt die Charts selektieren kann, werden die restlichen Signale bereits weiterverarbeitet, was ich an der Print-Ausgabe im Terminal erkennen konnte, die bereits erfolgt obwohl ich erst beim 2ten Signal bin und dort am Haltepunkt beim Debuggen warte. Die Emailfunktion ist abgekoppelt, die kann da nicht in die quere kommen.
Soweit ich es in Erinnerung habe, unterstützt MQL5 keine Multithreathing oder asnyc funktionen. Hat sich das geändert? So up to date bin ich da nicht.
Code:
for(int i=0;i<signalList.Total();i++)
{
CandlePattern *o=signalList.GetNodeAtIndex(i);
MakeSH(o.wert,GetPeriodEnum(o.signalTF));
Print("Symbol:-- > "+o.patternName+" Wert:-- > "+o.wert+" TF:-- > "+o.signalTF+" Time:-- > "+o.signalTime);
delete o;
}
signalList.Clear();
delete signalList;
//+------------------------------------------------------------------+
//| Macht einen Screenshot des aktuellen Charts und speichert diesen |
//+------------------------------------------------------------------+
bool MakeSH(string wert, ENUM_TIMEFRAMES tf )
{
PrepareChartForScreenshot(wert,tf);
string chartSymbol = ChartSymbol(0);
ENUM_TIMEFRAMES period = ChartPeriod(0);
if(chartSymbol != wert && period != tf)
{
PrepareChartForScreenshot(wert,tf);
}
ENUM_ALIGN_MODE align_mode = ALIGN_RIGHT;
long width = ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
long height = ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
string fileName=wert+GetPeriodString(tf)+".gif";
//--- Show the name on the chart as a comment
// Comment(name);
if(!ChartScreenShot(0,fileName,(int)width,(int)height,align_mode))
{
Print("ScreenShot failed: "+IntegerToString(GetLastError()));
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| Wählt den Chart + TF aus mit speziellen Settings |
//+------------------------------------------------------------------+
void PrepareChartForScreenshot(string wert, ENUM_TIMEFRAMES tf )
{
ChartSetSymbolPeriod(0,wert,tf);
ChartSetInteger(0,CHART_SHOW_GRID,false);
ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
ChartSetInteger(0,CHART_SCALE,3);
ChartSetInteger(0,CHART_AUTOSCROLL,true);
ChartSetInteger(0,CHART_SHIFT,true);
ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrBlack);
ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,clrLimeGreen);
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,clrRed);
ChartSetInteger(0,CHART_COLOR_CHART_UP,clrLimeGreen);
ChartSetInteger(0,CHART_COLOR_CHART_DOWN,clrRed);
ChartSetInteger(0,CHART_COLOR_BID,clrWhite);
}
//+------------------------------------------------------------------+
//| Gibt den TF als ENUM zurück |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES GetPeriodEnum(string val)
{
if(val == "M1")
{
return PERIOD_M1;
}
if(val == "M5")
{
return PERIOD_M5;
}
if(val == "M15")
{
return PERIOD_M15;
}
if(val == "H1")
{
return PERIOD_H1;
}
if(val == "H4")
{
return PERIOD_H4;
}
if(val == "D1")
{
return PERIOD_D1;
}
return -1;
}
//+------------------------------------------------------------------+
//| Klasse um ein ChartPattern Signal abzubilden |
//+------------------------------------------------------------------+
class CandlePattern : public CObject
{
public:
string patternName;
string wert;
datetime signalTime;
string signalTF;
CandlePattern(void){};
~CandlePattern(void){};
};
Sleep() Funktionen werden auch komplett ignoriert. In der Loop hab ich nen 5sec Sleep gesetzt aber der is komplett durchgerauscht.
Weiß ehrlich gesagt nicht mehr was ich probieren soll.
Was überseh ich??
Ich kann leider keinen Code zur Verfügung stellen, habe aber folgendes Problem.
Mein Programm erstellt eine Order OHNE TakeProfit, setzt aber unter bestimmt Voraussetzungen ein TakeProfit und danach kommt Modify error 1, weil er Tausende OrderModify macht.
meine Überlegung war eine Wahr/Falsch abfrage um das zu Stoppen.
if(OrderTakeProfit()>0)
weil ich dachte es existiert ja nicht und wenn er gesetzt wird, ist er ja erst größer 0.
Aber darauf reagiert das Programm nicht, wenn ein TakeProfit gesetzt wird.
Es erkennt das TakeProfit nicht da ist macht aber auch nichts, wenn es da ist.
Kann es sein, dass mt4 nur com , de usw Domains erlaubt? Ich versuch mich gerade mit einer markets TLD zu verbinden, und bekomme ständig einen 5200 Fehler, dass meine URL falsch sei.
Im Browser geht sie jedoch (bis auf einen fehlenden Header).
Hat sich schonmal jemand von euch mit solchen Domains verbunden?
int ClosePositions(string symbol)
{
int orderstotal = OrdersTotal();
int orders = 0;
int ordticket[100][2];
for (int i = 0; i < orderstotal; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderMagicNumber() != Expert_Magic || OrderSymbol() != symbol)
continue;
int orderType = OrderType();
if (orderType != OP_BUY && orderType != OP_SELL)
continue;
ordticket[orders][0] = OrderOpenTime(); // casting of datetime -> int, should work fine...
ordticket[orders][1] = OrderTicket();
orders++;
}
ArrayResize(ordticket,orders); // we have to remove rest of array otherwise it's contents will be sorted as well
ArraySort(ordticket); // sorts ascending by first dimension -> by OrderOpenTime()
for (i = 0; i < orders; i++)
ClosePositionByTicket(ordticket[i][1]);
}
Ich bekomme folgende Fehler angezeigt:
- im Metaeditor : "possible loss of data due to type conversion"
- im Strategietester : "incorrect start position 0 for ArraySort function"
ich habe einen EA geschrieben, wo man die Handelszeit einstellen kann. Er soll z.B. von 22 bis 8 Uhr nicht handeln. Das klappt soweit auch. Nur nimmt er am nächsten Tag um 8 Uhr seine Arbeit nicht wieder auf.
Was ist zu tuen?
Muss die Zeit irgendwie resetet werden? Und wenn wann und wie?
ich habe folgende frage.
Wie kann ich den Indicator in meinen EA einbauen?
Ich will in der Ordermodify den SL an der unteren Linie oder bei Sell positionen an der oberen Linie nachziehen.
ich habe schon versucht das alles zu kopieren ging aber nicht auch mit den double Werten die oben hinterlegt sind....ich habe auch gesehen das man den indicator seperat aufrufen kann ich denke mit Include... aber trotzdem komme ich damit nicht weiter.
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit, i, flag, flagh, trend[5000];
double up[5000], dn[5000], medianPrice, atr;
int counted_bars = IndicatorCounted();
//---- check for possible errors
if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0) counted_bars--;
limit=Bars-counted_bars;
//Print(limit);
ich möchte gerne die echte, aktuelle Zeit auslesen, obwohl der EA gerade im Backtest läuft.
Hat jemand von euch eine Idee, welche Funktion hierfür die richtige ist?
TimeCurrent() TimeLocal() und TimeTradeServer() liefern nur die Zeit, welche gerade im Backtest anstehen würde, aber nicht die recht aktuelle Zeit.