|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Lass es halt mal im Tester laufen
|
|
|||
Hallo.
Im Anhang die neueste Version. Schien heute im EURUSD zu funktionieren. Aber wie gesagt bin ich nicht gerade Experte... Im USDJPY funktionierte er allerdings nicht ganz so wie er sollte. Vermute, dass es an den 3 Nachkommastellen liegt. Er berechnet Alles mit Code:
NormalizeDouble( ... *_Point,_Digits ) |
|
||||
Dir hier in diesem Thema schon die Antwort gegeben
|
|
|||
Zitat:
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo.
Bei manchen Forex-Pairs funktioniert das Gerät im Anhang anscheinend richtig und bei Manchen nicht. Entweder kann das Ding nicht mit den ganzen MagicNumbers umgehn oder bei der Rechnerei läuft irgendwas schief. Was ich eher vermute. Aber mit NormalizeDouble müsste doch Alles richtig berechnet werden. So soll berechnet werden, wann weitere Orders geöffnet oder Alle geschlossen werden sollen. Ist doch eigentlich korrekt. Trotzdem wird bei vielen ForexPairs anscheinend nicht zum richtigen Zeitpunkt geöffnet, geschweige denn Alles geschlossen. Code:
extern string esDOONO1="Dist to OrderOpenPrice()"; extern string esDOONO2="open next Order"; extern int D_ONO=25; //-----------------------------------------------------------------------------------------------------------*/ extern string esDOCAO1="Dist to OrderOpenPrice()"; extern string esDOCAO2="close all Orders"; extern int D_CAO=50 Code:
// Prüfen, ob FirstSel unter D_ONO ist: FiSel_DONO=NormalizeDouble(OrderOpenPrice()-D_ONO*_Point,_Digits); // Wenn FirstSel unter D_ONO ist... if(Bid<=FiSel_DONO){ "...weitere Sell-Orders öffnen..." // Prüfen, ob FirstBuy über D_ONO ist: FiBuy_DONO=NormalizeDouble(OrderOpenPrice()+D_ONO*_Point,_Digits); // Wenn FirstBuy über D_ONO ist... if(Ask>=FiBuy_DONO){"...weitere Buy-Orders öffnen..." Code:
// ...prüfen, ob FirstSel Gewinn-Dist erreicht hat: FiSel_DCAO=NormalizeDouble(OrderOpenPrice()-D_CAO*_Point,_Digits); // Wenn FirstSell Gewinn-Dist erreicht hat... if(Ask<=FiSel_DCAO){"...alle Orders schließen..." FiBuy_DCAO=NormalizeDouble(OrderOpenPrice()+D_CAO*_Point,_Digits); // Wenn FirstBuy Gewinn-Dist erreicht hat... if(Bid>=FiBuy_DCAO){"...alle Orders schließen..." Code:
/*============================================================================================================= // N O T I Z E N U N D I N F O S //============================================================================================================= In dieser Vers. werden keine Tickets benutzt! //------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------- In dieser Vers. werden neue Orders geöffnet, wenn die vorherigen im Gewinn-Bereich sind. Umgekehrt ist vermutlich nicht so gut... //------------------------------------------------------------------------------------------------------------- //============================================================================================================= // P R O P E R T Y //============================================================================================================*/ //#property strict //#ps sorgt anscheinend dafür, dass Kommentare im Konfig-Fenster im MT4 sichtbar sind. #property copyright"LoShD_MNpm.mq4" #property copyright"daniel-rudloff@web.de" //============================================================================================================= // B E S C H R E I B U N G //============================================================================================================= extern string esTOY="true = on / yes"; extern string esFON="false = off / no"; //-----------------------------------------------------------------------------------------------------------*/ extern string esB01="Open 1.Sell & 1.Buy."; extern string esB02="If (last) Sell <="; extern string esB03="( OrderOpenPrice()"; extern string esB04="- D_ONO )"; extern string esB05="open more Sell"; extern string esB06="till"; extern string esB07="1.Sell <="; extern string esB08="( OrderOpenPrice() - D_CAO )."; extern string esB09="If (last) Buy >="; extern string esB10="( OrderOpenPrice()"; extern string esB11="+ D_ONO )"; extern string esB12="open more Buy"; extern string esB13="till"; extern string esB14="1.Buy >="; extern string esB15="( OrderOpenPrice()"; extern string esB16="+ D_CAO )"; //============================================================================================================= // E I N S T E L L U N G E N //============================================================================================================= extern string esMNF1="Magic Numbers"; extern int MN_FiSel=12; extern int MN_FiBuy=34; extern string esMNNSD="MN_NeSel--"; extern int MN_NeSel_def=4999; extern string esMNNBD="MN_NeBuy++"; extern int MN_NeBuy_def=5001; //-----------------------------------------------------------------------------------------------------------*/ extern string esOOFT1="Open Orders"; extern string esOOFT2="from/till Hour"; extern string esOOFT3="(Server Time)"; extern int FromH=5;// Vor 5 Uhr starten scheint sich nicht zu lohnen. extern int TillH=15;// Zum Testen bis einschließlich 15 Uhr öffnen lassen. //-----------------------------------------------------------------------------------------------------------*/ extern int Slippage=12345; //-----------------------------------------------------------------------------------------------------------*/ extern int SL=475;// ? //-----------------------------------------------------------------------------------------------------------*/ extern int TP=325;// ? //-----------------------------------------------------------------------------------------------------------*/ extern string esIITCBSMS1="if IsTradeContexBusy()"; extern string esIITCBSMS2="sleep MS"; extern int slMS=20;// //-----------------------------------------------------------------------------------------------------------*/ extern string esDOONO1="Dist to OrderOpenPrice()"; extern string esDOONO2="open next Order"; extern int D_ONO=25;// Zum Testen ... //-----------------------------------------------------------------------------------------------------------*/ extern string esDOCAO1="Dist to OrderOpenPrice()"; extern string esDOCAO2="close all Orders"; extern int D_CAO=50;// Zum Testen ... Weniger als ca. ? ? ist wahrscheinlich nicht ausreichend? //-----------------------------------------------------------------------------------------------------------*/ extern int OrdersNeed_Multi=3;// Zum Testen 3. 1-4? //-----------------------------------------------------------------------------------------------------------*/ extern double Lots=0.01; extern double LotsPlus=0.0;// Zum Testen 0.01? Lots automatisch erhöhen nach jedem Durchgang? //============================================================================================================= // 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, OC ; //-----------------------------------------------------------------------------------------------------------*/ double SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL, FiSel_DONO,FiBuy_DONO, NeSel_DONO,NeBuy_DONO, FiSel_DCAO,FiBuy_DCAO ; //-----------------------------------------------------------------------------------------------------------*/ int TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy, MN_NeSel,MN_NeBuy, i,j,k,l,m,n,o,p,q,r,s,t,u, Opened_Sel,Opened_Buy, Need_Sel,Need_Buy ; //============================================================================================================= // I N I T / D E I N I T //============================================================================================================= void OnInit(){} void OnDeinit(const int reason){}// DeInit überflüssig? //============================================================================================================= // 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;} if(SL>=1){ 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;} if(TP>=1){ TP_Sel=NormalizeDouble(Bid-TP*_Point,_Digits); TP_Buy=NormalizeDouble(Ask+TP*_Point,_Digits);} //============================================================================================================= // O R D E R S E A R C H 1 //============================================================================================================= 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_FiSel)fiSH=true; if(OrderMagicNumber()==MN_NeSel)neSH=true; if(OrderMagicNumber()==MN_FiBuy)fiLO=true; if(OrderMagicNumber()==MN_NeBuy)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 //============================================================================================================= // Wenn gar keine Orders offen sind... if(fiSH==false&&fiLO==false&&neSH==false&&neLO==false){ //MNs auf default setzen: MN_NeSel=MN_NeSel_def; MN_NeBuy=MN_NeBuy_def; //Alle Zähler auf 0 setzen: Opened_Sel=0; Opened_Buy=0; Need_Sel =0; Need_Buy =0; //Wenn zur Zeit Orders geöffnet werden dürfen FirstSel und FirstBuy öffnen. if(Hour()>=FromH&&Hour()<=TillH){ if(IsTradeAllowed()==true)TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); if(IsTradeAllowed()==true)TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,Blue); if(IsTradeContextBusy()==true)Sleep(slMS);}} //============================================================================================================= // O R D E R S E A R C H 2 //============================================================================================================= fiSH=false; neSH=false; fiLO=false; neLO=false; for(j=OrdersTotal()-1;j>=0;j--){ if(OrderSelect(j,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel)fiSH=true; if(OrderMagicNumber()==MN_NeSel)neSH=true; if(OrderMagicNumber()==MN_FiBuy)fiLO=true; if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}} // Wenn nur FirstSel und FirstBuy offen sind... if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){ //...FirstSel / FirstBuy raus suchen: for(k=OrdersTotal()-1;k>=0;k--){ if(OrderSelect(k,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ //============================================================================================================= // O P E N F I R S T N E X T S E L L //============================================================================================================= // FirstSel auswählen: if(OrderMagicNumber()==MN_FiSel){ // Prüfen, ob FirstSel unter D_ONO ist: FiSel_DONO=NormalizeDouble(OrderOpenPrice()-D_ONO*_Point,_Digits); // Wenn FirstSel unter D_ONO ist... if(Bid<=FiSel_DONO){ // MN_NeSel(==MN_NeSel_def) um 1 verringern: MN_NeSel--; // ...erste NextSels öffnen: for(k=OrdersNeed_Multi;k>=1;k--){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel=OrdersNeed_Multi*Opened_Sel; Need_Buy=OrdersNeed_Multi*Need_Sel; } } }// FirstSel mit MN_FiSel ausgewählt. //============================================================================================================= // O P E N F I R S T N E X T B U Y //============================================================================================================= // FirstBuy auswählen: if(OrderMagicNumber()==MN_FiBuy){ // Prüfen, ob FirstBuy über D_ONO ist: FiBuy_DONO=NormalizeDouble(OrderOpenPrice()+D_ONO*_Point,_Digits); // Wenn FirstBuy über D_ONO ist... if(Ask>=FiBuy_DONO){ // MN_NeBuy (==MN_NeBuy_def) um 1 erhöhen: MN_NeBuy++; // ...erste NextBuys öffnen: for(l=OrdersNeed_Multi;l>=1;l--){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy=OrdersNeed_Multi*Opened_Buy; Need_Sel=OrdersNeed_Multi*Need_Buy; } } }// FirstBuy mit MN_FiBuy ausgewählt. //-----------------------------------------------------------------------------------------------------------*/ } } } }// nach Order Search 2 //============================================================================================================= // O R D E R S E A R C H 3 //============================================================================================================= fiSH=false; neSH=false; fiLO=false; neLO=false; for(m=OrdersTotal()-1;m>=0;m--){ if(OrderSelect(m,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel)fiSH=true; if(OrderMagicNumber()==MN_NeSel)neSH=true; if(OrderMagicNumber()==MN_FiBuy)fiLO=true; if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}} //Wenn FirstSel und FirstBuy offen sind... if(fiSH==true&&fiLO==true){ //============================================================================================================= // C H E C K L A S T N E X T S E L L //============================================================================================================= //...und wenn NextSel offen ist... if(neSH==true){ // ...letzten NextSel raus suchen: for(n=OrdersTotal()-1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_NeSel){ // Wenn letzter NextSel unter D_ONO ist... NeSel_DONO=NormalizeDouble(OrderOpenPrice()-D_ONO*_Point,_Digits); if(Bid<=NeSel_DONO){ // ...FirstSel raus suchen: for(o=OrdersTotal()-1;o>=0;o--){ if(OrderSelect(o,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel){ // ...prüfen, ob FirstSel Gewinn-Dist erreicht hat: FiSel_DCAO=NormalizeDouble(OrderOpenPrice()-D_CAO*_Point,_Digits); //============================================================================================================= // O P E N M O R E N E X T S E L L //============================================================================================================= // Wenn FirstSel Gewinn-Dist nicht erreicht hat... if(Ask>FiSel_DCAO){ // MN_NeSel wieder um 1 verringern... MN_NeSel--; // ...und weitere SelOrders öffnen. for(p=Need_Sel;p>=1;p--){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel=OrdersNeed_Multi*Opened_Sel; Need_Buy=OrdersNeed_Multi*Need_Sel;}} //============================================================================================================= // C L O S E A L L B Y S E L //=============================================================================================================// // Wenn FirstSell Gewinn-Dist doch erreicht hat... if(Ask<=FiSel_DCAO){ // ...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(IsTradeAllowed()==true)OC=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(slMS);}}}} //-----------------------------------------------------------------------------------------------------------*/ } } } } } } } } } }// neSh==true //============================================================================================================= // C H E C K L A S T N E X T B U Y //============================================================================================================= // wenn NextBuy offen ist... if(neLO==true){ // ...letzten NextBuy auswählen: for(r=OrdersTotal()-1;r>=0;r--){ if(OrderSelect(r,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_NeBuy){ // Wenn letzter NextBuy über D_ONO ist... NeBuy_DONO=NormalizeDouble(OrderOpenPrice()+D_ONO*_Point,_Digits); if(Ask>=NeBuy_DONO){ // Prüfen, ob FirstBuy Gewinn-Dist erreicht hat: for(s=OrdersTotal()-1;s>=0;s--){ if(OrderSelect(s,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiBuy){ FiBuy_DCAO=NormalizeDouble(OrderOpenPrice()+D_CAO*_Point,_Digits); //============================================================================================================= // O P E N M O R E N E X T B U Y //============================================================================================================= // Wenn FirstBuy Gewinn-Dist nicht erreicht hat... if(Bid<FiBuy_DCAO){ // MN_NeBuy um 1 erhöhen... MN_NeBuy++; // ...und weitere Buy-Orders öffnen: for(t=Need_Buy;t>=1;t--){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue); 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 B Y B U Y //============================================================================================================= // Wenn FirstBuy Gewinn-Dist doch erreicht hat... if(Bid>=FiBuy_DCAO){ // ...Lots erhöhen... Lots=OrderLots()+LotsPlus;// ? // ...und alle Orders schließen. for(u=OrdersTotal()-1;u>=0;u--){ if(OrderSelect(u,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(IsTradeAllowed()==true)OC=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(slMS);}}}} //-----------------------------------------------------------------------------------------------------------*/ } } } } } } } } } }// Letzter NextBuy ausgewählt. //-----------------------------------------------------------------------------------------------------------*/ }// nach OS3. ( fiSH==true && fiLO==true ) //============================================================================================================= // E A F U N K T I O N E N B E E N D E N //============================================================================================================= }// void OnTick() |
|
|||
Hallo.
Hab den Verdacht, dass NormalizeDouble() alleine nicht ausreicht, um die eigenen Abstände, bei denen geöffnet oder geschlossen werden soll, richtig zu berechnen. Reicht diese kleine Anweisung, damit Alles richtig berechnet wird, oder muss man das jedes Mal extra festlegen? Code:
if(Digits==3||Digits==5){ D_ONO=10*D_ONO; D_CAO=10*D_CAO;} |
|
|||
Hallo.
Ist anscheinend wirklich so, dass der EA irgendwie falsch mit NormalizeDouble umgeht. Anscheinend geht der MT4 richtig mit Double-Werten um, der EA scheint aber (in diesem Bsp.) von 5 digits nur 4 zu benutzen. Dann ist wohl klar, warum er oft nicht richtig arbeitet:Von den beiden letzten Nachkommastellen benutzt er anscheinend nur die Vorletzte. Code:
05:18:40.121 LoShD_MNpm_PRINT AUDUSD,M5:Checked Last NeSel:-MN_NeSel=4997-NeSel_DONO=0.7732-OrderOpenPrice()=0.7737-D_ONO=25-Bid=0.7732-MN_FiSel=12-D_CAO=50-FiSel_DCAO=0.7732-Ask=0.7732 05:20:41.410 LoShD_MNpm_PRINT AUDUSD,M5: close #367786198 sell 0.01 AUDUSD at 0.77318 sl: 0.77691 tp: 0.77041 at price 0.77301 Jedenfalls hoffe ich mal, dass es so funktioniert: Code:
MI_DIG=MarketInfo(Symbol(),MODE_DIGITS); MI_ASK=MarketInfo(Symbol(),MODE_ASK); MI_BID=MarketInfo(Symbol(),MODE_BID); Code:
FiSel_DONO=NormalizeDouble(OrderOpenPrice()-D_ONO*Point,Digits); FiBuy_DONO=NormalizeDouble(OrderOpenPrice()+D_ONO*Point,Digits); FiSel_DCAO=NormalizeDouble(OrderOpenPrice()-D_CAO*Point,Digits); FiBuy_DCAO=NormalizeDouble(OrderOpenPrice()+D_CAO*Point,Digits); |
|
|||
Dann scheint das mit
Code:
NormalizeDouble( xy * Point , Digits ) Ob man bei OrderSend() / OrderClose() beim Price Ask, Bid, NULL oder 5*3-100 einträgt, scheint egal zu sein. Manchmal macht das Ding seinen Job, manchmal nicht. Im Anhang die neueste Version. Hat vorhin wieder manchmal nicht gemacht, was sie soll. Hab versucht, nen paar Sachen besser zu machen, aber keine Ahnung, was das Ding im Anhang anstellt oder nicht. Bin für jegliche Hinweise, Tipps, Anregungen, Kritiken, was auch immer, dankbar. Code:
//============================================================================================================= // E I N S T E L L U N G E N //============================================================================================================= extern string esMN="Magic Numbers"; extern int MN_FiSel=12; extern int MN_FiBuy=34; extern int MN_NeSel=56; extern int MN_NeBuy=78; //-----------------------------------------------------------------------------------------------------------*/ extern string esOOFT1="Open Orders"; extern string esOOFT2="from/till Hour"; extern string esOOFT3="(Server Time)"; extern int FromH=5;// Vor 5 Uhr starten scheint sich nicht zu lohnen. extern int TillH=15;// Zum Testen bis einschließlich 15 Uhr öffnen lassen. //-----------------------------------------------------------------------------------------------------------*/ extern string esTF="TimeFrame"; input ENUM_TIMEFRAMES TF=15;// Zum Testen M15 //-----------------------------------------------------------------------------------------------------------*/ extern int Slippage=12345; //-----------------------------------------------------------------------------------------------------------*/ extern int SL=375;// ? //-----------------------------------------------------------------------------------------------------------*/ extern int TP=275;// ? //-----------------------------------------------------------------------------------------------------------*/ extern string esIITCBSMS1="if IsTradeContexBusy()"; extern string esIITCBSMS2="sleep MS"; extern int slMS=40;// Zum Testen 40ms //-----------------------------------------------------------------------------------------------------------*/ extern string esDOONO1="Dist to OrderOpenPrice()"; extern string esDOONO2="open next Order"; extern int D_ONO=25;// Zum Testen 25 //-----------------------------------------------------------------------------------------------------------*/ extern string esDOCAO1="Dist to OrderOpenPrice()"; extern string esDOCAO2="close all Orders"; extern int D_CAO=50;// Zum Testen 50 //-----------------------------------------------------------------------------------------------------------*/ extern int OrdersNeed_Multi=2;// Zum Testen 2. 1-4? //-----------------------------------------------------------------------------------------------------------*/ extern double Lots=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, OC ; //-----------------------------------------------------------------------------------------------------------*/ double SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL, FiSel_DON_Sel,FiBuy_DON_Buy, NeSel_DON_Sel,NeSel_DON_Buy,NeBuy_DON_Sel,NeBuy_DON_Buy, FiSel_DCAO,FiBuy_DCAO ; //-----------------------------------------------------------------------------------------------------------*/ int MI_DIG, TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy, i,j,k,l,m,n,o,p,q,r,s,t,u, Opened_Sel,Opened_Buy, Need_Sel,Need_Buy ; //============================================================================================================= // I N I T //============================================================================================================= void OnInit(){ChartSetSymbolPeriod(0,NULL,TF);} //============================================================================================================= // E A F U N K T I O N E N S T A R T //============================================================================================================= void OnTick(){ //============================================================================================================= // M A R K E T I N F O //============================================================================================================= MI_DIG=MarketInfo(Symbol(),MODE_DIGITS); //============================================================================================================= // 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;} if(SL>=1){ 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;} if(TP>=1){ TP_Sel=NormalizeDouble(Bid-TP*Point,Digits); TP_Buy=NormalizeDouble(Ask+TP*Point,Digits);} //============================================================================================================= // O R D E R S E A R C H 1 //============================================================================================================= 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_FiSel)fiSH=true; if(OrderMagicNumber()==MN_NeSel)neSH=true; if(OrderMagicNumber()==MN_FiBuy)fiLO=true; if(OrderMagicNumber()==MN_NeBuy)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 //============================================================================================================= //Wenn gar keine Orders offen sind... if(fiSH==false&&fiLO==false&&neSH==false&&neLO==false){ //...alle Zähler auf 0 setzen... Opened_Sel=0; Opened_Buy=0; Need_Sel=0; Need_Buy=0; //...und wenn zur Zeit Orders geöffnet werden dürfen, FirstSel und FirstBuy öffnen. if(Hour()>=FromH&&Hour()<=TillH){ if(IsTradeAllowed()==true)TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); if(IsTradeAllowed()==true)TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,Blue); if(IsTradeContextBusy()==true)Sleep(slMS);}}// Gar keine Orders offen. //============================================================================================================= // O R D E R S E A R C H 2 //============================================================================================================= fiSH=false; neSH=false; fiLO=false; neLO=false; for(j=OrdersTotal()-1;j>=0;j--){ if(OrderSelect(j,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel)fiSH=true; if(OrderMagicNumber()==MN_NeSel)neSH=true; if(OrderMagicNumber()==MN_FiBuy)fiLO=true; if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}} //-----------------------------------------------------------------------------------------------------------*/ // Wenn FirstSel und FirstBuy offen sind... if(fiSH==true&&fiLO==true){ //============================================================================================================= //O P E N N E X T S E L B Y F I R S T S E L //============================================================================================================= //...wenn noch kein NextSel offen ist... if(neSH==false){ // ...FirstSel auswählen: if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ // Wenn FirstSel unter D_ONO ist... FiSel_DON_Sel=NormalizeDouble(OrderOpenPrice()-D_ONO*Point,Digits); if(Bid<=FiSel_DON_Sel){ // ...erste NextSels öffnen. for(k=OrdersNeed_Multi;k>=1;k--){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel=OrdersNeed_Multi*Opened_Sel; Need_Buy=OrdersNeed_Multi*Need_Sel; } } } } }// noch kein NextSel offen. //============================================================================================================= //O P E N N E X T B U Y B Y F I R S T B U Y //============================================================================================================= //...wenn noch kein NextBuy offen ist... if(neLO==false){ // FirstBuy auswählen: if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ // Wenn FirstBuy über D_ONO ist... FiBuy_DON_Buy=NormalizeDouble(OrderOpenPrice()+D_ONO*Point,Digits); if(Ask>=FiBuy_DON_Buy){ // ...erste NextBuys öffnen. for(l=OrdersNeed_Multi;l>=1;l--){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy=OrdersNeed_Multi*Opened_Buy; Need_Sel=OrdersNeed_Multi*Need_Buy; } } } } }// Noch kein NextBuy offen. //-----------------------------------------------------------------------------------------------------------*/ }// FirstSel und FirstBuy offen nach Order Search 2 //============================================================================================================= // O R D E R S E A R C H 3 //============================================================================================================= fiSH=false; neSH=false; fiLO=false; neLO=false; for(m=OrdersTotal()-1;m>=0;m--){ if(OrderSelect(m,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel)fiSH=true; if(OrderMagicNumber()==MN_NeSel)neSH=true; if(OrderMagicNumber()==MN_FiBuy)fiLO=true; if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}} //Wenn FirstSel und FirstBuy offen sind... if(fiSH==true&&fiLO==true){ //und NextSel und/oder NextBuy offen ist... if(neSH==true||neLO==true){ //============================================================================================================= // S E L E C T N E X T S E L //============================================================================================================= // ...letzten NextSel raus suchen: if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ //============================================================================================================= // O P E N M O R E B U Y B Y N E X T S E L //============================================================================================================= // Wenn NextSel über NextBuy-D_ONO ist... NeSel_DON_Buy=NormalizeDouble(OrderOpenPrice()+D_ONO*Point,Digits); if(Ask>=NeSel_DON_Buy){// Ask oder Bid ? // ...FirstBuy auswählen: if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ // Wenn FirstBuy Gewinn-Dist nicht erreicht hat... FiBuy_DCAO=NormalizeDouble(OrderOpenPrice()+D_CAO*Point,Digits); if(Bid<FiBuy_DCAO){ // ...weitere Buy-Orders by NextSel öffnen: for(p=Need_Buy;p>=1;p--){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy=OrdersNeed_Multi*Opened_Buy; Need_Sel=OrdersNeed_Multi*Need_Buy;} } } } }// letzter NextSel über D_ONO (open more NextBuy) //============================================================================================================= // O P E N M O R E S E L B Y N E X T S E L //============================================================================================================= // Wenn letzter NextSel unter D_ONO ist... NeSel_DON_Sel=NormalizeDouble(OrderOpenPrice()-D_ONO*Point,Digits); if(Bid<=NeSel_DON_Sel){ // ...FirstSel raus suchen... if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ // Wenn FirstSel Gewinn-Dist nicht erreicht hat... FiSel_DCAO=NormalizeDouble(OrderOpenPrice()-D_CAO*Point,Digits); if(Ask>FiSel_DCAO){ // ...weitere SelOrders öffnen. for(n=Need_Sel;n>=1;n--){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel=OrdersNeed_Multi*Opened_Sel; Need_Buy=OrdersNeed_Multi*Need_Sel; } } } } }// FirstSel hat Gewinn-Dist nicht erreicht. Weitere Sel öffnen. //============================================================================================================= // C L O S E A L L B Y S E L //=============================================================================================================// // Wenn FirstSel Gewinn-Dist doch erreicht hat alle Orders schließen. if(Ask<=FiSel_DCAO){ for(o=OrdersTotal()-1;o>=0;o--){ if(OrderSelect(o,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiBuy ||OrderMagicNumber()==MN_NeBuy ||OrderMagicNumber()==MN_FiSel ||OrderMagicNumber()==MN_NeSel){ if(IsTradeAllowed()==true)OC=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(slMS);} } } } }// FiSel hat CAO-Dist erreicht. //-----------------------------------------------------------------------------------------------------------*/ } }// Nach Order Search 3 NextSel ausgewählt. //============================================================================================================= // S E L E C T N E X T B U Y //============================================================================================================= // ...letzten NextBuy auswählen: if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ //============================================================================================================= // O P E N M O R E S E L B Y L A S T B U Y //============================================================================================================= // Wenn letzter NextBuy unter D_ONO ist... NeBuy_DON_Sel=NormalizeDouble(OrderOpenPrice()-D_ONO*Point,Digits); if(Bid<=NeBuy_DON_Sel){ // ...FirstSel raus suchen... if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ // Wenn FirstSel Gewinn-Dist nicht erreicht hat... FiSel_DCAO=NormalizeDouble(OrderOpenPrice()-D_CAO*Point,Digits); if(Ask>FiSel_DCAO){ // ...weitere SelOrders öffnen. for(n=Need_Sel;n>=1;n--){ if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Sel++; Need_Sel=OrdersNeed_Multi*Opened_Sel; Need_Buy=OrdersNeed_Multi*Need_Sel; } } } } }// Nach OrderSearch 3 NextBuy unter Dist-ONO. //============================================================================================================= // O P E N M O R E B U Y B Y L A S T B U Y //============================================================================================================= // Wenn letzter NextBuy über D_ONO ist... NeBuy_DON_Buy=NormalizeDouble(OrderOpenPrice()+D_ONO*Point,Digits); if(Ask>=NeBuy_DON_Buy){ // Prüfen, ob FirstBuy Gewinn-Dist erreicht hat: if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ if(OrderSymbol()==Symbol()){ // Wenn FirstBuy Gewinn-Dist nicht erreicht hat... FiBuy_DCAO=NormalizeDouble(OrderOpenPrice()+D_CAO*Point,Digits); if(Bid<FiBuy_DCAO){ // ...weitere Buy-Orders öffnen: for(p=Need_Buy;p>=1;p--){ if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue); if(IsTradeContextBusy()==true)Sleep(slMS); Opened_Buy++; Need_Buy=OrdersNeed_Multi*Opened_Buy; Need_Sel=OrdersNeed_Multi*Need_Buy; } } } } }// FirstBuy hat Gewinn-Dist nicht erreicht. //============================================================================================================= // C L O S E A L L B Y F I R S T B U Y //============================================================================================================= // Wenn FirstBuy Gewinn-Dist doch erreicht hat alle Orders schließen. if(Bid>=FiBuy_DCAO){ for(q=OrdersTotal()-1;q>=0;q--){ if(OrderSelect(q,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_FiSel ||OrderMagicNumber()==MN_NeSel ||OrderMagicNumber()==MN_FiBuy ||OrderMagicNumber()==MN_NeBuy){ if(IsTradeAllowed()==true)OC=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(slMS);} } } } }// FirstBuy hat Gewinn-Dist erreicht //-----------------------------------------------------------------------------------------------------------*/ } }// Nach Order Search 3 NextBuy ausgewählt. //-----------------------------------------------------------------------------------------------------------*/ } }// Nach Order Search 3 NextSel und/oder NextBuy offen. //============================================================================================================= // E A F U N K T I O N E N B E E N D E N //============================================================================================================= }// void OnTick() |
|
|||
Die Strategie ansich scheint funktionieren zu können. Nur der EA macht oft nicht, was er soll. So dass ich die ganzen Orders eben selber schließen durfte.
Code:
2021.02.03 Gross Profit:107.19Gross Loss:1.90Total Net Profit:105.29 Total Trades:250Short Positions (won %):3 (0.00%)Long Positions (won %):247 (100.00%) Profit Trades (% of total):247 (98.80%)Loss trades (% of total):3 (1.20%) |
Lesezeichen |
|
|