mammamia... na cosa del genere?
Announcement
Collapse
No announcement yet.
x Alexis - efs - costruire un indicatore - help
Collapse
This topic is closed.
X
X
-
-
Fra
Non proprio come l'hai scritta ma cosi come segue.
PHP Code:var vMACD12_26 = new MACDStudy(12, 26, 9, "Close", false);
var vEMA10 = new MAStudy(10, 0, "Close", MAStudy.EXPONENTIAL);
var vLastAlert = -1;
function preMain() {
setPriceStudy(true);
setStudyTitle("Indicatore Prova");
setCursorLabelName("Somma", 0);
//setCursorLabelName("Temp", 1);
setDefaultBarStyle(PS_SOLID, 0);
//setDefaultBarStyle(PS_SOLID, 1);
setDefaultBarFgColor(Color.red, 0);
//setDefaultBarFgColor(Color.red, 1);
setDefaultBarThickness(1, 0);
//setDefaultBarThickness(1, 1);
setPlotType(PLOTTYPE_LINE, 0);
//setPlotType(PLOTTYPE_LINE, 1);
}
function main() {
var vSomma = vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA);//la sintassi degli oggetti
//e' la stessa usata prima
//nel return new Array
return vSomma;//come vedi qui ho sostituito return new Array con semplice return
}
A questo punto hai in effetti l'indicatore pronto per l'uso (vedi immagine).
Il passo successivo sara quello di creare le condizioni per colorare la linea a seconda se sale o scende.
Alex
Comment
-
ok...giusto...
ora vorrei fare in modo che siano modificabili i parametri della MM e del MACD per prima cosa
e poi che dopo la seconda candela che cambia direzione (e che quindi conferma la prima) il colore dell'indicatore cambi colore (per esempio da verde a rosso... bellissimo se dopo una sola si colori di blu...wow...
Comment
-
Fra
In risposta alla prima richiesta non e' possibile farlo cosi come e' impostata la formula in questo momento.
Le formule create con il FW sono strutturate in modo tale che non e' possibile modificare I parametri degli studi applicati se non usando il FW stesso. Non so quale fosse la logica di questa scelta (che so cambiera) ma immagino che fosse per semplificare il processo.
Se vuoi creare una formula nella quale tutti I parametri siano modificabili la struttura del listato deve essere ben diversa e la formula va scritta ex-novo con l'Editor (e richiede una base di conoscenza di efs e javascript). Comunque vari esempi di questa struttura diversa sono disponibili nella cartella Builtin di Formulas dove si trovano le versioni efs di tutti I Basic Studies.
Per quel che riguarda invece la seconda richiesta dammi un po di tempo che compilo le istruzioni necessarie in modo da poter proseguire step by step come si e' fatto fino ad ora.
Alex
Comment
-
ah ok ... vabbè nessun problema per la prima cosa... basta cambiare a mano nell'efs i parametri ...no? in seguito si potrà sempre creare un nuovo...appena qua nel Forum avremmo preso la mano al linguaggio/metodologia ...
fai con calma...ma molta calma...stai facendo una cosa che spero sia utili a tanti...il post nasce proprio per poter essere un giorno un possibile link "didattico"
GRaZIEEE !
Comment
-
Fra
Anche se al momento useremo la formula cosi come l'abbiamo impostata con il FW (quindi con la limitazione di non poter modificare I parametri usando Edit Studies - a quello ci pensero poi io) questo non esclude che tu non possa iniziare a guardare le formule nella cartella Builtin e vedere in che modo sia diversa la sintassi.
Ti suggerirei a questo proposito di aprire le formule builtinMACD.EFS e builtinMA.EFS. Quello che noterai immediatamente e' che ci sono molte similitudini, ma il posizionamento delle dichiarazioni delle variabili e della costruzione degli oggetti (studi) e' diverso.
Alex
Comment
-
seguo subito il tuo consiglio...
ho messo nel mio spazio sharing al questo link un file pdf ricavato da un tagli/copia/incolla del file help che tu avevi segnalato... puoi (sempre con calmissima) dirmi se manca qualcosa prima che lo finisca in html con tutti i link attivi e indice
ciao
Fra
Comment
-
Fra
A questo punto stabiliamo quali informazioni dovremo avere per definire le condizioni che ci consentiranno di colorare la linea riportata dalla formula.
La prima cosa e' di scrivere in chiaro la condizione cosi come l'hai definita quindi
SE (vSomma(barra attuale) > vSomma(1 barra indietro) E vSomma(1 barra indietro) > vSomma(2 barre indietro)
COLORA la line in verde
SE (vSomma(barra attuale) < vSomma(1 barra indietro) E vSomma(1 barra indietro) < vSomma(2 barre indietro)
COLORA la linea in rosso
Ergo dobbiamo conoscere I valori di vSomma(barra attuale), vSomma(1 barra indietro) e vSomma(2 barre indietro). In efs la barra attuale ha un indice (Bar Index) uguale a 0, la barra precedente -1, due barre fa -2 e cosi via. Quindi la formula descritta sopra si dovrebbe poter tradurre come segue
SE(vSomma(0) > vSomma(-1) E vSomma(-1) > vSomma(-2)
COLORA la line in verde
SE (vSomma(0) < vSomma(-1) E vSomma(-1) < vSomma(-2)
COLORA la linea in rosso
Il problema a questo punto e' che mentre con gli studi builtin (quelli cioe' disponibili nel FW) e' molto semplice definire e reperire I valori storici (spieghero come poco oltre) non e' altrettanto semplice reperire quello delle variiabili create da noi quindi non si puo usare nelle condizioni la sintassi riportata in alto (a meno che non si creino Arrays che e' tutt'altro discorso e non particolarmente facile da affrontare a questo punto).
Comunque se ti ricordi all'inizio di questo thread ho scritto che se si vogliono soltanto due o tre valori storici si puo fare semplicemente creando delle variabili ad hoc.
Quindi per prima cosa vediamo come si reperiscono I valori storici dei builtin. Come ha gia avuto modo di vedere gli studi sono definiti nel seguente modo
il MACD come vMACD12_26.getValue(MACDStudy.MACD)
la MM come vEMA10.getValue(MAStudy.MA)
In entrambi I casi e' sottinteso (semplicemente perche non altrimenti definito) che si tratta dei valori della barra attuale. Infatti potrei anche scriiverli nel seguente modo e sarebbe la stessa cosa
vMACD12_26.getValue(MACDStudy.MACD,0)
vEMA10.getValue(MAStudy.MA,0)
Come vedi ho aggiunto una virgola e lo 0. Ne consegue che se voglio reperire I valori dei medesimi studi per la barra precedente scrivero
vMACD12_26.getValue(MACDStudy.MACD,-1)
vEMA10.getValue(MAStudy.MA,-1)
e per due barre fa
vMACD12_26.getValue(MACDStudy.MACD,-2)
vEMA10.getValue(MAStudy.MA,-2)
e cosi di seguito per valori precedenti
Alla luce di questo possiamo quindi creare delle nuove variabili che rappresenteranno I valori storici di vSomma. Infatti
se vSomma = vMACD12_26.getValue(MACDStudy.MACD)+vEMA10.getValu e(MAStudy.MA);
che sappiamo puo essere scritto anche cosi
vSomma = vMACD12_26.getValue(MACDStudy.MACD,0)+vEMA10.getVa lue(MAStudy.MA,0);
come possiamo definire una nuova variabile per vSomma(-1) che chiameremo per comodita vSomma1?
var vSomma1 =
e quello di due periodi fa che chiameremo vSomma2?
var vSomma2 =
A te di risolvere il quesito tenendo conto che hai tutte le informazioni in tuo possesso.
Alex
Comment
-
posso inserire a questo punto anche la condizione per colorare di blu al primo cambiamento ossia
SE (vSomma(barra attuale) > vSomma(1 barra indietro) COLORA la line in blu
SE (vSomma(barra attuale) < vSomma(1 barra indietro) COLORA la line in blu
per dare un primo segnale di stare attenti...insomma
Comment
-
Comment
-
Fra
Perfetto.
A questo punto breve parentesi per spiegarti come postare il listato come faccio io.
Nel messaggio scrivi [p h p] (senza gli spazi fra le lettere) poi copia il listato dall'Editor e incollalo qui e chiudi infine il listato con [/ p h p] (sempre senza gli spazi)
Allora a questo punto se guardi la prima definizione nel messaggio precedente vedrai che ora hai I valori storici delle variabili di cui avevi bisogno per cui ora puoi scrivere la condizione in questo modo
if(vSomma > vSomma1 && vSomma1 > vSomma2)
setBarFgColor(Color.blue);
dove && e' la sintassi per AND e setBarFgColor() e' il comando per colorare la linea.
Aggiungi la condizione alla tua formula e definisci anche la condizione inversa usando red come colore e riporta la formula nel thread con il metodo spiegato poc'anzi.
Carica la formula nel grafico e dovresti vedere I risultati
Alex
PHP Code:var vMACD12_26 = new MACDStudy(12, 26, 9, "Close", false);
var vEMA10 = new MAStudy(10, 0, "Close", MAStudy.EXPONENTIAL);
function preMain() {
setPriceStudy(true);
setStudyTitle("Indicatore Prova");
setCursorLabelName("Somma", 0);
setDefaultBarStyle(PS_SOLID, 0);
setDefaultBarFgColor(Color.lightgrey, 0);//cambiamo il colore qui a lightgrey e non red
setDefaultBarThickness(1, 0);
setPlotType(PLOTTYPE_LINE, 0);
}
function main() {
var vSomma = vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA);
var vSomma1 = vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1);
var vSomma2 = vMACD12_26.getValue(MACDStudy.MACD,-2) + vEMA10.getValue(MAStudy.MA,-2);
//qui di seguito inizieremo a definire le condizioni
return vSomma;
}
Comment
-
PHP Code:var vMACD12_26 = new MACDStudy(12, 26, 9, "Close", false);
var vEMA10 = new MAStudy(10, 0, "Close", MAStudy.EXPONENTIAL);
var vLastAlert = -1;
function preMain() {
setPriceStudy(true);
setStudyTitle("Indicatore Prova");
setCursorLabelName("Somma", 0);
setDefaultBarStyle(PS_SOLID, 0);
setDefaultBarFgColor(Color.lightgrey, 0);
setDefaultBarThickness(1, 0);
setPlotType(PLOTTYPE_LINE, 0);
}
function main() {
var vSomma = vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA),
var vSomma1 = vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1)
var vSomma2 = vMACD12_26.getValue(MACDStudy.MACD,-2 + vEMA10.getValue(MAStudy.MA,-2)
if(vSomma > vSomma1 && vSomma1 > vSomma2) setBarFgColor(Color.green);
if(vSomma < vSomma1 && vSomma1 < vSomma2) setBarFgColor(Color.red);
return vSomma;
}
Comment
-
Fra
Ti da un errore perche
a) hai una virgola alla fine della prima variabile vSomma dove dovrebbe esserci invece un punto e virgola (punto e virgola dovrebbero esserci alla fine anche delle dichiarazioni delle altre variabili)
b) nella variabile vSomma2 hai omesso una parentesi di chiusura in vMACD12_26.getValue(MACDStudy.MACD,-2
Il fatto che cerchi di plottare in una finestra a se stante e' un derivato di questi errori. Rimuovi lo studio, applica le correzioni, salva il file e ricaricalo nel grafico
Alex
Comment
-
Fra
Eccoti giusto per sicurezza la formula corretta con alcuni commenti sui prossimi steps
Alex
PHP Code:var vMACD12_26 = new MACDStudy(12, 26, 9, "Close", false);
var vEMA10 = new MAStudy(10, 0, "Close", MAStudy.EXPONENTIAL);
var vLastAlert = -1;//cancella questa linea che al momento non serve
function preMain() {
setPriceStudy(true);
setStudyTitle("Indicatore Prova");
setCursorLabelName("Somma", 0);
setDefaultBarStyle(PS_SOLID, 0);
setDefaultBarFgColor(Color.lightgrey, 0);
setDefaultBarThickness(2, 0);//incrementato lo spessore della linea
setPlotType(PLOTTYPE_LINE, 0);
}
function main() {
var vSomma = vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA);
var vSomma1 = vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1);
var vSomma2 = vMACD12_26.getValue(MACDStudy.MACD,-2) + vEMA10.getValue(MAStudy.MA,-2);
//inserisci qui l'altra definizione che volevi applicando la stessa sintassi usata qui sotto
if(vSomma > vSomma1 && vSomma1 > vSomma2) setBarFgColor(Color.green);
if(vSomma < vSomma1 && vSomma1 < vSomma2) setBarFgColor(Color.red);
return vSomma;
}
Comment
Comment