|
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 |
|
|||
Zitat:
Lad vielleicht mal Deinen Hedge-EA hoch. Ist der für längere Haltedauer? Wie gesagt ist mein EA eher als Scalper gedacht. Ein Sell und ein Buy öffnen, schaun in welche Richtung es zu gehn scheint, und in diese dann immer wieder doppelt so Viele weitere Orders öffnen. Derzeit wenn Ask/Bid 12P über/unter dem jeweiligen OrderOpenPrice() der zuletzt geöffneten Order sind. Wenn die neuen Orders auch wieder 12P über/unter ihrem OOP() sind, werden wieder doppelt so viele Orders in diese Richtung geöffnet und immer so weiter. Wenn Ask/Bid irgendwann (derzeit)32P über/unter dem OOP() der allerersten Orders sind, werden mit ner for-Loop alle noch offenen Orders geschlossen und das ganze Spielchen geht von vorne los. Ich versuchs erst mal mit vielen kleinen Durchläufen... Geändert von MA-EA (28.12.20 um 13:13 Uhr) |
|
|||
|
|
|||
Moin.
Der EA scheint Gewinn machen zu können, allerdings schließt er nie eine Order wie er soll. Fehlermeldungen oder Warnungen gibts Keine. Und der Code ist doch eigentlich richtig. Trotzdem schließt er ne irgendwelche Orders, wie er eigentlich müsste. Code:
//============================================================================================================= // C L O S E A L L O R D E R S B Y S E L L D I S T //============================================================================================================= //Prüfen, ob letzter NextSell ONO-Dist erreicht hat. if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){ NeSelOOP_DONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO *_Point,_Digits); if( Bid <= NeSelOOP_DONO ){ // Wenn letzter NextSell ONO-Dist erreicht hat, FirstSell raus suchen. if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ // Wenn FirstSell Gewinn-Dist erreicht hat... FiSelOOP_DCAO = NormalizeDouble( OrderOpenPrice() - Dist_CAO *_Point,_Digits); if( Ask < FiSelOOP_DCAO ){ // ...CloseAll_"by_Short" auf true setzen... caSH=true; // ...Lots erhöhen... Lots = OrderLots() + LotsPlus; // ? } } } } //...und alle Orders schließen. if(caSH==true){ for(u=OrdersTotal()-1;u>=0;u--){ if(OrderSelect(u,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiBuy){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeBuy){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeSel){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_FiSel){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} } } } } //============================================================================================================= // C L O S E A L L O R D E R S B Y B U Y D I S T //============================================================================================================= //Prüfen, ob letzter NextBuy OpenNextOrder-Dist erreicht hat: if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){ NeBuyOOP_DONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO *_Point,_Digits); if( Ask >= NeBuyOOP_DONO ){ // Wenn ja, FirstBuy raus suchen. if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ // Wenn FirstBuy Gewinn-Dist erreicht hat... FiBuyOOP_DCAO = NormalizeDouble( OrderOpenPrice() + Dist_CAO *_Point,_Digits); if( Bid > FiBuyOOP_DCAO ){ caLO=true; // ...Lots erhöhen... Lots = OrderLots() + LotsPlus; // ? } } } } //...und alle Orders schließen. if(caLO==true){ for(w=OrdersTotal()-1;w>=0;w--){ if(OrderSelect(w,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeSel){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_FiBuy){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeBuy){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} } } } } |
|
|||
Lass den EA im Tester laufen und such Dir eine Stelle, wo der Fehler auftritt. Dann mach Print Ausgaben rein und lass den EA immer wieder uber die Stelle laufen, bis Du den Fehler aussortiert hast.
|
|
|||
Hab ich vorhin gemacht. Sieht so aus, als ob das mit den Tickets nicht hin haut. Er scheint da was durcheinander zu bringen. Liegts vielleicht daran, dass an einigen Stellen die ersten Tickets aufgerufen, mit der Order Berechnungen/Vergleiche gemacht werden, und gleich darauf andere Order(s) über ihr Ticket aufgerufen werden, wieder Berechnungen/Vergleiche gemacht werden? Wenn beide Orders bestimmte Bedingungen erfüllen/nicht erfüllen, sollen entweder weitere Orders geöffnet oder Alle geschlossen werden.
Das gefiel mir aber sowieso nicht wirklich mit den Tickets. Er soll immer wieder die zuletzt geöffnete Order raus suchen und mit der dann halt Berechnungen/Vergleiche machen. Um dann eben entweder Weitere zu öffnen oder Alle zu schließen. Zu meiner Verteidigung: Wie soll ich wissen, dass das Ding anscheinend nicht richtig mit (4) Tickets umgehn kann? Dachte immer, irgendwas Anderes wär falsch. Die ersten 2 OrderSend-Geschichten scheinen zu funktionieren. Danach scheint er irgendwie die Tickets durcheinander zu bringen oder zu vergessen. Wenn ers nicht schon vorher tut. Code:
// ...FirstSell öffnen: if(IsTradeAllowed()==true){ TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,clrBlue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel = OrdersNeed_Multi * Opened_Sel; Need_Buy = OrdersNeed_Multi * Need_Sel;} // ...FirstBuy öffnen: if(IsTradeAllowed()==true){ TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,clrBlue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy = OrdersNeed_Multi * Opened_Buy; Need_Sel = OrdersNeed_Multi * Need_Buy;} ... // Wenn FirstSell Bedingungen erfüllt, next Sell öffnen. if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ FiSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO *_Point,_Digits); if( Bid <= FiSelOOP_DistONO ){ for( l=Need_Sel ; l>=1 ; l-- ){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel = OrdersNeed_Multi * Opened_Sel; Need_Buy = OrdersNeed_Multi * Need_Sel;} } } //============================================================================================================= // O P E N F I R S T N E X T B U Y //=============================================================================================================// FirstBuy auswählen... // Wenn FirstBuy Bedingungen erfüllt,next Buy öffnen. if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ FiBuyOOP_DistONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO *_Point,_Digits); if( Ask >= FiBuyOOP_DistONO ){ for( m=Need_Buy ; m>=1 ; m-- ){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy = OrdersNeed_Multi * Opened_Buy; Need_Sel = OrdersNeed_Multi * Need_Buy;} } ... //============================================================================================================= // 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 //=============================================================================================================// //Prüfen, ob letzter NextSell OpenNextOrder-Dist erreicht hat. if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){ NeSelOOP_DONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO *_Point,_Digits); if( Bid <= NeSelOOP_DONO ){ // Wenn ja, FirstSell raussuchen. if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ // Wenn FirstSell Gewinn-Distanz nicht erreicht hat... FiSelOOP_DCAO = NormalizeDouble( OrderOpenPrice() - Dist_CAO *_Point,_Digits); if( Ask > FiSelOOP_DCAO ){ // ...weitere Sell_Orders öffnen. for( l=Need_Sel ; l>=1 ; l-- ){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel = OrdersNeed_Multi * Opened_Sel; Need_Buy = OrdersNeed_Multi * Need_Sel;} }// ? } } } //============================================================================================================= // 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 //============================================================================================================= //Prüfen, ob letzter NextBuy OpenNextOrder-Dist erreicht hat: if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){ NeBuyOOP_DONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO *_Point,_Digits); if( Ask >= NeBuyOOP_DONO ){ // Wenn ja, FirstBuy raus suchen. if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ // Prüfen, ob FirstBuy Gewinn-Distanz erreicht hat. FiBuyOOP_DCAO=NormalizeDouble( OrderOpenPrice() + Dist_CAO *_Point,_Digits); // Wenn FirstBuy Gewinn-Distanz nicht erreicht hat... if( Bid < FiBuyOOP_DCAO ){ // weitere Buy-Orders öffnen. for( s=Need_Buy ; s>=1 ; s-- ){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy = OrdersNeed_Multi * Opened_Buy; Need_Sel = OrdersNeed_Multi * Need_Buy;} } } } } ... //============================================================================================================= // C L O S E A L L O R D E R S B Y S E L L D I S T //============================================================================================================= //Prüfen, ob letzter NextSell ONO-Dist erreicht hat. if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){ NeSelOOP_DONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO *_Point,_Digits); if( Bid <= NeSelOOP_DONO ){ // Wenn letzter NextSell ONO-Dist erreicht hat, FirstSell raus suchen. if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ // Wenn FirstSell Gewinn-Dist erreicht hat... FiSelOOP_DCAO = NormalizeDouble( OrderOpenPrice() - Dist_CAO *_Point,_Digits); if( Ask < FiSelOOP_DCAO ){ // ...CloseAll_"by_Short" auf true setzen... caSH=true; // ...Lots erhöhen... Lots = OrderLots() + LotsPlus; // ? } } } } //...und alle Orders schließen. if(caSH==true){ for(u=OrdersTotal()-1;u>=0;u--){ if(OrderSelect(u,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiBuy){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeBuy){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeSel){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_FiSel){ if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} } } } } //============================================================================================================= // C L O S E A L L O R D E R S B Y B U Y D I S T //============================================================================================================= //Prüfen, ob letzter NextBuy OpenNextOrder-Dist erreicht hat: if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){ NeBuyOOP_DONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO *_Point,_Digits); if( Ask >= NeBuyOOP_DONO ){ // Wenn ja, FirstBuy raus suchen. if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ // Wenn FirstBuy Gewinn-Dist erreicht hat... FiBuyOOP_DCAO = NormalizeDouble( OrderOpenPrice() + Dist_CAO *_Point,_Digits); if( Bid > FiBuyOOP_DCAO ){ caLO=true; // ...Lots erhöhen... Lots = OrderLots() + LotsPlus; // ? } } } } //...und alle Orders schließen. if(caLO==true){ for(w=OrdersTotal()-1;w>=0;w--){ if(OrderSelect(w,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeSel){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_FiBuy){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} if(OrderMagicNumber()==MN_NeBuy){ if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed); if(IsTradeContextBusy()==true)Sleep(slMS);} } } } } |
|
|||
Hallo.
Eins hab ich nie so richtig kapiert. So viel ich weiß, wird... Ein Buy zum Ask geöffnet. Ein Buy zum Bid geschlossen. Ein Sell zum Bid geöffnet. Ein Sell zum Ask geschlossen. Aber wenn die Buy-/Sell-Order dann im Markt ist, wie findet man dann raus, welchen "Wert" sie gerade hat? Woher weiß man dann den vorrausichtlichen OrderClosePrice? Um selber festzulegen, bei welchem Price sie schliessen sollen oder so. Oder um Break Even/Trailing Stop nachträglich richtig zu berechnen. Oder um vorrausichtlichen Verlust/Gewinn/was-auch-immer zu kalkulieren. Geändert von MA-EA (10.01.21 um 00:00 Uhr) |
|
|||
Eine Position öffnen oder schließen ist immer eine Handelsaktion.
Für einen Handel brauchst Du immer einen Handelspartner. Sprich: will ich 1 kg Gold kaufen, dann brauch ich jemand der 1 kg Gold verkauft. Die Menschen sind gierig. Sie wollen viel bekommen und wenig bezahlen. Also ist Ask meist > Bid. Die meisten Menschen verlangen also einen höheren Preis als andere bereit sind zu zahlen. Diesen Unterschied nennt man Spread. Will ich _jetzt_ 1 kg Gold kaufen, dann muss ich den billigsten Preis bezahlen, zu dem irgendjemand bereit ist zu verkaufen. Ich bezahle also den Ask Preis. Will ich dann theoretisch _sofort_ verkaufen, dann muss ich das höchste Gebot nehmen, dass jemand bereit ist zu zahlen, also den Bid Preis. Ich hätte also den Spread verloren. Eine Long Position öffnen und schliessen ist nichts anderes als etwas kaufen und wieder verkaufen. Geh mal auf eine Website wie Deribit und schau Dir mal an, wie sich ein Orderbook bewegt. Dann verstehst Du das besser. |
|
|||
Hallo.
Ist es besser, die ganzen Orders mit TP/SL zu schließen, oder sollte man das besser den EA berechnen und machen lassen? Mit TP/SL bräuchte der eigene PC weniger Leistung, vor allem bei der Verbindung. Aber der Broker kann genau sehn, wann Orders geschlossen werden (sollen). |
|
|||
Du hast das erste Problem schon erkannt. Deshalb geben manche Trader nie den 'echten' SL an, sondern nur einen Not-SL der halt greift, wenn der Kurs mal ganz wegbricht.
TP ist ne andere Diskussion. Da kommt es auf die Strategie an, ob Du besser aktiv aussteigst, oder z.B. nen festen TP nimmst. |
|
|||
Im Anhang die neueste Version. Müsste Alles richtig sein, kann aber nicht ausschließen, dass vielleicht doch irgendwelche Fehler drin sind. Hab ich noch nicht getestet.
Aber bestimmt kann man Einiges optimieren und einfacher schreiben. |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|