Discussione sull’articolo "Creazione di un Expert Advisor, che fa Trading su una Serie di Strumenti" - pagina 3

 

6.Sembra che manchi:

TradePerformer( 4, Symb4, Trade4, StLoss4, TkProfit4, Lots4, Slippage4, UpSignal, DnSignal, UpStop, DnStop);

in Exp_TEMA.mq5 ?

 
ias:

6.Sembra che manchi

in Exp_TEMA.mq5?

Sì, devo aver lavorato troppo e mi sono surriscaldato con un caldo così anomalo!
 
Renat:

Si prega di creare un esempio riproducibile. Cioè, è necessario un codice già pronto che si possa compilare, inserire in un grafico e ottenere i risultati.

Senza questo, poche persone capiranno di cosa stiamo parlando.

Ho pensato di tagliare per non scoraggiare le persone per niente.

Ecco la versione completa:

#property indicator_separate_window    // L'indicatore viene disegnato in una finestra separata
#property indicator_buffers 1



#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName = "EURJPY";

//-- Array di indicatori
double ScreenBuffer[]; 

//-- Buffer dinamico --
double ArrayBuffer[];

int OnInit()                          // Funzione speciale init()
{
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   return 0;                          // Esci
}
//--------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
int Counted_bars;   // Numero di barre da azionare 
int copied;

//--------------------------------------------------------------------
   //1 input rates_total = 9667 / prev_calculated = 0 / Bars = 9667
   //-- allora rates_total = 9667 / prev_calculated = 9667 / Bars = 9667
   //-- in corso allora rates_total = 9668 / prev_calculated = 9667 / Bars = 9668
   //Stampa("rates_total: " + (stringa)rates_total);
   if (rates_total == prev_calculated) return (rates_total);//-- E' sempre lo stesso bar, quindi siamo fuori...

   //-- Ottenere il numero di barre non elaborate (al primo ingresso sono tutte, poi 1)
   //-- Il numero di barre di output si riferisce al grafico stesso, ma verrà emesso un altro strumento
   //-- il numero di barre può essere diverso, quindi prima scarichiamo tutti i dati nel buffer --
   Counted_bars = rates_total-prev_calculated;
   
   // Print("Barre contate: " + Barre contate);
   Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));
   //-- Allocare la memoria in base al numero di battute dello strumento principale --
   if (ArrayResize(ArrayBuffer, Counted_bars,0) == -1) return (rates_total);//-- Errore di allocazione della memoria --
   //--- inizializzare gli elementi dell'array con il valore EMPTY_VALUE ----
   ArrayInitialize(ArrayBuffer,EMPTY_VALUE);
         
   //-- Ottenere il numero di barre dello strumento --
   copied = (int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   
   if (copied > 0){
      copied=CopyClose(InstrumentName,0,0,copied,ArrayBuffer);//-- Scrivere i dati nel buffer di memoria --
      if (copied <= 0) return (rates_total);//-- errore
   } 
   else{

      return (rates_total);//-- errore 
   }
    
   if (Counted_bars > copied) Counted_bars = copied;//-- Prendere il valore più basso --

   Counted_bars--;//-- Dal momento che il conteggio parte da 0 --
   //-- I dati sono stati caricati nel buffer di memoria, ora vengono scritti nel buffer dello schermo da destra a sinistra --
   for (int i = Counted_bars; i > 0; i--){
      ScreenBuffer[i] = ArrayBuffer[i];
   }   
   
//--------------------------------------------------------------------
   return(rates_total);
}


void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0,0,-1);             // tutti gli oggetti del grafico vengono eliminati.
}
 

Cosa sto sbagliando, perché non posso visualizzare normalmente il grafico di un altro strumento?

In MQL4 funzionava tutto, qui funziona solo se lo si visualizza sullo stesso strumento, quindi non ci sono errori.

 
gisip:

Cosa sto sbagliando, perché non posso visualizzare normalmente il grafico di un altro strumento?

In MQL4 funzionava tutto, qui funziona solo se lo si visualizza sullo stesso strumento, quindi non ci sono errori.


Non sono sicuro della correttezza dell'implementazione e dell'algoritmo in generale, ma sulla base del codice e di ciò che sono riuscito a fare con esso, presumo che:

La stringa

// Print("Barre contate: " + Barre contate);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));

dovrebbe avere questo aspetto

// Print("Barre contate: " + Barre contate);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(InstrumentName,Period()));


Forse sarebbe più corretto cambiare il periodo ovunque come "0" in PERIOD_CURRENT.

Almeno a me ha funzionato tutto dopo queste modifiche.....

PS

Forse non è rilevante, ma in questo modo il compilatore conta molto meno

Print("rates_total: ",rates_total," / prev_calculated: ",prev_calculated," / Bars: ",Bars(InstrumentName, PERIOD_CURRENT));
 
Interesting:

Non sono sicuro dell'implementazione corretta e dell'algoritmo in generale, ma in base al codice e a ciò che sono riuscito a fare con esso, presumo che sia così:

La stringa

dovrebbe assomigliare a questa

PS

Forse sarebbe più corretto cambiare il periodo ovunque come "0" in PERIOD_CURRENT.

Almeno a me ha funzionato tutto dopo tali modifiche....

Modificato, non funziona ancora, il grafico non corrisponde alla realtà.
 

Sul mio schermo appare così:


Chiaramente sbagliato.
 

Ecco come si è rivelato per me

Ma poiché non ho approfondito la logica dell'induttore e la sua implementazione, non sta a me giudicare la correttezza dei risultati.


PS

Io eliminerei comunque il simbolo nel parametro e lo farei con il simbolo corrente e il TF, per poi usarlo in Expert Advisor o in un altro strumento usando il solito iCustom().

Inoltre, non capisco bene la logica del lavoro con i buffer (intendo la coda della calcolatrice e così via). Secondo me c'è molto da lavorare....

File:
proba.mq5  4 kb
 
Interesting:

Ecco cosa ho ottenuto

Ma poiché non ho approfondito la logica dell'induttore e la sua implementazione, non sta a me giudicare la correttezza dei risultati.


PS

Io mi sbarazzerei comunque del simbolo nel parametro e lo renderei conforme al simbolo e al TF attuali, per poi utilizzarlo in Expert Advisor o in qualsiasi altro strumento utilizzando il solito iCustom().


Grazie per il consiglio, lo proverò.
 

Interesting:

Inoltre, non capisco bene la logica di lavoro con i buffer (intendo la coda della calcolatrice e così via). Secondo me, c'è molto da lavorare....


Se ho capito bene, un buffer è sufficiente (basta che sia calcolato e disegnato correttamente sul grafico).

PS

E con la variante attuale ho l'impressione che l'induttore visualizzi i dati "a sinistra" (l'inizio della storia) invece che "a destra" (corrente)....

Oppure non capisco proprio nulla della logica di questo indicatore....