Geschrieben 27. September 200916 Jr. comment_87604 Ich habe mir die Tage mal das Buch von Philipp Kahler angeschaut und versucht die Swing High Low Punkte nach seiner Definition zu programmieren. Swing High = ein Hoch umgeben von zwei tieferen Hochs und das zweite tiefere Hoch ist kein inside DaySwing Low = genau anders rum Seine Outside Bar Regel habe ich noch nicht drin. Mal schauen was man damit machen kann. Es ist ein erster Ansatz, Anregungen etc. sind willkommen. _SECTION_BEGIN("Price"); SetChartOptions(0,chartShowArrows|chartShowDates); _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) )); Plot( C, "Close", ParamColor("Color", colorGrey40 ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); _SECTION_END(); GraphZOrder = 1; GraphXSpace = 5; swingLow = 0; swingHigh = 0; UpDown = 0; // 1 = next is High, 2 = next is Low tmpHighMarker = 0; tmpLowMarker = 0; LowLine = 0; HighLine = 0; for(i=10;i<BarCount;i++) { //printf("---Loop %g---\n",i); InsideDay = L[i] >= L[i-1] AND H[i] <= H[i-1]; if( (UpDown == 0 OR UpDown == 1) AND H[i-2] <= H[i-1] AND H[i-1] >= H[i] AND NOT tmpHighMarker[i-1]) { if(InsideDay) { tmpHighMarker[i-1] = 1; tmpCounter = 0; } else { swingHigh[i-1] = 1; UpDown = 2; HighLine[i-1] = H[i-1]; //printf("set new high at bar %g\n",i-1); } } if( (UpDown == 0 OR UpDown == 2) AND L[i-2] >= L[i-1] AND L[i-1] <= L[i] AND NOT tmpLowMarker[i-1] ) { if(InsideDay) { tmpLowMarker[i-1] = 1; tmpCounter = 0; } else { swingLow[i-1] = 1; UpDown = 1; UpDownChange = 1; LowLine[i-1] = L[i-1]; } } if(tmpHighMarker[i-1]) { tmpCounter++; if(H[i] > H[i-tmpCounter]) { for(j=tmpCounter;j>0;j--) tmpHighMarker[i-j] = 0; } else { if(L[i] < L[i-tmpCounter]) { swingHigh[i-tmpCounter] = 1; HighLine[i-tmpCounter] = H[i-tmpCounter]; //printf("initial change high at bar %g value %g\n",i-tmpCounter,H[i-tmpCounter]); for(j=tmpCounter;j>0;j--) { tmpHighMarker[i-j] = 0; if(j == tmpCounter) continue; HighLine[i-j] = HighLine[i-j-1]; //printf("change high at bar %g value %g\n",i-j,HighLine[i-j-1]); } UpDown = 2; } else { tmpHighMarker[i] = 1; } } } if(tmpLowMarker[i-1]) { tmpCounter++; if(L[i] < L[i-tmpCounter]) { for(j=tmpCounter;j>0;j--) tmpLowMarker[i-j] = 0; } else { if(H[i] > H[i-tmpCounter]) { swingLow[i-tmpCounter] = 1; LowLine[i-tmpCounter] = L[i-tmpCounter]; for(j=tmpCounter;j>0;j--) { tmpLowMarker[i-j] = 0; if(j == tmpCounter) continue; LowLine[i-j] = LowLine[i-j-1]; } UpDown = 1; } else { tmpLowMarker[i] = 1; } } } HighLine[i] = HighLine[i-1]; LowLine[i] = LowLine[i-1]; // printf("set high bar %g value %g\n",i,HighLine[i-1]); // if(H[i] > HighLine[i]) // HighLine[i] = Null; // printf("---End Loop %g---\n",i); } Plot(HighLine,"h",colorBlue); Plot(LowLine,"l",colorGreen); PlotShapes(shapeSmallUpTriangle*swingLow,colorYellow,0,Low-(Low*0.0005)); PlotShapes(shapeSmallDownTriangle*swingHigh,colorYellow,0,High+(High*0.0005)); Melden
Geschrieben 28. September 200916 Jr. comment_87613 Mal schauen was man damit machen kann. Es ist ein erster Ansatz, Anregungen etc. sind willkommen. Warte mal bis duncan wieder da ist.Der hat schon in die gleiche Richtung gearbeitet. Habt Ihr ja fast die gleichen Punkte. Melden
Geschrieben 28. September 200916 Jr. Autor comment_87619 Warte mal bis duncan wieder da ist.Der hat schon in die gleiche Richtung gearbeitet. Habt Ihr ja fast die gleichen Punkte. Jo da sind bestimmt noch ein paar kleine bugs drin. Werde das die Tage noch weiter verbessern. Melden
Geschrieben 4. Oktober 200916 Jr. comment_87736 Jo da sind bestimmt noch ein paar kleine bugs drin. Werde das die Tage noch weiter verbessern.Hi, ich würde mir dann gern deine letzte Version ansehen und gegen unsere vorhandene gegen prüfen ... also bis später Gruß Duncan Melden
Geschrieben 4. Oktober 200916 Jr. Autor comment_87746 Hallo Duncan, habe am Algorithmus noch nichts geändert. Aber noch einen Zähler eingefügt wann das letzte Hoch/Tief war, um dann z.B. eine 123 Umkehr zu erkennen. Gruss nn swing2.afl Melden
Geschrieben 12. Oktober 200916 Jr. Autor comment_87931 Hallo duncan,könntest du mir mal ein Bild vom Infineon Chart mit deiner Version reinstellen ? Dann könnte ich mal schauen wie du mit den Ouside Days umgehst. Anbei mal ein Chart, in dem die Outside Days mit einem kleinen Kreis markiert sind. Würden beispielsweise die Bars an Punkt 1 und 2 zu neuen SH und SL werden ? Gruß nn Melden
Geschrieben 12. Oktober 200916 Jr. comment_87932 Ich nehme an er hat das gleiche,weiss nicht so genau ob Sie da schon weiter sind. Mir fallen 4 Punkte auf die anders sind. hast Du ,2 Duncan Melden
Geschrieben 12. Oktober 200916 Jr. Autor comment_87934 Ich nehme an er hat das gleiche,weiss nicht so genau ob Sie da schon weiter sind. Mir fallen 4 Punkte auf die anders sind. hast Du ,2 Duncan Ich danke Dir für deine Mühe. Dann werd ich mal weiter schauen wie ich das umsetze. Gruß nn Melden
Ich habe mir die Tage mal das Buch von Philipp Kahler angeschaut und versucht die Swing High Low Punkte nach seiner Definition zu programmieren.
Swing High = ein Hoch umgeben von zwei tieferen Hochs und das zweite tiefere Hoch ist kein inside Day
Swing Low = genau anders rum
Seine Outside Bar Regel habe ich noch nicht drin. Mal schauen was man damit machen kann. Es ist ein erster Ansatz, Anregungen etc. sind willkommen.
_SECTION_BEGIN("Price"); SetChartOptions(0,chartShowArrows|chartShowDates); _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) )); Plot( C, "Close", ParamColor("Color", colorGrey40 ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); _SECTION_END(); GraphZOrder = 1; GraphXSpace = 5; swingLow = 0; swingHigh = 0; UpDown = 0; // 1 = next is High, 2 = next is Low tmpHighMarker = 0; tmpLowMarker = 0; LowLine = 0; HighLine = 0; for(i=10;i<BarCount;i++) { //printf("---Loop %g---\n",i); InsideDay = L[i] >= L[i-1] AND H[i] <= H[i-1]; if( (UpDown == 0 OR UpDown == 1) AND H[i-2] <= H[i-1] AND H[i-1] >= H[i] AND NOT tmpHighMarker[i-1]) { if(InsideDay) { tmpHighMarker[i-1] = 1; tmpCounter = 0; } else { swingHigh[i-1] = 1; UpDown = 2; HighLine[i-1] = H[i-1]; //printf("set new high at bar %g\n",i-1); } } if( (UpDown == 0 OR UpDown == 2) AND L[i-2] >= L[i-1] AND L[i-1] <= L[i] AND NOT tmpLowMarker[i-1] ) { if(InsideDay) { tmpLowMarker[i-1] = 1; tmpCounter = 0; } else { swingLow[i-1] = 1; UpDown = 1; UpDownChange = 1; LowLine[i-1] = L[i-1]; } } if(tmpHighMarker[i-1]) { tmpCounter++; if(H[i] > H[i-tmpCounter]) { for(j=tmpCounter;j>0;j--) tmpHighMarker[i-j] = 0; } else { if(L[i] < L[i-tmpCounter]) { swingHigh[i-tmpCounter] = 1; HighLine[i-tmpCounter] = H[i-tmpCounter]; //printf("initial change high at bar %g value %g\n",i-tmpCounter,H[i-tmpCounter]); for(j=tmpCounter;j>0;j--) { tmpHighMarker[i-j] = 0; if(j == tmpCounter) continue; HighLine[i-j] = HighLine[i-j-1]; //printf("change high at bar %g value %g\n",i-j,HighLine[i-j-1]); } UpDown = 2; } else { tmpHighMarker[i] = 1; } } } if(tmpLowMarker[i-1]) { tmpCounter++; if(L[i] < L[i-tmpCounter]) { for(j=tmpCounter;j>0;j--) tmpLowMarker[i-j] = 0; } else { if(H[i] > H[i-tmpCounter]) { swingLow[i-tmpCounter] = 1; LowLine[i-tmpCounter] = L[i-tmpCounter]; for(j=tmpCounter;j>0;j--) { tmpLowMarker[i-j] = 0; if(j == tmpCounter) continue; LowLine[i-j] = LowLine[i-j-1]; } UpDown = 1; } else { tmpLowMarker[i] = 1; } } } HighLine[i] = HighLine[i-1]; LowLine[i] = LowLine[i-1]; // printf("set high bar %g value %g\n",i,HighLine[i-1]); // if(H[i] > HighLine[i]) // HighLine[i] = Null; // printf("---End Loop %g---\n",i); } Plot(HighLine,"h",colorBlue); Plot(LowLine,"l",colorGreen); PlotShapes(shapeSmallUpTriangle*swingLow,colorYellow,0,Low-(Low*0.0005)); PlotShapes(shapeSmallDownTriangle*swingHigh,colorYellow,0,High+(High*0.0005));