|
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:
Das war gestern Abend auch mein Gedanke und ich hab darauf hin den Indikator in einen fertigen EA gehängt und durchgestept. Der BuyArrow wurde gezeichnet, ein dementsprechender Wert kam aber nicht bei der jeweiligen Kerze bei mir an Anmerken möchte ich aber, dass man diese Buffer ohnehin nicht benötigt, da man das ganze auch schön z.B.: mit "Ask > UpperLine" im EA selbst auswerten kann. |
|
|||
Hab ich, passt. Uperline und Lowerline als Ordertrigger, erinnern mich an Markttechnik (123). Das ist in dieser Konstellation relativ gefährlich. Die Kombination mit einem Non-Redraw-Zigzag erscheint mir überlegenswert.
|
|
|||
es ist doch ne weile vergangen seitdem ich den Thread eröffnet habe und hab da einiges vergessen was ich probiert habe um das Problem zu lösen, sorry leute für die verwirrung, hab da so einiges wohl nicht mitgeteilt weil es mittlerweise auch länger her ist und ich es vergessen hab, bin zwar noch am Anfang meines Programierdaseins aber das eine oder andere hab ich schon gelernt . Was ihr schreibt ist völlig korrekt , so bin ich auch vorgegangen, denk das ich nicht sämtliche schritte mitgeteilt habe , ist das für euch natürlich auch nicht ersichtlich.
Also was ich immer tuhe wenn ich etwas anfange mit nem Indikator zu proggen, ist erstmal schauen ob ich die Werte der Buffer korrekt zurück bekomme, idR. klappt das ganz einfach mit iCustom und dann beginnt man ja mit dem logischen Konstrukt/Aufbau des Codes. So hab ich es auch hier versucht. Von Empty Value hab ich davor noch nie was gelesen/gehört. Um zu sehen ob der Indikator auch nen anderen Wert zurück gibt als den Standartwert von Empty Value, hab ich dann eben auch ne Codezeile dazu geschrieben. Das Ergebnis ist, dass ich einmalig einen Wert zurück bekommen hatte und danach nix mehr passiert is. Kann natürlich sein das ich auch was falsch gemacht habe. Ich habs heut nochmal probiert mit dem selben ergebnis, hier ist der Code dazu mit nem Chartbeispiel.... Code:
int OnInit() { //--- Anzeige(); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int start() { double A = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,0,1); //Buffer 0 double B = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,1,1); //Buffer 1 double C = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,2,1); //Buffer 2 double D = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,3,1); //Buffer 3 double E = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,4,1); //Buffer 4 double F = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,5,1); //Buffer 5 double G = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,6,1); //Buffer 6 double H = iCustom(NULL,0,"Testindikator",5,0.4,1.0,true ,true,true,1.5,3.0,true,7,1); //Buffer 7 double EV = EMPTY_VALUE;// Empty Value Wert Comment("Buffer 4: ",E,"\nBuffer 5: ",F,"\nEV : ",EV); if(E != EV && Close[1]> E) { Ausgabe ("Buffer 4",DoubleToString(E,5),clrWhite); Ausgabe ("Buffer 4 Time",TimeToStr (Time[1],TIME_MINUTES),clrWhite); Ausgabe ("Buffer 4 Date",TimeToStr (Time[1],TIME_DATE),clrWhite); } if(F != EV && Close[1] < F) { Ausgabe ("Buffer 5",DoubleToString(F,5),clrWhite); Ausgabe ("Buffer 4 Time",TimeToStr (Time[1],TIME_MINUTES),clrWhite); Ausgabe ("Buffer 5 Date",TimeToStr (Time[1],TIME_DATE),clrWhite); } return(0); } void Ausgabe (string name, string wert, color col ) { ObjectSetText(name,wert,Size,Style,col); } void Anzeige() { ObjectCreate ("Buffer 4",OBJ_LABEL,0,0,0); ObjectSetText ("Buffer 4","",Size,Style,clrWhite); ObjectSet ("Buffer 4",OBJPROP_CORNER,1); ObjectSet ("Buffer 4",OBJPROP_XDISTANCE,400); ObjectSet ("Buffer 4",OBJPROP_YDISTANCE,30); ObjectCreate ("TextBuffer 4",OBJ_LABEL,0,0,0); ObjectSetText ("TextBuffer 4","Buffer 4: ",Size,Style,clrYellow); ObjectSet ("TextBuffer 4",OBJPROP_CORNER,1); ObjectSet ("TextBuffer 4",OBJPROP_XDISTANCE,500); ObjectSet ("TextBuffer 4",OBJPROP_YDISTANCE,30); ObjectCreate ("Buffer 4 Time",OBJ_LABEL,0,0,0); ObjectSetText ("Buffer 4 Time","" ,Size,Style,clrWhite); ObjectSet ("Buffer 4 Time",OBJPROP_CORNER,1); ObjectSet ("Buffer 4 Time",OBJPROP_XDISTANCE,400); ObjectSet ("Buffer 4 Time",OBJPROP_YDISTANCE,50); ObjectCreate ("TextBuffer 4 Time",OBJ_LABEL,0,0,0); ObjectSetText ("TextBuffer 4 Time","Buffer 4 Time: ",Size,Style,clrYellow); ObjectSet ("TextBuffer 4 Time",OBJPROP_CORNER,1); ObjectSet ("TextBuffer 4 Time",OBJPROP_XDISTANCE,500); ObjectSet ("TextBuffer 4 Time",OBJPROP_YDISTANCE,50); ObjectCreate ("Buffer 4 Date",OBJ_LABEL,0,0,0); ObjectSetText ("Buffer 4 Date","" ,Size,Style,clrWhite); ObjectSet ("Buffer 4 Date",OBJPROP_CORNER,1); ObjectSet ("Buffer 4 Date",OBJPROP_XDISTANCE,400); ObjectSet ("Buffer 4 Date",OBJPROP_YDISTANCE,70); ObjectCreate ("TextBuffer 4 Date",OBJ_LABEL,0,0,0); ObjectSetText ("TextBuffer 4 Date","Buffer 4 Date: ",Size,Style,clrYellow); ObjectSet ("TextBuffer 4 Date",OBJPROP_CORNER,1); ObjectSet ("TextBuffer 4 Date",OBJPROP_XDISTANCE,500); ObjectSet ("TextBuffer 4 Date",OBJPROP_YDISTANCE,70); //-*----------------------------------------------------------------------------------------- ObjectCreate ("Buffer 5",OBJ_LABEL,0,0,0); ObjectSetText ("Buffer 5","",Size,Style,clrWhite); ObjectSet ("Buffer 5",OBJPROP_CORNER,1); ObjectSet ("Buffer 5",OBJPROP_XDISTANCE,100); ObjectSet ("Buffer 5",OBJPROP_YDISTANCE,30); ObjectCreate ("TextBuffer 5",OBJ_LABEL,0,0,0); ObjectSetText ("TextBuffer 5","Buffer 5: ",Size,Style,clrYellow); ObjectSet ("TextBuffer 5",OBJPROP_CORNER,1); ObjectSet ("TextBuffer 5",OBJPROP_XDISTANCE,200); ObjectSet ("TextBuffer 5",OBJPROP_YDISTANCE,30); ObjectCreate ("Buffer 5 Time",OBJ_LABEL,0,0,0); ObjectSetText ("Buffer 5 Time","",Size,Style,clrWhite); ObjectSet ("Buffer 5 Time",OBJPROP_CORNER,1); ObjectSet ("Buffer 5 Time",OBJPROP_XDISTANCE,100); ObjectSet ("Buffer 5 Time",OBJPROP_YDISTANCE,50); ObjectCreate ("TextBuffer 5 Time",OBJ_LABEL,0,0,0); ObjectSetText ("TextBuffer 5 Time","Buffer 5 Time: ",Size,Style,clrYellow); ObjectSet ("TextBuffer 5 Time",OBJPROP_CORNER,1); ObjectSet ("TextBuffer 5 Time",OBJPROP_XDISTANCE,200); ObjectSet ("TextBuffer 5 Time",OBJPROP_YDISTANCE,50); ObjectCreate ("Buffer 5 Date",OBJ_LABEL,0,0,0); ObjectSetText ("Buffer 5 Date","",Size,Style,clrWhite); ObjectSet ("Buffer 5 Date",OBJPROP_CORNER,1); ObjectSet ("Buffer 5 Date",OBJPROP_XDISTANCE,100); ObjectSet ("Buffer 5 Date",OBJPROP_YDISTANCE,70); ObjectCreate ("TextBuffer 5 Date",OBJ_LABEL,0,0,0); ObjectSetText ("TextBuffer 5 Date","Buffer 5 Date: ",Size,Style,clrYellow); ObjectSet ("TextBuffer 5 Date",OBJPROP_CORNER,1); ObjectSet ("TextBuffer 5 Date",OBJPROP_XDISTANCE,200); ObjectSet ("TextBuffer 5 Date",OBJPROP_YDISTANCE,70); } habs auch so probiert Code:
if(E != EV) if(E < EV) Wenn ich die Kerze des Arrows direkt anspreche (mit nem Custom Indikator wo ich den Indikator aufrufe und die Kerze des Arrows unter shift hinterlege), dann bekomm ich auch den korrekten wert zurück des Arrows , dass bedeutet ja das beide Arrows ja doch den korrekten wert zurück geben wenn Sie erkannt werden. Aber wenn ich das über nen EA mache , funktioniert das ned, vom logischen her ist das doch das gleiche prinzip , deswegen versteh ich es ned warum ich keine aktuellen werte bekomme. Zitat:
Zitat:
Danke schon mal vorab für die vielen antworten, hab ned gedacht das hier noch was kommen wird, tolles Forum echt LG |
|
|||
so Mädels , also ich hab den "Fehler" gefunden.
Wenn von der ausgewählten Kerze keinen Wert zurück kommt, dann kann es ja nur daran liegen, das zu dem Abfragemoment einfach kein Rückgabewert da ist, eigentlich ist es ja logisch (wie immer im nachhinein) , hab die Shift Kerze im iCustom von 1 auf 4 verändert und siehe da, so klappt es, aber eben auch nicht bei jedem Arrow. Der Indikator hinterlegt den Arrow nicht immer sofort nach dem Bruch der Linien, weiß aktuell leider auch ned warum..... |
|
|||
Probier mal Shft 0 (für Buffer 0-3) und 1 (für die anderen)
|
|
|||
hatte ich doch probiert, darum hab ich den thread doch eröffnet
Bringt so leider nix, man kann das Arrow Problem auch " manuell" lösen indem man den ZZ Indikator selber her nimmt und die Hoch/Tiefs + die Brüche ermittelt, geht wesentlich stressfreier , danke dennoch an alle für die Hilfestellung!! |
|
|||
Vielleicht findest Du hier noch ein paar weitere Ideen :-)
////////////////////////////////////////////////////////////// // http://www.forexmt4.com/_MT4_Systems...%20Trading.mq4 //+------------------------------------------------------------------+ //| Level Trading.mq4 | //| by Accel | //+------------------------------------------------------------------+ #property copyright "Accel" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue extern color TrendUpColor=Blue; extern color TrendDownColor=Red; extern bool SnapExtremumsToLevelOnChar=True; extern int FractalBarsOnEachSide=5; extern int ProceedMaxHistoryBars=1000; extern int LevelActuality=160; extern bool RestDefaultTimeframeValues=1; extern int ExtremumToLevelMaxGap=100; extern double PriceDeltaFor1Bar=20; int LevelLength[]; int LevelWidth[]; int PriceCrossedLevel; double gd_long[]; double gd_short[]; int init() { IndicatorBuffers(2); SetIndexBuffer(0,gd_long); SetIndexBuffer(1,gd_short); return(0); } int deinit() { int i=0; for (i=Bars-1;i>=0;i--) if (ObjectFind("Level_"+i)!=-1) ObjectDelete("Level_"+i); for (i=Bars-1;i>=0;i--) if (ObjectFind("Trend_"+i)!=-1) ObjectDelete("Trend_"+i); return(0); } int LastBarWasHighLow(int LELB, int LEHB) { if (LELB==-1 && LEHB!=-1) return(1); if (LELB!=-1 && LEHB==-1) return(-1); if (LELB!=-1 && LEHB!=-1 && LELB>LEHB) return(1); if (LELB!=-1 && LEHB!=-1 && LELB<LEHB) return(-1); return(0); } int start() { int i,j; int BarsToCheck; int Stop; int CurrState; //CurrState=0 - íå íàøëè ïåðåñå÷åíèÿ, 1-ïåðåñå÷åíèå ââåðõ, -1-ïåðåñå÷åíèå âíèç int LastExtremumHighBar=-1; int LastExtremumLowBar=-1; int LastExtremumBar=-1; double iFractalValue=0,jFractalValue=0; SetIndexStyle(0,DRAW_ARROW,0,3); SetIndexArrow(0,159); SetIndexStyle(1,DRAW_ARROW,0,3); SetIndexArrow(1,159); ArrayInitialize(gd_long,0); ArrayInitialize(gd_short,0); if (RestDefaultTimeframeValues==1) { switch (Period()) { case 1: { ExtremumToLevelMaxGap=2; PriceDeltaFor1Bar=0.2; break; } case 5: { ExtremumToLevelMaxGap=5; PriceDeltaFor1Bar=0.2; break; } case 15: { ExtremumToLevelMaxGap=8; PriceDeltaFor1Bar=0.2; break; } case 30: { ExtremumToLevelMaxGap=10; PriceDeltaFor1Bar=0.3; break; } case 60: { ExtremumToLevelMaxGap=15; PriceDeltaFor1Bar=0.4; break; } case 240: { ExtremumToLevelMaxGap=25; PriceDeltaFor1Bar=0.4; break; } case 1440: { ExtremumToLevelMaxGap=75; PriceDeltaFor1Bar=1.5; break; } case 10080: { ExtremumToLevelMaxGap=150; PriceDeltaFor1Bar=5; break; } case 43200: { ExtremumToLevelMaxGap=300; PriceDeltaFor1Bar=24; break; } } } PriceCrossedLevel=ExtremumToLevelMaxGap*2; ArrayResize(LevelLength,Bars); ArrayInitialize(LevelLength,0); ArrayResize(LevelWidth,Bars); ArrayInitialize(LevelWidth,1); if (FractalBarsOnEachSide<=0) FractalBarsOnEachSide=1; //Èùåì ôðàêòàëû for (i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { //Èùåì íèæíèé ôðàêòàë if (i==Lowest(Symbol(),Period(),MODE_LOW,FractalBarsO nEachSide*2+1,i-FractalBarsOnEachSide)) { switch (LastBarWasHighLow(LastExtremumLowBar,LastExtremum HighBar)) { case -1: { if (Low[i]<Low[LastExtremumLowBar]) { gd_long[i]=Low[i]; gd_long[LastExtremumLowBar]=0; LastExtremumLowBar=i; } break; } case 1: { if (Low[i]<High[LastExtremumHighBar]) { gd_long[i]=Low[i]; LastExtremumLowBar=i; } break; } case 0: { gd_long[i]=Low[i]; LastExtremumLowBar=i; break; } } } //Èùåì âåðõíèé ôðàêòàë if (i==Highest(Symbol(),Period(),MODE_HIGH,FractalBar sOnEachSide*2+1,i-FractalBarsOnEachSide) && gd_long[i]==0) { switch (LastBarWasHighLow(LastExtremumLowBar,LastExtremum HighBar)) { case 1: { if (High[i]>High[LastExtremumHighBar]) { gd_short[i]=High[i]; gd_short[LastExtremumHighBar]=0; LastExtremumHighBar=i; } break; } case -1: { if (High[i]>Low[LastExtremumLowBar]) { gd_short[i]=High[i]; LastExtremumHighBar=i; } break; } case 0: { gd_short[i]=High[i]; LastExtremumHighBar=i; break; } } } } //Èùåì, ãäå çàêàí÷èâàþòñÿ óðîâíè ôðàêòàëîâ (äâîéíîå ïåðåñå÷åíèå öåíîé óðîâíÿ) for (i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (gd_long[i]==Low[i]) { Stop=-1; CurrState=0; for (j=i-1;j>=0 && Stop==-1;j--) { if (CurrState==-1) if (High[j]>Low[i]+(i-j)*PriceDeltaFor1Bar*Point+PriceCrossedLevel*Point ) Stop=j; if (CurrState==0) if (Low[j]<Low[i]+(i-j)*PriceDeltaFor1Bar*Point-PriceCrossedLevel*Point) CurrState=-1; } if (Stop!=-1) LevelLength[i]=i-Stop; else LevelLength[i]=i; } if (gd_short[i]==High[i]) { Stop=-1; CurrState=0; for (j=i-1;j>=0 && Stop==-1;j--) { if (CurrState==1) if (Low[j]<High[i]+(i-j)*PriceDeltaFor1Bar*Point-PriceCrossedLevel*Point) Stop=j; if (CurrState==0) if (High[j]>High[i]+(i-j)*PriceDeltaFor1Bar*Point+PriceCrossedLevel*Point ) CurrState=1; } if (Stop!=-1) LevelLength[i]=i-Stop; else LevelLength[i]=i; } } //Îáúåäèíÿåì áëèçêèå óðîâíè ðàçíûõ ôðàêòàëîâ for (i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (LevelLength[i]>0) { if (gd_long[i]!=0) iFractalValue=gd_long[i]; if (gd_short[i]!=0) iFractalValue=gd_short[i]; BarsToCheck=MathMin(LevelActuality,LevelLength[i]); j=i-1; LevelLength[i]=BarsToCheck; while (BarsToCheck>0) { if (LevelLength[j]>0) { if (gd_long[j]!=0) jFractalValue=gd_long[j]; if (gd_short[j]!=0) jFractalValue=gd_short[j]; if (MathAbs(iFractalValue+(i-j)*PriceDeltaFor1Bar*Point-jFractalValue)<ExtremumToLevelMaxGap*Point) { BarsToCheck=MathMin(LevelActuality,LevelLength[j]); LevelLength[i]=i-j+BarsToCheck; LevelLength[j]=0; LevelWidth[i]++; if (SnapExtremumsToLevelOnChar==1) { if (gd_long[j]!=0) { gd_long[j]=iFractalValue+(i-j)*PriceDeltaFor1Bar*Point; } if (gd_short[j]!=0) { gd_short[j]=iFractalValue+(i-j)*PriceDeltaFor1Bar*Point; } } } } BarsToCheck--; j--; } } } //Ðèñóåì ëîìàííóþ for (i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (gd_long[i]!=0 || gd_short[i]!=0) { if (LastExtremumBar!=-1) { if (gd_long[i]!=0) { ObjectCreate(StringConcatenate("Trend_",i),OBJ_TRE ND,0, Time[LastExtremumBar],gd_short[LastExtremumBar],Time[i],gd_long[i]); ObjectSet(StringConcatenate("Trend_",i),OBJPROP_CO LOR,TrendDownColor); } if (gd_short[i]!=0) { ObjectCreate(StringConcatenate("Trend_",i),OBJ_TRE ND,0, Time[LastExtremumBar],gd_long[LastExtremumBar],Time[i],gd_short[i]); ObjectSet(StringConcatenate("Trend_",i),OBJPROP_CO LOR,TrendUpColor); } ObjectSet(StringConcatenate("Trend_",i),OBJPROP_RA Y,0); ObjectSet(StringConcatenate("Trend_",i),OBJPROP_WI DTH,1); } LastExtremumBar=i; } } //Ðèñóåì óðîâíè for (i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (LevelLength[i]!=0) { if (gd_long[i]!=0) iFractalValue=gd_long[i]; if (gd_short[i]!=0) iFractalValue=gd_short[i]; ObjectCreate(StringConcatenate("Level_",i),OBJ_TRE ND,0, Time[i],iFractalValue,Time[i-LevelLength[i]],iFractalValue+LevelLength[i]*PriceDeltaFor1Bar*Point); ObjectSet(StringConcatenate("Level_",i),OBJPROP_RA Y,0); if (LevelWidth[i]>1) { ObjectSet(StringConcatenate("Level_",i),OBJPROP_WI DTH,MathMin(LevelWidth[i],5)); if (LevelWidth[i]==2) ObjectSet(StringConcatenate("Level_",i),OBJPROP_CO LOR,LightGray); if (LevelWidth[i]==3) ObjectSet(StringConcatenate("Level_",i),OBJPROP_CO LOR,Silver); if (LevelWidth[i]==4) ObjectSet(StringConcatenate("Level_",i),OBJPROP_CO LOR,DarkGray); if (LevelWidth[i]>=5) ObjectSet(StringConcatenate("Level_",i),OBJPROP_CO LOR,Gray); } else { ObjectSet(StringConcatenate("Level_",i),OBJPROP_CO LOR,LightGray); ObjectSet(StringConcatenate("Level_",i),OBJPROP_ST YLE,STYLE_DOT); } } } return(0); } ////////////////////////////////////////////////////////////// |
Lesezeichen |
Stichworte |
buffer, bufferauswertung, indikator buffer, mql4, programmierung, programmierung metatrader |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|