Buongiorno,
sto creando un’indicatore di trend che segue il prezzo (da sopra o da sotto a seconda della dinamica dei prezzi). Vorrei codificare la seguente logica: se il mese precedente non vengono aggiornati i minimi di 2 mesi fa, oppure se la chiusura del mese precedente è superiore a quella di 2 mesi fa, il valore del mio indicatore, nel mese corrente, non cambi rispetto al valore che ha assunto il in T – 1. Questa logica deve rimanere tale per tutto il periodo in cui “close < indicator and ((low[1] > low[2]) or (close[1] > close[2]))”. Purtroppo riesco solo a codificare quanto segue:
indicator1 = (max(high[2], max(high[1], high)) + min(low[2], min(low[1], low)))/2
indicator2 = max(high[2], max(high[1], high))
indicator3 = AverageTrueRange[10](close)
indicator4 = indicator1 + indicator3
indicator5 = max(indicator2, indicator4)
indicator6 = indicator5[1]
indicator7 = max(high[1], indicator6)
if close < indicator7 and ((low[1] > low[2]) or (close[1] > close[2])) then
indicator8 = indicator7[1]
else
indicator8 = indicator7
Endif
return indicator8
Allego un’immagino in cui è presente l’errore.
Grazie per il supporto
T sta per…?
Su quali timeframe vuoi utilizzarlo?
Grazie Roberto,
con “T – 1” intendevo la barra precedente. Vorrei che l’indicatore, verificate le condizioni, mantenesse il valore che aveva alla barra precedente. Questo valore potrebbe non coincidere necessariamente con il calcolo dell’indicatore alla barra precedente, se le condizioni si verificano.
relativamente al time frame, lo sto utilizzando sul mensile ma vorrei fosse valido per tutti i time frames..
Non capisco la logica delle righe che hai scritto.
Comunque questo è il codice che calcola i dati desiderati, Massimo e Chiusura, del 2° mese precedente (HH2 e CL2), del 1° mese precedente (HH1 e CL1) e di quello corrente (HH e CL):
ONCE HH2 = high
ONCE HH1 = high
ONCE HH = high
ONCE CL2 = close
ONCE CL1 = close
ONCE CL = close
TF = GetTimeframe
IF TF = 2592000 THEN
HH2 = high[2]
HH1 = HH[1]
HH = high
CL2 = close[2]
CL1 = close[1]
CL = close
ELSIF TF < 2592000 THEN
IF OpenMonth <> OpenMonth[1] THEN
HH2 = HH1
HH1 = HH
HH = high
CL2 = CL1
CL1 = CL
CL = close
ELSE
CL = close
HH = max(HH,high)
ENDIF
ELSE
HH2 = 0
HH1 = 0
HH = 0
CL2 = 0
CL1 = 0
ENDIF
integra te il tuo indicatore con i dati di cui sopra.
Tieni presente che TUTTE le variabili mantengono il valore che avevano nella barra precedente, a meno che quel valore non venga intenzionalmente cambiato. Per cui devi cambiare il valore del tuo indicatore solo quando necessario, non importa che tu metta INDICATORE = INDICATORE[1], anche se non è un errore, ovviamente.
Grazie Roberto,
purtroppo non mi è semplice orientarmi in quanto mi hai proposto.
Data la seguente logica:
indicator1 = (max(high[2], max(high[1], high)) + min(low[2], min(low[1], low)))/2
indicator2 = AverageTrueRange[10](close)
indicator3 = indicator1 + indicator2
indicator4 = indicator3[1]
indicator5 = max(high[1], indicator4)
la cui formula fa effettivamente quello che deve, come posso integrare il tuo codice per evitare che l’indicatore, nella barra corrente, si aggiorni con le formule sopra se e solo se (low[1] > low[2] and close[1] < indicator5[1]) OR (close[1] > close[2] and close[1] < indicator5[1])?
Grazie
Puoi scriverlo così:
IF (low[1] > low[2] and close[1] < indicator5[1]) OR (close[1] > close[2] and close[1] < indicator5[1]) THEN
indicator1 = (max(high[2], max(high[1], high)) + min(low[2], min(low[1], low)))/2
indicator2 = AverageTrueRange[10](close)
indicator3 = indicator1 + indicator2
indicator4 = indicator3[1]
indicator5 = max(high[1], indicator4)
ENDIF
Grazie. Se ho capito bene il codice che mi hai riportato andrebbe inserito tale e quale sull’editor. tuttavia la condizione “if” sull’indicatore viene verificata prima del calcolo dell’indicatore stesso e quindi alla fine l’indicatore non viene plottato sul grafico. Ho provato a prendere comunque spunto e codificare quanto segue (tralasciando la condizione sulla close riportata nei messaggi precedenti):
indicator1 = (max(high[2], max(high[1], high)) + min(low[2], min(low[1], low)))/2
indicator2 = AverageTrueRange[10](close)
indicator3 = indicator1 + indicator2
indicator4 = indicator3[1]
indicator5 = max(high[1], indicator4)
IF (low[1] > low[2] and close[1] < indicator5[1]) THEN
indicator6 = min(indicator5, indicator5[1])
ENDIF
return(indicator6)
tuttavia non funziona. riporto screen dove ho individuato l’errore.
Grazie
Nicola
Prova questo:
indicator1 = (max(high[2], max(high[1], high)) + min(low[2], min(low[1], low)))/2
indicator2 = max(high[2], max(high[1], high))
indicator3 = AverageTrueRange[10](close)
indicator4 = indicator1 + indicator3
indicator5 = max(indicator2, indicator4)
indicator6 = indicator5[1]
indicator7 = max(high[1], indicator6)
indicator8 = indicator7
IF (close < indicator7) AND ((low[1] >= low[2]) OR (close[1] > close[2])) THEN
indicator8 = indicator7[1]
endif
return indicator8 AS "ind8",indicator7 AS "ind7"
Ho spostato la tua richiesta da ProScreener a ProOrder in quanto si tratta di un indicatore.
Grazie di cuore Roberto per il supporto.
Provato anche con questa ma l’errore persiste. Allego screenshot.
Scusa, puoi dettagliare meglio in cosa consiste l’errore?
Grazie Roberto.
se dal calcolo matematico risulta un valore superiore, vorrei che l’indicatore mantenesse il valore che aveva alla barra precedente se soddisfatta la seguente condizione: low[1] > low[2]. Altrimenti se low[1] > low[2] e matematicamente l’indicatore è minore rispetto alla barra precedente, va calcolato l’indicatore normalmente.
Nicola
Ciao Roberto,
hai per caso avuto modo di leggere il mio messaggio sopra? Grazie e perdona il disturbo
Nicola
No, perché non riesco a capire qual’è l’errore.
Spiegamelo per favore ed allega una foto da cui si veda lo strumento, forex, indice o altro, il timeframe, data ed ora della candela con l’errore.