Back to the index page  
  FAQ   Cerca   Lista utenti   Gruppi   Registrati   Profilo   Messaggi privati   Log in 
MQL: Scrivere Custom Indicator per metatrader 4

 
Nuovo argomento   Rispondi    Indice del forum » Metatrader - Expert Advisor - MQL Precedente :: Successivo  
Ads
 Inviato: Ven Ago 18, 2017 8:25 pm  
Messaggio
  Ads




MQL: Scrivere Custom Indicator per metatrader 4
 MessaggioInviato: Mar Nov 13, 2007 10:27 am Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5575
Residenza: Padova

Per poter scrivere un custom indicator (indicatore personalizzato) è necessario prima capire come funzionano i buffer in metatrader.

I buffer sono simili agli array, la differenza è che questi vengono parzialmente gestiti dalla piattaforma metatrader. Infatti ogni volta che nel grafico viene disegnata una nuova barra nel buffer viene inserito un nuovo elemento con indice 0 e gli altri vengono scalati di un posto (una specie di stack).

Questo viene fatto per far coincidere ad ogni barra del grafico un elemento dell'array, ovviamente sia l'ultima barra disegnata che l'ultimo posto creato nel buffer saranno accessibili con l'indice 0, i penultimi con indice 1 e così via.

Un vincolo di metatrader impone che il massimo numero di buffers visualizzati in un'indicatore è 8.

Facciamo un esempio pratico per fissare meglio il concetto, prendiamo ad esempio l'alligator:

Se lo attacchiamo al grafico vediamo come l'indicatore sia composto da 3 linee (verde, rossa e blu):


Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Le 3 linee stanno a significare che nell'indicatore sono stati dichiarati 3 buffer, andiamo a dare un'occhiata al codice:

Codice:
//---- indicator buffers
double ExtBlueBuffer[];
double ExtRedBuffer[];
double ExtLimeBuffer[];


si nota subito la dichiarazione di 3 array di double. Il nome utilizzato ci aiuta a capire che si tratta dei 3 buffer che verranno utilizzati dall'alligator, ovviamente allo stato attuale la dichiarazione è quella di 3 semplici array, vedremo in seguito come farli diventare dei buffer, accedere ai valori, e diseganrli sul grafico.

Dei parametri fondamentali che verranno utilizzati nei buffer saranno quindi:

- il tipo di visualizzazione sul grafico (non obbligatorio) ad esempio una linea, una freccia, un punto
- il colore
- dove visualizzarlo: sul grafico o su una finestra separata
- nel caso di una finestra separata si potrà inoltre specificare la scala dell'asse y

Dopo questa fondamentale introduzione è il momento di passare alla pratica, aprite il metaeditor, dal menu selezionate File -> Nuovo -> Indicatore Personalizzato -> Next.

Si avvierà un procedura guidata che non è necessario seguire ma che può risultare comoda soprattutto se si ha già bene in mente l'indicatore finale (in ogni caso non preocupatevi di pensare da subito a tutto, si potranno facilmente modificare o aggiungere via codice in un secondo momento), noi procediamo con l'esempio dell'alligator:


Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



I primi 3 campi da completare si commentano da soli, premendo sul tasto aggiungi si possono inserire invece quelli che nel codice vengono indicati come variabili esterne il cui valore può essere poi modificato quando si attacca l'inicatore al grafico:

Codice:
//---- input parameters
extern int       JawsPeriod=13;
extern int       JawsShift=8;
extern int       TeethPeriod=8;
extern int       TeethShift=5;
extern int       LipsPeriod=5;
extern int       LipsShift=3;


Clicchiamo quindi nuovamente su next, nella schermata seguente impostiamo i buffer:


Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Nel nostro caso non andiamo a spuntare indicatore nella finestra separata, in caso contrario sarebbe stato anche possibile indicare un range di valori per l'asse y, se lasciato vuoto la scala verrà generata automaticamente a seconda dei valori dei buffer.

Cliccando su aggiungi andiamo ad aggiungere i buffer, nel nostro caso 3 ed andiamo anche ad impostare il colore. Clicchiamo su finish e osserviamo il codice generato:

Codice:
#property indicator_chart_window


Questo significa che l'indicatore sarà tracciato sulla stessa finestra del grafico, lo abbiamo impostato lasciando vuota la checkbox indicatore nella finestra separata; in caso contrario sarebbe valorizzato a indicator_separate_window.

Codice:
#property indicator_buffers 3


Indica quanti buffer verranno utilizzati, ricordo che il massimo è 8.

Codice:
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime


Va ad assegnare un colore ad ogni buffer

Codice:
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];


Inizializza i 3 array di double che andranno a immagazzinare i valori da disegnare sul grafico, non mi soffermo ulteriormente dato che li abbiamo già incontrati nella premessa.

A questo punto si entra nella funzione init():

Codice:
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   ........

//----
   return(0);
  }


La funzione init() è molto utilizzata negli indicatori (anche se non è obbligatoria), essa viene richiamata solo la prima volta che si attacca l'indicatore al grafico e viene utilizzata principalmente per l'impostazione dei buffer.

Codice:
int deinit()
  {
//----
   
//----
   return(0);
  }


deinit() è la funzione opposta a init(), viene richiamata solo quando l'indicatore viene cancellato dal grafico e serve per cancellare gli oggetti creati e liberare la memoria. Anche questa non è obbligatoria e non viene quasi mai usata.

Codice:
int start()
  {

   int counted_bars=IndicatorCounted();

   return(0);
  }


start() è la funzione fondamentale e viene richiamata ad ogni nuovo tick cioè ogni volta che il prezzo di un cross viene aggiornato.

Torniamo allora al codice generato nella funzione init():

Codice:
//---- indicators
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);


Questa è la parte più importante nella dichiarazione di un buffer. La funzione SetIndexBuffer() serve ad inizializzare i buffer, il primo parametro numerico assegna un indice al buffer con cui poi verrà sempre richiamato, con il secondo parametro si assegna invece l'array dichiarato precedentemente al buffer numero 1, 2 o 3. E' utile precisare che a questo punto i colori definiti in precedenza nelle proprietà sono già stati assegnati, indicator_color1 sarà il buffer 0, indicator_color2 il buffer 1 e così via.

Codice:
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);


Questa è invece la parte grafica dell'indicatore. SetIndexStyle() assegna al buffer indicato nel primo parametro un tipo di disegno nel grafico, in questo caso abbiamo scelto la linea ma sono disponibili anche:

Codice:
DRAW_LINE
DRAW_SECTION 1
DRAW_HISTOGRAM 2
DRAW_ARROW 3
DRAW_ZIGZAG 4
DRAW_NONE 12


La funzione SetndexStyle() non è molto difficile da comprendere e lascio a voi il piacere di sperimentarla, per scoprirla a fondo vi invito a consultare il metaeditor, ecco la dichiarazione della funzione:

Codice:
void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)


Ora che abbiamo analizzato tutta la parte di codice generata dalla procedura guidata andiamo a completare il nostro alligator implementando il codice mancante.

Per prima cosa diamo un senso ai vari JawsShift, TeethShift, LipsShift dichiarati come variabili esterne, inseriamo questo pezzo di codice all'interno di init():

Codice:
//---- line shifts when drawing
   SetIndexShift(0,JawsShift);
   SetIndexShift(1,TeethShift);
   SetIndexShift(2,LipsShift);


La funzione SetIndexShift() è molto semplice da comprendere, il primo parametro si riferisce al buffer a cui deve essere applicata mentre il secondo parametro imposta lo scostamento dalla barra 0. Come al solito valori positivi indicano che uno scostamento verso destra rispetto alla barra 0 mentre valori negativi uno scostamento a sinistra.


Codice:
//---- first positions skipped when drawing
   SetIndexDrawBegin(0,JawsShift+JawsPeriod);
   SetIndexDrawBegin(1,TeethShift+TeethPeriod);
   SetIndexDrawBegin(2,LipsShift+LipsPeriod);


La funzione SetIndexDrawBegin() imposta il numero di barre da cui cominciare a disegnare sul grafico. Come al solito il primo parametro indica a quale buffer attaccare la funzione, sul secondo parametro c'è invece qualcosa da precisare.

Al contrario di quanto accade solitamente su metatrader in questo caso la barra 0 (importante!) è la prima barra ed essere stata disegnata sul grafico e non la più recente. Nel valorizzare questo parametro bisogna quindi fare un paio di considerazioni.

La prima riguarda il parametro impostato nella precedente funzione SetIndexShift(): se abbiamo impostato uno scostamento differente da 0 questo stesso scostamento deve essere ripetuto in questa funzione in modo che nella barra più recente i buffer risultino allineati.

La seconda riguarda invece il periodo (perchè l'alligator utilizza delle medie mobili): i dati tracciati prima che ci siano dei periodi sufficienti per il calcolo della media non devono essere presi in considerazione in quanto non risultano affidabili.

Il lettore più attento si sarà però accorto che applicando entrambe le considerazioni i conti non tornano, in realtà non ho mai approfondito la cosa ma credo che metatrader in questa funzione non si comporti in maniera molto trasparente e vada a modificare come meglio gli piace questa funzione. Spero magari in futuro di fare più luce sulla questione.

Altro parametro impostabile è l'etichetta che si vuole assegnare a ciascun buffer in modo da rendere più comprensibile il codice e le proprietà dell'indicatore su metatrader:

Codice:
//---- index labels
   SetIndexLabel(0,"Gator Jaws");
   SetIndexLabel(1,"Gator Teeth");
   SetIndexLabel(2,"Gator Lips");


Credo che a questo punto non ci sia nulla da aggiungere sulla funzione SetIndexLabel(), il primo parametro si riferisce al buffer mentre il secondo è una stringa che assegna una label (etichetta) al buffer.

La funzione init() è a questo punto terminata non ci resta che capire come valorizzare i buffer, la parte grafica è a questo punto conclusa.

Codice:
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
  }


Questo piccolo pezzo di codice è in realtà più complesso di quanto può apparire, è stato approfondito in maniera dettagliata al seguente topic che vi invito a leggere:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Riassumendo brevemente quanto trovate spiegato nel topic sopra questo righe sono implementate per 3 ragioni:

- migliorare le prestazioni (velocità) dell'indicatore;
- evitare possibili errori se l'indicatore viene richiamato all'interno di un expert advisor;
- evitare altri tipi di errore (connessione...).

ed ecco la parte relativa alla valorizzazione vera e propria degli elementi dei buffer:

Codice:
for(int i=0; i<limit; i++)
     {
      //---- ma_shift set to 0 because SetIndexShift called abowe
      ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
     }


Il semplice ciclo for fa parte in realtà delle considerazioni precedenti ed è dettagliato nel topic linkato sopra, in poche parole viene eseguito solo per il numero di barre per cui l'indicatore non è ancora stato calcolato.

La valorizzazione degli elementi dei buffer avviene come si trattasse di semplici array (abbiamo visto che in realtà sono gestiti da metatrader):

la variabile i corrisponde alla barra che si sta prendendo in esame, anche in questo caso la barra 0 è quella più recente. Agli elementi dei buffer viene assegnato il valore double restituito dalla funzione iMA; per comprendere al meglio le funzioni che richiamano gli indicatori predefiniti di metatrader vi invito a consultare questo topic:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Nel nostro caso stiamo semplicemente assegnando il valore di medie mobili, ne descrivo una a titolo esmplificativo ma ripeto, i dettagli li trovate se seguite il topic alla riga sopra:

Codice:
iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);


NULL indica che la stiamo applicando sul cross del grafico a cui abbiamo applicato l'indicatore;
0 indica che lo stiamo applicando sul timeframe applicato al grafico;
JawsPeriod è un intero ed è il periodo della media mobile;
MODE_SMMA indica che la media mobile è semplice;
PRICE_MEDIAN che viene calcolata sul valore medio della barra;
i indica la barra su cui la stiamo calcolando.

In fin dei conti l'alligator è costituito da 3 righe di codice che sono in realtà le 3 medie mobili (sarà per questo che non da dei buoni segnali?). Tutto il contorno serve per poter visualizzare l'indicatre sul grafico.

Quello che mi interessa aver trasmesso in questo topic è il funzionamento dei buffer che, a mio avviso, sono liquidati con troppa fretta nel metaeditor.

Non ho utilizzato tutte le funzioni possibili ma penso di avervi dato gli strumenti per poter affrontare da soli le rimanenti. Se così non fosse il topic è a disposizione per afforntare tematiche inerenti, per dubbi o precisazioni.

L'alligator è un indicatore molto semplice, mi è servito per avere una traccia degli argomenti da seguire. Lo ricopio per completezza:

Codice:
//+------------------------------------------------------------------+
//|                                                    Alligator.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime
//---- input parameters
extern int JawsPeriod=13;
extern int JawsShift=8;
extern int TeethPeriod=8;
extern int TeethShift=5;
extern int LipsPeriod=5;
extern int LipsShift=3;
//---- indicator buffers
double ExtBlueBuffer[];
double ExtRedBuffer[];
double ExtLimeBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- line shifts when drawing
   SetIndexShift(0,JawsShift);
   SetIndexShift(1,TeethShift);
   SetIndexShift(2,LipsShift);
//---- first positions skipped when drawing
   SetIndexDrawBegin(0,JawsShift+JawsPeriod);
   SetIndexDrawBegin(1,TeethShift+TeethPeriod);
   SetIndexDrawBegin(2,LipsShift+LipsPeriod);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBlueBuffer);
   SetIndexBuffer(1,ExtRedBuffer);
   SetIndexBuffer(2,ExtLimeBuffer);
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
//---- index labels
   SetIndexLabel(0,"Gator Jaws");
   SetIndexLabel(1,"Gator Teeth");
   SetIndexLabel(2,"Gator Lips");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Bill Williams' Alligator                                         |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- main loop
   for(int i=0; i<limit; i++)
     {
      //---- ma_shift set to 0 because SetIndexShift called abowe
      ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+


La cosa più utile di creare un'indicatore personalizzato è che poi potrete richiamarlo e sfruttarlo negli expert advisor utilizzando la funzione iCustom():

Codice:
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)


i parametri symbol, timeframe, sono gli stessi visti in precedenza.

name è invece il nome dell'indicatore da voi creato o che volete tilizzare. L'importante è che sia compilato è che quindi disponiate del file con estensione .ex4.

Il nome va racchiuso tra virgolette "nome_indicatore" in quanto stringa, fate attenzione a non inserire spazi superflui in quanto non verrà riconosciuto e omettete l'estensione del file.

Qualunque nome abbiate inserito nel momento in cui compilerete il codice non verrà segnalto nessun errore, se non disponete dell'indicatore vi accorgerete che le cose non vanno solamente a run-time quando non vedrete l'output desiderato.

Il seguente parametro è indicato da dei puntini ( .... ). In questo punto potete quindi inserire tutte le proprietà che volete impostare nell'indicatore richiamato. I vincoli sono che i parametri devono essere nello stesso ordine in cui sono stati dichiarati e ovviamente devono anche essere dello stasso tipo.

Mode indica quale dei buffer dell'indicatore richiamato volete utilizzare ed infine lo shift indica la barra che state prendendo in considerazione.


L'ultima modifica di carlo10 il Sab Nov 15, 2014 1:15 pm, modificato 1 volta
Profilo Invia messaggio privato Invia e-mail HomePage
Grande Carlo
 MessaggioInviato: Dom Ago 16, 2009 12:49 pm Rispondi citando  
Messaggio
  valentinoforever
New Entry
New Entry

Registrato: 16/04/09 04:46
Messaggi: 3

mi hai spiegato molto più in quest'articolo di quanto non abbia appreso tra topics vari e guide di codesguru Smile

Sei davvero bravo non solo nel conoscere il linguaggio mql ma anche nel sapere spiegare...secondo me sei un professore universitario Embarassed

parlando d'altro spero tu possa darmi una mano a comprendere meglio questo codice che tempo fa' ho modificato "ma crossover signal"
di cui non comprendo questo:

ExtMapBuffer1[i]=Low[i]-ArrowShift*Range*0.5;

perchè mette * 0.5 ???? Shocked

//+------------------------------------------------------------------+
//| MA Crossover Shift Signal by Dr House.mq4 |
//| Copyright © 2009, Dr.House7 |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2009, Dr.House7"
#property link "http://www.sungold.it"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

extern int FasterMA = 3;
extern int SlowerMA = 3;
extern double ArrowShift= 1.0;
extern int ma_method =1;
extern int ma_price =0;
extern bool SoundON=false;
double alertTag;
double control=2147483647;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY,1);
SetIndexArrow(0, 159);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1, DRAW_ARROW, EMPTY,1);
SetIndexArrow(1, 159);
SetIndexBuffer(1,ExtMapBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, i, counter;
double fasterMAnow, slowerMAnow;
double Range, AvgRange;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(i = 0; i <= limit; i++) {

counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;

if ((fasterMAnow > slowerMAnow)) {
ExtMapBuffer1[i]=Low[i]-ArrowShift*Range*0.5;
}
else if ((fasterMAnow < slowerMAnow)) {
ExtMapBuffer2[i]=High[i]+ArrowShift*Range*0.5;
}
if (SoundON==true && i==1 && ExtMapBuffer1[i] > ExtMapBuffer2[i] && alertTag!=Time[0]){
Alert("MA Shift Cross Trend going Down on ",Symbol()," ",Period());
alertTag = Time[0];
}
if (SoundON==true && i==1 && ExtMapBuffer1[i] < ExtMapBuffer2[i] && alertTag!=Time[0]){
Alert("MA Shift Cross Trend going Up on ",Symbol()," ",Period());
alertTag = Time[0];
}
}
return(0);
}


Ti ringrazio per ogni possibile aiuto
Profilo Invia messaggio privato
 MessaggioInviato: Dom Nov 08, 2009 4:03 pm Rispondi citando  
Messaggio
  azoth
Trader part-time
Trader part-time

Registrato: 01/12/07 19:20
Messaggi: 155

Carlo, complimenti per la chiarezza.

Avrei una domanda:
se, per ciascuna delle tre medie mobili che compongono l’alligator, io volessi che venga tracciato solamente un trattino o un punto, corrispondente al valore ottenuto per ultima candela, che cosa (e dove) devo scrivere nel codice?

Un grazie anticipato per la risposta.
Profilo Invia messaggio privato
 MessaggioInviato: Lun Giu 06, 2011 8:00 pm Rispondi citando  
Messaggio
  lupos
Studente
Studente

Registrato: 11/05/11 13:55
Messaggi: 10

altra domanda a cui non riesco a trovare risposta:

iCustom mi restituisce solo l'ultimo (ovvero lo zero) dell'array del buffer dell'indicatore.

non sarebbe più logico visto che sono array i buffer mi rendesse un buffer?

nella fattispecie io avrei bisogno di prendere il valore 1 e non 0 dell'array dell'indicatore come faccio?
provo a passare il valore 1 da icustom dagli appositi puntini, ma poi nell'indicatore non so come spostare l'array senza creare pasticci.

mi sono spiegato?
Profilo Invia messaggio privato
 MessaggioInviato: Lun Giu 06, 2011 8:05 pm Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5575
Residenza: Padova

Credo di aver capito ciò che intendi, il parametro che devi impostare ad 1 è l'ultimo ovvero lo shift. Perchè la funzione ti restituisca il valore però l'indicatore deve essere sviluppato secondo tutte le regole.

Per esempio a me è capitato di fare degli indicatori che non valorizzavano tutto l'arrey ma solamente la posizione 0, questo perchè mi risultava molto più veloce e per i miei scopi era sufficiente.

_________________
remitur ha scritto:
Mi rammento di quando studiavo azionario e futures, allora si usava una metafora, ma secondo mè è una gran verità, nel Klondike al tempo dei cercatori d'oro guadagnavano di più e sopratutto in maniera costante i venditori di pale, setacci e attrezzi vari (Ross e libri vari) che i cercatori; tranne qualcuno. chissà quale era la percentuale ?
Profilo Invia messaggio privato Invia e-mail HomePage
 MessaggioInviato: Lun Giu 06, 2011 8:16 pm Rispondi citando  
Messaggio
  lupos
Studente
Studente

Registrato: 11/05/11 13:55
Messaggi: 10

ok era proprio quello... grande, grazie
Profilo Invia messaggio privato
 MessaggioInviato: Sab Set 22, 2012 8:56 pm Rispondi citando  
Messaggio
  Ale21040
New Entry
New Entry

Registrato: 01/09/12 23:21
Messaggi: 4
Residenza: Caronno Varesino (VA)

Ciao Ragazzi, scutate se riesumo questo post ma cercando un pò in giro sul forum non ho trovato nulla Very Happy

Ho un problema... ho creato un indicatore personalizzato che attaccato al grafico fà esattamente il suo lavoro e ciò è bene .

Ho creato un EA per calcolare la barra corrente e la barra precedente di entrata ma non accade nulla .... il backtest non mi dà errori .... non entra e basta Shocked
definita la variabile double mau,maup;
creo
mau= iCustom(NULL,0,"Mauser",0,0);
maup= iCustom(NULL,0,"Mauser",1,1);

è giusto scriverle così?
ho provato anche con mau= iCustom(NULL,0,"Mauser",34,0,2,1,1); (valori su cui si basa l'indicatore personalizzato) ...
ma niente da fare ... nessun errore ma non apre operazioni Crying or Very sad

mi sapreste consigliare?

Grazie
Ale
Profilo Invia messaggio privato
Nuovo argomento   Rispondi    Indice del forum » Metatrader - Expert Advisor - MQL

Pagina 1 di 1
Tutti i fusi orari sono GMT + 2 ore

Mostra prima i messaggi di:

  

Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi
c d
e

CI SIAMO TRASFERITI QUI: http://forum.forexup.biz





Powered by phpBB © 2001, 2002 phpBB Group phpbb.it
Macinscott 2 by Scott Stubblefield


Abuse - Segnalazione abuso - Utilizzando questo sito si accettano le norme di TOS & Privacy.
Powered by forumup.it forum gratis free, crea il tuo forum gratis free ora! Created by Hyarbor & Qooqoa
Confirmed

Page generation time: 0.256