Frattali di Williams
Forums › ProRealTime forum Italiano › Supporto ProOrder › Frattali di Williams
- This topic has 15 replies, 3 voices, and was last updated 1 year ago by robertogozzi.
-
-
11/28/2022 at 2:55 AM #204923
Buongiorno,
nel poco tempo libero a disposizione e con le mie limitate conoscenze, sto cercando di riprodurre un sistema per Eur Usd con regole prese da un video su Youtube al fine di effettuare dei backtest.
Si utilizzano i frattali di Williams, il codice l’ho trovato qui: https://www.prorealcode.com/prorealtime-indicators/bill-williams-fractals/
Le regole sono:
- time frame a 5 minuti.
- Individuare il trend di “fondo” (giornaliero o settimanale), ci provo con il supertrend e la media mobile esponenziale; entrare solo in direzione del trend di fondo.
- Entrata long: quando ci sono 2 frattali “up” con massimi crescenti e 2 frattali “down” con minimi crescenti.
- Entrata short: quando ci sono 2 frattali “up” con massimi decrescenti e 2 frattali “down” con minimi decrescenti.
- Stop loss: per i long “x” pips sotto il secondo frattale “down”; per gli short “x” pips sopra il secondo frattale “up”.
- Dopo “z” pips di guadagno, mettere la posizione in breakeven. In tal caso, al rispetto delle condizioni di sopra, consentire l’apertura di altre posizioni.
- Chiudere la posizione long quando un frattale “up” si presenta ad un livello inferiore del penultimo (viceversa per le posizioni short).
Il codice che ho provato a scrivere mi da sempre… 0 operazioni! Dove sbaglio?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394//-------------------------------------------------------------------------// Codice principale : frattali Williams//-------------------------------------------------------------------------DEFPARAM CumulateOrders = trueONCE Countup = 0once countdw = 0cp = 2// trend di “fondo”TIMEFRAME (4 hour, updateonclose)st=Supertrend[3,10]em=ExponentialAverage[21](close)if close > st and close > em thenlongok = 1elsif close < st and close < em thenshortok = 1endifTIMEFRAME (default)// primo frattale upif (High[cp] > High[cp+2]) AND (High[cp] > High[cp+1]) AND (High[cp] > High[cp-1]) AND (High[cp] > High[cp-2]) thenLH = 1countup = countup + 1high1 = high [cp]endif// primo frattale downif (Low[cp] < Low[cp+2]) AND (Low[cp] < Low[cp+1]) AND (Low[cp] < Low[cp-1]) AND (Low[cp] < Low[cp-2]) thenLL= -1countdw = countdw - 1low1 = low [cp]endif// secondo frattale upif lh = 1 thenif (High[cp] > High[cp+2]) AND (High[cp] > High[cp+1]) AND (High[cp] > High[cp-1]) AND (High[cp] > High[cp-2]) thenLH = lh + 1countup = countup + 1high2 = high [cp]endifendif// secondo frattale downif ll = -1 thenif (Low[cp] < Low[cp+2]) AND (Low[cp] < Low[cp+1]) AND (Low[cp] < Low[cp-1]) AND (Low[cp] < Low[cp-2]) thenLL= ll-1countdw = countdw - 1low2 = low [cp]endifendif// condizioni entrata shortif countup = 2 and high1 > high2 and low1 > low2 thenif longok = 1 thenif not onmarket or cumul = 1 thenbuy at marketset stop loss low2 - xx*pointsizecountup = countup - 1endifendifendif// condizioni entrata shortif countdw = -2 and high1 < high2 and low1 < low2 thenif shortok = 1 thenif not onmarket or cumul = 1 thensellshort at marketset stop loss high2 + xx*pointsizecountdw = countdw + 1endifendifendif// posizione a breakeven dopo zz di guadagno; se a breakeven consentire apertura altre posizioni (cumul=1)if longonmarket thenif close - TRADEPRICE >= zz thenset stop loss tradepricecumul = 1endifendifif shortonmarket thenif TRADEPRICE - close>= zz thenset stop loss tradepricecumul = 1endifendif// condizioni per uscita posizioneif longonmarket and low2 > low1 thensell at marketendifif shortonmarket and high2 > high1 thenexitshort at marketendif11/28/2022 at 3:57 AM #204924Prova a modificare le righe 13-17 con queste:
1234567if close > st and close > em thenlongok = 1shortok = 0elsif close < st and close < em thenshortok = 1longok = 0endifnon l’ho provato.
1 user thanked author for this post.
11/29/2022 at 1:10 AM #20498011/30/2022 at 6:16 AM #205040Oltre alla modifica di cui sopra, è necessario azzerare (stabilisci tu quando) le variabili countdw e countup, altrimenti avranno sempre valori maggiori di 2 o minori di -2, quindi le condizioni d’entrata non saranno nai verificate. Se aggiungi queste due righe alla fine del codice, vedrai i valori che hanno le due variabili candela dopo candela nella finestra delle variabili appositamente visualizzata dal backtest:
12graph countdwgraph countupInoltre metti lo Stop Loss in modo errato, ad esempio:
1set stop loss tradeprice //oppure set stop loss low2inserisce lo Stop Loss al numeri di pip (punti) indicato da TradePrice, quindi molte migliaia! SET STOP LOSS richiede una differenza di prezzo (ad esempio CLOSE – LOW[1]), non un prezzo. Devi usare questa istruzione per mettere lo stop (o eventualmente il target) al prezzo indicato da TRADEPRICE:
12SET STOP PRICE TradePriceSET TARGET PRICE TradePrice + 100*pipsize1 user thanked author for this post.
12/04/2022 at 1:44 AM #205231Grazie, credevo che le istruzioni ai righi 58 e 69 servissero a mantenere i valori della variabili countup e countdw sempre tra 1 e 2 (-1 e -2 per countdw)….
Ho provato a inserire istruzioni per azzerare le variabili (ad esempio una volta a mercato, inserendo sempre alle righe 58 e 69 “=0”) ma niente.
Se hai voglia di darmi ancora una mano te ne sarò grato
12/04/2022 at 12:00 PM #205235Posta l’ultimo codice che hai usato, comprensivo delle modifiche che hai eventualmente fatto.
12/05/2022 at 1:03 AM #205262Ecco l’ultima versione (sempre 0 operazioni in backtest):
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107//-------------------------------------------------------------------------// Codice principale : frattali Williams//-------------------------------------------------------------------------DEFPARAM CumulateOrders = trueONCE Countup = 0once countdw = 0once cp = 2// trend di "fondo"TIMEFRAME (4 hour, updateonclose)st=Supertrend[3,10]em=ExponentialAverage[21](close)if close > st and close > em thenlongok = 1shortok = 0endifif close < st and close < em thenshortok = 1longok = 0endifTIMEFRAME (default)// primo frattale upif (High[cp] > High[cp+2]) AND (High[cp] > High[cp+1]) AND (High[cp] > High[cp-1]) AND (High[cp] > High[cp-2]) thenLH = 1high1 = high [cp]endif// primo frattale downif (Low[cp] < Low[cp+2]) AND (Low[cp] < Low[cp+1]) AND (Low[cp] < Low[cp-1]) AND (Low[cp] < Low[cp-2]) thenLL= -1low1 = low [cp]endif// secondo frattale upif lh = 1 thenif (High[cp] > High[cp+2]) AND (High[cp] > High[cp+1]) AND (High[cp] > High[cp-1]) AND (High[cp] > High[cp-2]) thenLH = lh + 1countup = countup + 1high2 = high [cp]endifendif// secondo frattale downif ll = -1 thenif (Low[cp] < Low[cp+2]) AND (Low[cp] < Low[cp+1]) AND (Low[cp] < Low[cp-1]) AND (Low[cp] < Low[cp-2]) thenLL= ll-1countdw = countdw - 1low2 = low [cp]endifendif// condizioni entrata longif countup = 2 and high1 > high2 and low1 > low2 thenif longok = 1 thenif not onmarket or cumul = 1 thenbuy at marketset stop loss low2 - xx*pointsizecountup = 1lh = lh -1endifendifendifif not onmarket and countup = 2 thencountup = 0endif// condizioni entrata shortif countdw = -2 and high1 < high2 and low1 < low2 thenif shortok = 1 thenif not onmarket or cumul = 1 thensellshort at marketset stop loss high2 + xx*pointsizecountdw = -1ll = ll + 1endifendifendifif not onmarket and countdw = -2 thencountdw = 0endif// posizione a breakeven dopo zz di guadagno; se a breakeven consentire apertura altre posizioni (cumul=1)if longonmarket thenif close - TRADEPRICE >= zz thenset stop loss close - tradepricecumul = 1endifendifif shortonmarket thenif TRADEPRICE - close>= zz thenset stop loss tradeprice - closecumul = 1endifendif// condizioni per uscita posizioneif longonmarket and low2 > low1 thensell at marketendifif shortonmarket and high2 > high1 thenexitshort at marketendifgraph countdwgraph countup12/05/2022 at 11:20 AM #205272Penso che abbia a che fare con high1 e high 2, anche low1 e low2.
cp = 2
Il codice afferma high1 = high[cp] quindi successivamente high2 = high[cp], quindi la condizione di acquisto include high1 > high2 (e simili per low1, low 2 ecc. Ecc.).
High1 > high2 non è mai 1 / true se high1 = high[cp] e high2 = high[cp] dove cp = 2.
1 user thanked author for this post.
12/05/2022 at 4:28 PM #205288Non ho potuto resistere a una giocata, quindi ho fatto high1 = high2 e low1 = low2 in entrambe le condizioni BUY e SELSHORT e la strategia quindi prende scambi.
Mi piacerebbe vederlo avere successo perché sembra che ci sia stato molto lavoro fino a questo punto!
12/05/2022 at 8:20 PM #205298Mi piacerebbe vederlo avere successo
Giusto per chiarire, sopra significa… mi piacerebbe vedere la strategia ordinata e fare operazioni redditizie.
Il mio test re high1 = high2 ecc era proprio questo … un test per convincere la strategia a fare trading (anche se perdendo trade).12/07/2022 at 2:09 AM #205331Penso che abbia a che fare con high1 e high 2, anche low1 e low2.
cp = 2
Il codice afferma high1 = high[cp] quindi successivamente high2 = high[cp], quindi la condizione di acquisto include high1 > high2 (e simili per low1, low 2 ecc. Ecc.).
High1 > high2 non è mai 1 / true se high1 = high[cp] e high2 = high[cp] dove cp = 2.
Grazie per la risposta. Ho provato inserendo un’altra variabile con valore = 2 e sostituendola a cp per la ricerca del secondo frattale, ma il risultato non cambia.
Dovrei trovare un altro modo per indicare al sistema che il secondo frattale up deve essere maggiore del primo (e viceversa per quello short), ma va al di là delle mie capacità di programmazione
12/15/2022 at 3:50 PM #205821Il problema non è in CP=2 (o 3, ecc…). Il problema, come ha osservato GraHal, è nel fatto che usi high1 > high2, dove entrambi hanno lo stesso valore, quindi uno NON può essere maggiore dell’altro!
Se provi con:
12if countup = 2 and high1 = high2 and low1 = low2 thenif countdw = -2 and high1 = high2 and low1 = low2 thenfunzionerà.
Però non so se è quello che tu vuoi.12/17/2022 at 1:20 AM #205937Grazie per la risposta, ma in effetti non è quello che vorrei ottenere.
Vorrei indicare al sistema di verificare quado ricorre questa sequenza:
per i long, 2 frattali “up” con massimi crescenti e 2 frattali “down” con minimi crescenti.
Per gli short, 2 frattali “up” con massimi decrescenti e 2 frattali “down” con minimi decrescenti.01/11/2023 at 11:12 AM #207219Ho provato, ma il codice non è completo, mi segnala che mancano alcune variabili.
Posta il file ITF, per essere certi che sia quello completo e funzionante.
01/20/2023 at 2:07 AM #207736 -
AuthorPosts