Wolfe pattern ProScreener (1 Viewer)

mauro2390

Nuovo forumer
Ora allo screener del pattern di wolfe vorrei aggiungere filtro con indicatori... tipico l'uso delle divergenze.
Dati esempio i due minimi del punto 3 e punto 5 del pattern rialzista, vorrei filtrare in base all'individuazione di una divergenza rialzista su un indicatore.
Come faccio a confrontare 2 valori dello stesso indicatore a barre passate? Cioè se alla barre 125 ho il punto 3 e alla 157 il punto 5 come faccio a confrontare i valori dell'indicatore allaa barra 125 con quello della barra 157???

salva le barre dei punti con barindex (es.barpunto=barindex)e poi usa le variabili come indice dell'indicatore.es.rsi[barpunto1]
 

angio

niente è come sembra
:ciao:

io la vedo dura creare un codice per trovare i wolfe :specchio:

anche il Prof. Zweifel ci ha rinunciato ................ usava lo Zig Zag per trovare i punti :specchio:
 

tetsuo

Guest
:ciao:

io la vedo dura creare un codice per trovare i wolfe :specchio:

anche il Prof. Zweifel ci ha rinunciato ................ usava lo Zig Zag per trovare i punti :specchio:


Ah vedi ....anche a me è venuta la stessa idea (il codice che ho postato nella prima parte in pratica ricrea uno zig-zag basato sui minimi e i massimi) solo che questo approccio presenta un limite che sta proprio nel capire quale deve essere la distanza minima (in percentuale nel mio caso) tra i punti del wolfe....

Angio, se ti ricordi, quale fu il problema maggiore che aveva riscontrato Zweifel e che lo ha fatto desistere???
 

f4f

翠鸟科
Ora allo screener del pattern di wolfe vorrei aggiungere filtro con indicatori... tipico l'uso delle divergenze.
Dati esempio i due minimi del punto 3 e punto 5 del pattern rialzista, vorrei filtrare in base all'individuazione di una divergenza rialzista su un indicatore.
Come faccio a confrontare 2 valori dello stesso indicatore a barre passate? Cioè se alla barre 125 ho il punto 3 e alla 157 il punto 5 come faccio a confrontare i valori dell'indicatore allaa barra 125 con quello della barra 157???


forse con VB puoi ... devi usare una matrice monodimensionale
come ho fatto con lo zigzag

lo zigzag adesso è quasi pronto... ho trovato ancora un errore nel debugging
con VB faccio 'andare indietro' il punto di minimo, che altrimenti con l'ottimo codice di Tetsuo ( ancora grazie :) ) viene identificato correttamente come valore ma non come tempo
 

wolfeking

Nuovo forumer
:ciao:

io la vedo dura creare un codice per trovare i wolfe :specchio:

anche il Prof. Zweifel ci ha rinunciato ................ usava lo Zig Zag per trovare i punti :specchio:

a lè dura si!!
ma come detto non ho pretese di trovare un rilevatore (screener) del pattern completo e perfetto... ciò che mi basta è un codice che mi screma il monte titoli (chiamiamolo screemer :D) in un gruppo più ristretto che presenti un movimento, o nel mio caso parte di movimento, in qualche modo assimilabile al pattern... poi è necessario l'intervento dell'occhio umano che ottimizzi e che vagli anche situazioni spurie ma come sai benissimo tradabili ugualmente.
Per ora quanto fatto sono moderatamente soddisfatto (ma migliorabile) e se lanciato realtime su tf 1h, 30min o 15min, 5min sta evidenziando interessanti opportunità... ora però voglio filtrare attraverso l'utilizzo di indicatori
 

angio

niente è come sembra
Ah vedi ....anche a me è venuta la stessa idea (il codice che ho postato nella prima parte in pratica ricrea uno zig-zag basato sui minimi e i massimi) solo che questo approccio presenta un limite che sta proprio nel capire quale deve essere la distanza minima (in percentuale nel mio caso) tra i punti del wolfe....

Angio, se ti ricordi, quale fu il problema maggiore che aveva riscontrato Zweifel e che lo ha fatto desistere???

Perchè è più semplice cercarli a "occhio" almeno con Amibroker ;)

------------------------------------------------------------------

Title="ZWolfe Bearish Wolfe Pattern";
//* Detecting double tops AND bottoms*/
percdiff = Param("percentuale",500,1,1000,1);; /* peak detection threshold */
fwdcheck = 3; /* forward validity check */
mindistance = 4;
Plot(C,"close",16,64);
startpoint = BarCount-Param( "Startpoint", 350, 1, 1000, 1 );
// Patterns
COLOR=1;
function FillLine( startbar, startval, endbar, endval )
{
global ZigArray;
for( j = startbar; j <= endbar; j++ )
{
ZigArray[ j ] = startval + ( j - startbar) * (endval-
startval)/( endbar -startbar );
}
return;
}
WavePcnt = Optimize("Percent",0.001,1.0,100,0.1);
RP = ( High[0] + Low[0] )/2.0;
RPPoint = 0;
RP0 = RPPoint;
RP1 = RP;
RPPoint1 = RPPoint;
fires = 0;
for(i=0; i<BarCount; i++)
{
ZigArray = -1.0E10;
// Swing High
if( i>0 AND i<BarCount-2 AND H>=H[i-1] AND H>=H[i+1] )
SH = H;
else
SH = -1;
// Swing Low
if( i>0 AND i<BarCount-2 AND L<=L[i-1] AND L<=L
[i+1] )
SL = L;
else
SL = -1;
// ZigZag
if( SH != 0 )
{
if(fires != 1 AND SH >= RP*(1+0.001*WavePcnt) )
{
RPPoint1 = RPPoint;
RP1 = RP;
RPPoint = i;
RP = SH;
FillLine( RPPoint1, RP1, RPPoint, RP );
fires = 1;
}
else
if(fires == 1 AND SH >= RP)
{
RPPoint = i;
RP = SH;
FillLine( RPPoint1, RP1, RPPoint,
RP );
}
}
if( SL != -1 )
{
if(fires != -1 AND SL <= RP*(1-0.001*WavePcnt) )
{
RPPoint1 = RPPoint;
RP1 = RP;
RPPoint = i;
RP = SL;
FillLine( RPPoint1, RP1, RPPoint, RP );
fires = -1;
}
else
if(fires == -1 AND SL <= RP )
{
RPPoint = i;
RP = SL;
FillLine( RPPoint1, RP1, RPPoint,
RP );
}
}
}
// Last line segment
RPPoint1 = RPPoint;
RP1 = RP;
RPPoint = BarCount - 1;
if(fires == -1) RP = LastValue(High);
if(fires == 1) RP = LastValue(Low);
FillLine( RPPoint1, RP1, RPPoint, RP );
H=L=Hilo=ZigArray ;
//Plot(Hilo,"",11,1);
perc=1;
do
{
validdiff = perc/100/400;
PK= Peak( H, perc/100, 1 ) == High;
TR= Trough( L, perc/100, 1 ) == Low;
x = Cum( 1 );
XPK1 = ValueWhen( PK, x, 1 );
XPK2 = ValueWhen( PK, x, 2 );
XPK3 = ValueWhen( PK, x, 3 );
yPK1 = ValueWhen( PK, H, 1 );
yPK2 = ValueWhen( PK, H, 2 );
yPK3 = ValueWhen( PK, H, 3 );
xTR1 = ValueWhen( Tr, x, 1 ) ;
xTr2 = ValueWhen( Tr, x, 2 );
xTr3 = ValueWhen( Tr, x, 3 );
xTr4 = ValueWhen( Tr, x, 4 );
yTR1 = ValueWhen( Tr, L, 1 );
yTr2 = ValueWhen( Tr, L, 2 );
yTr3 = ValueWhen( Tr, L, 3 );
yTr4 = ValueWhen( Tr, L, 4 );
Cond1= ypk3<ypk2 AND ypk1<ypk2 AND ytr1<ytr2 AND ytr2<ytr3 AND ypk1>ytr3 ;
Cond1= ytr3>ytr2 AND ytr1>ytr2 AND ypk1>ypk2 AND ypk2>ypk3 AND ytr1<ypk3 ;
Cond12= ytr4<ytr3;
Cond12= 1;
pendPK21=(ypk1-ypk2 )/(xpk1-xpk2);
pendtr23=(ytr2-ytr3 )/(xtr2-xtr3 );
pendtr12=(ytr1-ytr2 )/(xtr1-xtr2 );
pendtr21=(ytr1-ytr2 )/(xtr1-xtr2);
pendpk23=(ypk2-ytr3 )/(xpk2-xpk3 );
pendpk12=(ypk1-ypk2 )/(xpk1-xpk2 );
Cond2= pendtr21>pendpk23 AND pendpk12 >pendpk23 ;
Cond3=(Xpk1 -Xpk2)>mindistance AND (Xpk2 -Xpk3)>mindistance AND (Xtr1 -Xtr2)>mindistance;
Cond=Cond1 +Cond2 +Cond12;
Color++;
per=percdiff ;
Plot(Zig(Hilo,per),"zig",16,4);
Plot(IIf(Cond>2, C,Null),"cond",colorLavender,styleArea);
PlotShapes( IIf(cond>2 AND x==xpk1, shapeDigit5, Null), Color, layer = 0, yposition = L ,offset = -3);
PlotShapes( IIf(ValueWhen( pk, cond , -1 )>2 AND ValueWhen( pk, H, 1 )==H, shapeDigit1, Null), Color, layer = 0, yposition = H ,offset = -3);
PlotShapes( IIf(ValueWhen( pk, cond , 0)>2 AND ValueWhen( pk, H, 1 )==H, shapeDigit3, Null), Color, layer = 0, yposition = H ,offset = -3);
PlotShapes( IIf(ValueWhen( pk, cond , -1 )>2 AND ValueWhen( tr, L, 1 )==L, shapeDigit2, Null), Color, layer = 0, yposition = L ,offset = 3);
PlotShapes( IIf(ValueWhen( pk, cond , 0)>2 AND ValueWhen( tr, L, 1 )==L, shapeDigit4, Null), Color, layer = 0, yposition = L,offset = 3);
s1=L;
s11=H;
if( Cond=3)
{
pS = TroughBars( s1, perc/100, 1 ) == 0;
endt= (ValueWhen( pS, x, 2 ));
startt=(ValueWhen( pS, x, 3 ));
endS = (ValueWhen( pS, s1, 2 ) );
startS = ( ValueWhen( pS, s1, 3 ));
dtS =endt-startt;
aS = (endS-startS)/dtS;
bS = endS;
trendlineS = aS * ( x -endt ) + bS;
pR = PeakBars( s11, perc/100, 1 ) == 0;
endt1= (ValueWhen( pR, x, 1 ));
startt1=(ValueWhen( ps, x, 3 ));
endR = (ValueWhen( pR, s11, 1 ) );
startR = ( ValueWhen( ps, s1, 3 ));
DTR=ENDT1-STARTT1;
aR = (endR-startR)/dtR;
bR = endR;
trendlineR = aR * ( x -endt1 ) + bR;
BEGIN=STARTT; finish= Max(endt,endt1);
TRS = IIf(x>BEGIN-0 AND x<finish+20,trendlineS,-1e10);
TRR = IIf(x>BEGIN AND x<finish+20,trendlineR,-1e10);
}
perc++;perc++;perc++;perc++;perc++;perc++;perc++;perc++;perc++;perc++;
} while ( perc < percdiff );
 

wolfeking

Nuovo forumer
salva le barre dei punti con barindex (es.barpunto=barindex)e poi usa le variabili come indice dell'indicatore.es.rsi[barpunto1]

Grazie mauro per la risposta, ma purtroppo non funziona.
Se io prendo rilevazione di un oscillatore a due barindex differenti e fissi, dovrei avere risultato fisso ed invece ne risulta un'onda
Mi spiego con un esempio:
supponiamo di avere una semplice media mobile a 20 periodi. Se confronto il suo valore al barindex 70 e barindex 80...

a=Average[20](close)

IF (a[70]>a[80]) THEN
OK=1
ELSE
OK=0
ENDIF

return OK

invece di ritornare sempre 1 o sempre 0 (a secondo se a della barindex 70 è maggiore della 80 oppure no) ritorna una semi onda che passa tra 0 e 1 senza apparente relazione
 

tetsuo

Guest
Grazie mauro per la risposta, ma purtroppo non funziona.
Se io prendo rilevazione di un oscillatore a due barindex differenti e fissi, dovrei avere risultato fisso ed invece ne risulta un'onda
Mi spiego con un esempio:
supponiamo di avere una semplice media mobile a 20 periodi. Se confronto il suo valore al barindex 70 e barindex 80...

a=Average[20](close)

IF (a[70]>a[80]) THEN
OK=1
ELSE
OK=0
ENDIF

return OK

invece di ritornare sempre 1 o sempre 0 (a secondo se a della barindex 70 è maggiore della 80 oppure no) ritorna una semi onda che passa tra 0 e 1 senza apparente relazione

:clava:

ovvio

il valore tra parentesi quadre indica quante barre indietro guardare !!!! Il tuo esempio prima dell'ottantesima barra non da risultato (o da sempre 1) dalla 80 barra in poi confronterà l'80° con la 70° po l'81° con la 71° e così via....

Lo stratagemma è quello di creare quando trovi uno dei tre punti una variabile dove vai a registrare il numero di barra corrispondente e poi lo richiami con [Barindex-tuavariabile]. in questo modo avrai il numero di passi indietro che ti separano dal tuo minimo

Quindi il tuo esempio diventa

a=Average[20](close)
b=70
c=80
if barindex=>80 then
IF (a[barindex-b]>a[barindex-c]) THEN
OK=1
ELSE
OK=0
ENDIF
endif

return OK
 

wolfeking

Nuovo forumer
:clava:

ovvio

il valore tra parentesi quadre indica quante barre indietro guardare !!!! Il tuo esempio prima dell'ottantesima barra non da risultato (o da sempre 1) dalla 80 barra in poi confronterà l'80° con la 70° po l'81° con la 71° e così via....

Lo stratagemma è quello di creare quando trovi uno dei tre punti una variabile dove vai a registrare il numero di barra corrispondente e poi lo richiami con [Barindex-tuavariabile]. in questo modo avrai il numero di passi indietro che ti separano dal tuo minimo

Quindi il tuo esempio diventa

a=Average[20](close)
b=70
c=80
if barindex=>80 then
IF (a[barindex-b]>a[barindex-c]) THEN
OK=1
ELSE
OK=0
ENDIF
endif

return OK


:bow::bow::bow::bow::bow::bow::bow:
mi prostro,
non avevo capito il senso dell'utilizzo del barindex.
ora così posso valutare divergenze su un indicatore

grasssie e a buon rendere:mano:
 

mauro2390

Nuovo forumer
allego la versione bearish del lavoro di Tetsuo il quale rimane l'unico ed il solo autore/artefice del codice ed al quale va la mia stima.
Una cortesia : caro tetsuo verifica se non avessi fatto qualche ca..ta. Ho semplicemente scambiato il significato dei supporti/resistenze, ma non si sa mai!
Sto preparando una versione c/c++ in modo da avere un po' piu' di flessibilita' nel trattamento dei dati.
Un saluto
Mauro
 

Allegati

  • bearish_screener_indicator_by_tetsuo.txt
    5,1 KB · Visite: 390

Users who are viewing this thread

Alto