|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Feststellen aus welcher Richtung Indikator kommt
Hallo.
Um Fehlsignale zu reduzieren, würde ich gerne den EA im Anhang rausfinden lassen, aus welcher Richtung der RSI kommt. Genauer gesagt, ob er zuletzt über oder unter der jeweiligen Indicator Line war. Dachte an ne While-Schleife. Blöderweise hab ich diese Schleifen nie so richtig kapiert. Ungefähr so: Code:
RSI-Bar = 1; while RSI < && > IL1 und IL2 RSI-Bar++ return ( RSI-Wert wenn er zuletzt <Untere Linie oder >Obere Linie ist/war ) ; |
|
|||
Funktioniert das so?
Code:
//============================================================================================================= // O P E N O R D E R S //============================================================================================================= if( RT==true && SPR_AL==true && BuyInv==false && SelInv==false ){ int RSI_p_Bar = 2; double RSI_p = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_p_Bar); if(open_Buy==true){ if( RSI>RSI_IL_1 && RVI_Ma>RVI_Si ){ while( RSI_p > RSI_IL_1 ){ RSI_p_Bar++; Print( "-RSI Past=",RSI_p , "-RSI Past Bar=",RSI_p_Bar ); return(RSI_p);} if( RSI_p < RSI_IL_1 ){ if(IsTradeAllowed()==true)Ti=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Buy_SL,Buy_TP,NULL,Buy_MN,0,Beige); Print( "send Buy:" , "-RSI=",RSI , "-RVI_Ma=",RVI_Ma , "-RVI_Si=",RVI_Si ); if(Percent_of_Balance==true)Print( "AutoLot:" , "-MarginReq1L=",M_REQ , "-MinLot=",Min_L , "-OneL/MinL=",OneL_MinL , "-MREQ/MinL=",MREQ_MinL , "-AccBal=",AccountBalance() , "-1PercAccBal=",OPAB , "-ALP=",Auto_Lotsize_Perc , "-1PercAccBal*ALP=",OPAB_ALP , "-OPABALP/MREQMinL=",OPABALP_MREQMinL , "-OPABALP_MREQMinL*Min_L=",OPABALP_MREQMinL , "-Lots=OPABALP_MREQMinL*Min_L=",Lots ); return(Ti); } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(open_Sell==true){ if( RSI<RSI_IL_2 && RVI_Ma<RVI_Si ){ while(RSI_p < RSI_IL_2 ){ RSI_p_Bar++; Print( "-RSI Past=",RSI_p , "-RSI Past Bar=",RSI_p_Bar ); return(RSI_p);} if( RSI_p > RSI_IL_2 ){ if(IsTradeAllowed()==true)Ti=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Sel_SL,Sel_TP,NULL,Sell_MN,0,Blue); Print( "send Sell:" , "-RSI=",RSI , "-RVI_Ma=",RVI_Ma , "-RVI_Si=",RVI_Si ); Print( "AutoLot:" , "-MarginReq1L=",M_REQ , "-MinLot=",Min_L , "-OneL/MinL=",OneL_MinL , "-MREQ/MinL=",MREQ_MinL , "-AccBal=",AccountBalance() , "-1PercAccBal=",OPAB , "-ALP=",Auto_Lotsize_Perc , "-1PercAccBal*ALP=",OPAB_ALP , "-OPABALP/MREQMinL=",OPABALP_MREQMinL , "-OPABALP_MREQMinL*Min_L=",OPABALP_MREQMinL , "-Lots=OPABALP_MREQMinL*Min_L=",Lots ); return(Ti); }}} } |
|
|||
Anscheinend macht er das nur ein mal. Und öffnet Trades, obwohl die Kerzen was Anderes sagen.
Code:
int RSI_p_Bar = 2; double RSI_p = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_p_Bar); if(open_Buy==true){ if( RSI>RSI_IL_1 && RVI_Ma>RVI_Si ){ while( RSI_p > RSI_IL_1 ){ RSI_p_Bar++; Print( "-RSI Past=",RSI_p , "-RSI Past Bar=",RSI_p_Bar ); return(RSI_p);} if( RSI_p < RSI_IL_1 ){ Code:
if( RSI<RSI_IL_2 && RVI_Ma<RVI_Si ){ while(RSI_p < RSI_IL_2 ){ RSI_p_Bar++; Print( "-RSI Past=",RSI_p , "-RSI Past Bar=",RSI_p_Bar ); return(RSI_p);} if( RSI_p > RSI_IL_2 ){ |
|
|||
Vielleicht mit nem bool?
Code:
if( RSI > IL1 ) bool RSI_p_over_IL2 = true ; Code:
int RSI_p_Bar = 2; double RSI_p = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_p_Bar); if ( RSI_over_IL2 == true ) RSI_p_Bar++ ; Könnte das nach einem while ( bool == true ) - Prinzip ungefähr funktionieren? |
|
|||
Ich war jetzt schon eine Weile nicht auf hier, hätte nicht gedacht, dass du deine Monologe immer noch hier führst ...
|
|
|||
Hallo.
Im Anhang eine Version, in der versucht wird, festzustellen, aus welcher Richtung der RSI kommt. Von oben oder unten. Ich kenn mich mit MQL 4 nicht so gut aus und schon gar nicht mit irgendwelchen Schleifen. Die While-Schleifen im EA sollen zählen, wie oft die vergangenen RSI-Kerzen über oder unter dem von Bar 1 waren. Der kleinere Wert soll dann bestimmen, ober er auf jeweilige Einstiegssignale (Buy oder Sell) reagiert oder nicht. Aber wie gesagt ist das Alles für mich eigentlich viel zu hoch. Deswegen hab ich die OrderSend-Bedingungen erst mal ohne diese Zählerei gelassen. Keine Ahnung, ob ich damit wenigstens ein wenig auf dem Richtigen oder auf dem totalen Holzweg bin. Code:
//============================================================================================================= // R S I D E K L A R A T I O N //============================================================================================================= double RSI=iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,1); //------------------------------------------------------------------------------------------------------------- // RSI past int RSI_Past_Bar = 2; double RSI_Past = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_Past_Bar); int RSI_P_under=0; int RSI_P_over=0; if( RSI > RSI_IL_1 && RSI < RSI_IL_2 ) { while( RSI_Past < RSI ){ RSI_P_under++; RSI_Past_Bar++; Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_under=",RSI_P_under ); return(RSI_P_under);} while( RSI_Past > RSI ){ RSI_P_over++; RSI_Past_Bar++; Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_over=",RSI_P_over ); return(RSI_P_over);} } |
|
|||
Kann jetzt nicht mehr Editieren. So müsste es reichen.
Code:
//============================================================================================================= // R S I D E K L A R A T I O N //============================================================================================================= double RSI=iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,1); //------------------------------------------------------------------------------------------------------------- // RSI past int RSI_Past_Bar = 2; double RSI_Past = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_Past_Bar); int RSI_P_under=0; int RSI_P_over=0; while( RSI_Past < RSI ){ RSI_P_under++; RSI_Past_Bar++; Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_under=",RSI_P_under ); return(RSI_P_under);} while( RSI_Past > RSI ){ RSI_P_over++; RSI_Past_Bar++; Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_over=",RSI_P_over ); return(RSI_P_over);} |
|
|||
Code:
if (RSI0 > EbeneX && RSI1 < EbeneX) Der RSI schneidet die EbeneX von unten nach oben. if (RSI0 < EbeneX && RSI1 > EbeneX) Der RSI schneidet die EbeneX von oben nach unten. |
|
|||
Danke. Aber dann steigt er nur ein, wenn die Werte sich gerade erst gekreuzt haben. Er soll auch Stunden später noch einsteigen.
Irgendeinen Weg muss es geben, raus zu finden, ob der RSI zuletzt unter Indicator Line 1 (Bestätigung für Buy) oder über Indicator Line 2 (Bestätigung für Sell) war. Mit der Idee zeigt er irgendwie immer nur Kerze 3 an und tut dann nix mehr. Ausser immer weiter zu printen. Code:
// RSI past int RSI_Past_Bar = 2; double RSI_Past = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_Past_Bar); int RSI_P_under=0; int RSI_P_over=0; while( RSI_Past < RSI ){ RSI_P_under++; RSI_Past_Bar++; Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_under=",RSI_P_under ); return(RSI_P_under);} while( RSI_Past > RSI ){ RSI_P_over++; RSI_Past_Bar++; Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_over=",RSI_P_over ); return(RSI_P_over);} |
Lesezeichen |
|
|