Buongiorno, devo eseguire uno script che per me è ancora troppo complesso.
Praticamente si tratta di identificare nelle ultime 10 candele 2 “tipi” di TrueRange separati. Un TrueRange (chiamiamolo PlusTrueRange) si estrae solo se (close [n] > close [n-1]), altrimenti l’altro valore (MinusTrueRange) si estrae se (close [n] < close [n-1]).
Il calcolo del TrueRange (Plus e Minus) è basato sempre sulla solita formula: max [(H-L), (H-(C-1)), ((C-1)-L)]
Questo calcolo deve essere fatto a ritroso sulle ultime 10 candele, quindi si tratta di mettere a confronto ogni candela con la sua precedente per estrarre uno o l’altro valore.
Alla fine, lo script deve restituirmi la somma di tutti i PlusTrueRange e la somma di tutti i MinusTrueRange identificati.
Avevo pensato ad un ciclo di loop, ma è ancora troppo complicato per me che sono veramente ancora alle basi, quindi necessito di un aiuto.
Grazie
Ho spostato il topic da ProOrder a ProBuilder perché non è una strategia.
Si può fare, ma tieni presente che PlusTrueRange e MinusTrueRange non possono avere “vuoti” nel senso che quando calcoliamo PlusTrueRange, MinusTrueRange manterrà anche per quella candela.
In un periodo di 10 candele avrai 20 valori, 10 per entrambe le variabili. Quando una delle due variabili non viene calcolata manterrà il valore della candela precedente, perché PRT non supporta vettori (array).
Va bene? (se non ti va bene allora non si può fare ciò che chiedi)
Va bene, poi assemblerò io meglio i valori di output in un successivo codice. Anzi, eventualmente se puoi anche aggiungere il valore sommatorio come richiesto completeresti al meglio la mia richiesta.
Prova questo:
If close > close[1] Then
PlusTrueRange = max ((High-Low), max((High-Close[1]), (Close[1]-Low)))
Endif
//
If close < close[1] Then
MinusTrueRange = max ((High-Low), max((High-Close[1]), (Close[1]-Low)))
Endif
//
PlusTR = summation[10](PlusTrueRange)
MinusTR = summation[10](MinusTrueRange)
Grazie, adesso implemento tutto in un altro script e ti faccio sapere.
PS
Messa cosi era più facile di quanto immaginassi….senza loops 🙂
Una domanda, data la semplicità del codice a questo punto Plus/MinusTrueRange non poteva essere semplicemente sostituito dalla funzione “True Range” del sistema invece di eseguirla col calcolo max (…. ecc)?
La domanda ha scopo didattico 🙂
Prova a sostituire i due IF…ENDIF con:
PlusTrueRange = (close > close[1]) * max ((High-Low), max((High-Close[1]), (Close[1]-Low)))
MinusTrueRange = (close < close[1]) * max ((High-Low), max((High-Close[1]), (Close[1]-Low)))
Ovviamente puoi usare TR anche qui al posto della formula.