Announcement
Collapse
No announcement yet.
Help - costruzione efs
Collapse
X
-
-
Fra
Tra l'altro questa soluzione diventa particolarmente utile se/quando si vuole rendere modulare un efs o comunque si ha necessita di eseguire alcune computazioni al di fuori di main.
Continuando ad usare l'esempio sviluppato fino ad ora potremmo muovere fuori da main il calcolo per Price1 creando una funzione apposita e poi passare alla funzione onAction1() il valore di Price1 (vedi esempio allegato)
PHP Code:function preMain() {
setPriceStudy(true);
setStudyTitle("example");
setShowCursorLabel(false);
}
function main() {
var Price1 = Prezzo1(2);//anziche calcolare Price1 qui in main creo una funzione separata
//chiamata Prezzo1 alla quale passo un parametro - in questo caso 1
if(1==1)
onAction1(Price1);//alla funzione onAction1 passo quindi il valore Price1 che e' calcolato
//nella funzione Prezzo1
return;
}
//come puoi vedere ho creato una funzione chiamata Prezzo1. Nella parentesi assegno un nome alla
//variabile o parametro che viene passato a questa funzione (in questo caso il valore 1)
function Prezzo1(lookback){
var temp = ((close(-lookback))-(high(-lookback)-low(-lookback)));//nota che anziche scrivere
//(-1) ho inserito il nome
//del parametro passato da main
//se in main ora cambi il valore passato nella parentesi da 1 a 2 (ad esempio) sara come
//se tu avessi scritto l'equazione cosi ((close(-2))-(high(-2)-low(-2)))
return temp;//questo e' il riporto che main ricevera' in ritorno
}//fine funzione Prezzo1
function onAction1(Price1){
drawTextRelative(4,Price1, formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
}
PHP Code:function preMain() {
setPriceStudy(true);
setStudyTitle("example");
setShowCursorLabel(false);
}
function main() {
if(1==1)
onAction1();
return;
}
function onAction1(){
var Price1 = Prezzo1(1);//qui chiamo la funzione Prezzo1 e passo il parametro 1
drawTextRelative(4,Price1, formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
}
function Prezzo1(lookback){
var temp = ((close(-lookback))-(high(-lookback)-low(-lookback)));
return temp;
}
Fatto piu importante pero e' che nel tempo questo ti consente di creare intere sezioni di efs che possono essere facilmente copiate e incollate in altri efs
Alex
Comment
-
Originally posted by Alexis C. Montenegro
Fra
Un'altra modifica che farei per migliorare leggermente le prestazioni e' la seguente.
Siccome nel calcolare Price1 e Price2 tu usi sempre e soltanto I prezzi della barra precedente allora non hai bisogno di ricalcolare quelle variabili ad ogni tick perche nel corso della barra corrente non cambieranno mai di valore..
Quindi puoi racchiudere I calcoli delle due variabili dentro ad una condizione getBarState()==BARSTATE_NEWBAR e cioe forzi l'efs a calcolare quelle variabili soltanto al completamento della barra.
Di seguito puoi vedere come farlo
Alex
PHP Code:if(getBarState()==BARSTATE_NEWBAR){//ad ogni nuova barra
Price1 = (close(-1)-(high(-1)-low(-1)));//calcola Price1
Price2 = ((close(-1))+(high(-1)-low(-1)));//calcola Price2
}
ho creato un efs "gemello" senza questa if per i chart daily da utilizzare la sera, altrimenti non mi dà lo SL aggiornato fino all'open
Comment
-
Fra
Non sono sicuro di capire che differenza faccia. Le due equazioni per Price1 e Price2 sono calcolate sui valori della barra precedente quindi in entrambi I casi non puoi avere lo stop aggiornato fino a che non si forma una nuova barra. L'unica differenza che la condizione BARSTATE_NEWBAR introduce e' che effettua I calcoli una sola volta all'inizio della barra anziche ad ogni tick.
Prova il seguente efs e dovresti vedere entrambi I prezzi aggiornati contemporaneamente
Alex
PHP Code:var Price1=null;
var Price1b=null;
function preMain() {
setPriceStudy(true);
setStudyTitle("test");
setShowCursorLabel(false);
}
function main() {
if(getBarState()==BARSTATE_NEWBAR){
Price1 = (close(-1)-(high(-1)-low(-1)));
}
Price1b = (close(-1)-(high(-1)-low(-1)));
drawTextRelative(4, Price1, formatPriceNumber(Price1), Color.blue, null, Text.BOTTOM, "Arial",10,"prezzo1");
drawTextRelative(4, Price1b, formatPriceNumber(Price1), Color.blue, null, Text.TOP, "Arial",10,"prezzo1b");
return;
}
Comment
-
quindi Alexis
per capire bene...non posso fargli fare calcoli in quanto non sa che la barra è finita fin quando non comincia l'altra? Ora per esempio , a mercato italiano chiuso, vedo quello relativo alla seduta di venerdì, calcolato sui valore HLC di giovedì...Devo sostituire (-1) con (0) insomma per utilizzarlo come EOD ? o creare una variabile per inserire a scelta -1 o 0...giusto?
Comment
-
Fra
non posso fargli fare calcoli in quanto non sa che la barra è finita fin quando non comincia l'altra?
Esatto
Devo sostituire (-1) con (0) insomma per utilizzarlo come EOD ? o creare una variabile per inserire a scelta -1 o 0...giusto?
Giusto.
Alex
Comment
-
Fra
A questo punto se desideri poter modificare la variabile via Edit Studies (anziche modificando l'efs stesso) ci sono due metodi per poterlo fare (a dire il vero sono piu due varianti dello stesso metodo che non due metodi diversi)
Assumiamo quindi di voler variare la barra di riferimento da usare nell'equazione (ergo il valore nella parentesi in open(), high(), etc. Per questo esempio useremo una versione semplificata dell'ultimo efs che ho postato e la prima variante disponibile (che e' piu semplice da implementare ma offre meno opzioni)
PHP Code:var Price1=null;
function preMain() {
setPriceStudy(true);
setStudyTitle("test");
setShowCursorLabel(false);
}
function main(Riferimento) {//nella parentesi inserisco il nome della variabile
//cosi come verra usata nell'efs
//quindi inserisco una condizione che determina che se il valore della variabile
//e' nullo l'efs dovra usare come default il valore assegnato qui
if(Riferimento==null) Riferimento = 1;
Price1 = (close(-Riferimento)-(high(-Riferimento)-low(-Riferimento)));//quindi uso la variabile
//nell'equazione
drawTextRelative(4, Price1, formatPriceNumber(Price1), Color.blue, null, Text.BOTTOM, "Arial",10,"prezzo1");
return;
}
Inserisci 0 nella casella corrispondente alla colonna Value e l'equazione a quel punto fara riferimento ai valori della barra corrente. Se invece inserisci 2 l'equazione fara riferimento ai valori di due barre fa, etc (ti rammento che 1 e' il default).
Nota che con questa variante non viene fornito in Edit Studies il valore di default. Quello sara invece disponibile quando useremo la seconda variante.
Alex
Comment
-
Fra
In un precedente messaggio ti ho suggerito di usare la seguente sintassi per determinare il valore di Price1
PHP Code:if(getBarState()==BARSTATE_NEWBAR){//ad ogni nuova barra
Price1 = (close(-1)-(high(-1)-low(-1)));//computa l'equazione
}
Visto pero che ora desideri poter usare l'efs in "EOD" (per usare la tua stessa convenzione) e quindi devi poter vedere il valore attuale senza dover aspettare una nuova barra la soluzione offerta qui sopra non puo essere utilizzata.
Pero usando la variabile modificabile "Riferimento" descritta nel precedente messaggio possiamo creare delle condizioni un po piu articolate che ci consentono di avere entrambi I metodi a seconda della necessita. Quindi eccoti una leggera modifica che usa il valore "Riferimento" per determinare anche in quale contesto usare l'equazione e non solamente quale valore usare.
Alex
PHP Code:var Price1=null;
function preMain() {
setPriceStudy(true);
setStudyTitle("test");
setShowCursorLabel(false);
}
function main(Riferimento) {//all'interno della parentesi creo la variabile Riferimento
if(Riferimento==null) Riferimento = 1;//qui determino il valore di default di Riferimento
if(Riferimento==0){//se Riferimento e' uguale a 0 (il che significa che tu vuoi computare
//Price1 in base ai valori della barra corrente
Price1 = (close(0)-(high(0)-low(0)));//computa questa equazione
}else if (Riferimento!=0){//se invece Riferimento e' un valore non uguale a 0
if(getBarState()==BARSTATE_NEWBAR){//ad ogni nuova barra computa Price1
Price1 = (close(-Riferimento)-(high(-Riferimento)-low(-Riferimento)));//usando Riferimento come valore
}
}
if(Price1==null) return;//null check
drawTextRelative(4, Price1, formatPriceNumber(Price1), Color.blue, null, Text.BOTTOM, "Arial",10,"prezzo1");
return;
}
Comment
-
Perfetto Alexis
a questo punto dovrebbe essere abbastanza chiaro come utilizzare un efs con la singola variabile "modificabile" senza aprire un efs e come utilizzare il parametro nella costruzione degli eventi. Provo a utilizzare la tua cortese spiegazione nell'efs di partenza
ora abbiamo in effetti:
una parte iniziale in cui stabiliamo le 4 var (il CCI, la MM e i due prezzi SL da mostrare alternativamente)
poi il preMain dove stabiliamo l'aspetto dell'efs: plottato sul chart, il titolo, il nome nella finestra del cusrore etc etc
il Main, dove con l'ultima versione abbiamo specificato la var modificabile - chiamandola Riferimento - con il valore di default 1, la prima possibilità = 0 oppure il valore impostato manualmente nell'edit studies
a seguire le varie if per le action (da 1 a 6b) e il comando per scrivere cmq il valore del CCI (completo di null check)
per ultime le action...
Comment
-
Fra
In sintesi quella che descrivi e' la struttura di un qualsiasi efs e cioe
- dichiarazioni delle variabili globali
- funzione PreMain che viene eseguita soltanto una volta quando l'efs viene caricato in un grafico (oppure ad ogni Reload) e che contiene le istruzioni di default di come l'efs verra plottato
- funzione main che viene eseguita ad ogni tick e che contiene variabili locali, il listato necessario per calcolare un indicatore, studio, ecc e le condizioni da valutare, oltre che il riporto da plottare sul grafico
- funzioni aggiuntive (opzionali) che contengono comandi o comunque istruzioni da eseguire quando vengono chiamate dalla funzione main (o da altre funzioni)
Alex
Comment
-
ho fatto una piccola modifica
invece di usare il barcolor, che non permetteva di utilizzare grafici a candele, ho inserito un altro drawshape
PHP Code:unction onAction5(){
drawShape(Shape.CIRCLE,BottomRow1,Color.green);
drawTextRelative(2,Price1,"t", Color.blue, null, Text.VCENTER,"Wingdings 3",8,"freccia1");
drawTextRelative(4, Price1, formatPriceNumber(Price1), Color.blue, null, Text.VCENTER, "Arial",10,"prezzo1");
Comment
-
PS modificato a BottomRow2 altrimenti interferisce un pò con i pane inferiori quando è pottato un indicatore/osc in basso
PS non vorrei disabilitare la riga 648 del Pivot console, che interferisce con questo efs... non riesco a modificare però la posizione...Alexis un aiutino?
PHP Code://display our ATR
if ( nATRType != 0 ) {
if ( nATRType == 1 ) {
sStr = "ATR ("+nATRPeriod+"-Day): "+rnd( nATR, 2)+" Variable Pivot = "+
nVariablePivot+ " min. Force RTH="+(sForceRTH=="T" ? "ON" : "OFF");
}
else {
sStr = "posATR ("+nATRPeriod+"-Day): "+rnd( nPosAtr, 2)+" negATR ("+nATRPeriod+"-Day): "+
rnd( nNegAtr, 2)+" Variable Pivot = "+nVariablePivot+" min. Force RTH="+(sForceRTH=="T" ? "ON" : "OFF");
}
drawTextAbsolute(40,1, sStr, nATRColor, null , nATRFlags | Text.LEFT | Text.RELATIVETOLEFT | Text.RELATIVETOBOTTOM,
null, nATRFontSize, gID());
}
Last edited by fra; 09-28-2005, 04:15 AM.
Comment
-
Fra
Mentre vado a rivederemi la formula del Pivot Console rispondo al tuo primo messaggio nel quale fai riferimento al non poter colorare le candele. In effetti il comando setPriceBarColor() include alcuni parametri opzionali che sono specifici per I grafici candlestick (vedi questo articolo nel EFS KnowledgeBase).
I parametri opzionali sono WickColor che serve a colorare l'ombra, bThinWick (dove b sta per Boolean quindi true/false) per lo spessore dell'ombra e bHollow (anche qui true/false) per colorare o meno il corpo della candela.
Al momento manca una opzione per colorare il contorno del corpo ma so che e' stata gia richiesta
Alex
Comment
-
Fra
Hai due soluzioni possibili e cioe' o sposti in alto le tue barre colorate oppure fai la stessa cosa con la scritta del Pivot Console.
Nel primo caso anziche usare BottomRow1 usa TopRow1 mentre per la seconda soluzione rimpiazza al rigo 648 Text.RELATIVETOBOTTOM con Text.RELATIVETOTOP
Alex
Comment
-
Grazie Alexis per entrambi i suggerimenti
per quanto riguarda il "Pivot Console" , modificando in RELATIVETOTOP quel RELATIVETOBOTTOM, la scitta scompare parzialmente dallo schermo. Inoltre va a sovrapporsi al valore CCI che l'altro efs plotta in alto a destra .
A questo punto, è il caso di sostituire il comando del PConsole DrawTextAbsolute con un "semplice" DrawText, per posizionarlo altrove? O cosa altro consigli?
Comment
Comment