Indicatore Domanda - pagina 4

 
SDC:

O forse qualcosa del genere?

dovresti davvero usare IndicatorCounted(), perché se lo fai così il tuo indicatore sta ridisegnando tutti quegli oggetti ad ogni nuovo tick invece di disegnarli tutti una sola volta e aggiungerne di nuovi quando si formano nuove barre

Questo e l'altro tuo post sui bool esterni mi danno anche altre idee, grazie

La mia attenzione deve essere più ampia, ma poiché sono NooB tendo a concentrarmi su una parte del codice e a trascurarne altre come gli esterni.
Sto entrando solo ora negli array e ho avuto un'enorme lotta per capire i buffer, ma sto iniziando a superarli di recente.

Grazie, questo mi darà un sacco di nuove idee.
 
SDC:


Devi considerare cosa stai facendo, quando crei un indicatore stai applicando il tuo codice ad ogni singola barra del grafico, questo significa che hai bisogno di ottenere il valore dell'indicatore macd come era per ognuna di quelle barre storiche.

nel tuo codice originale che hai fatto:

l'ultimo parametro 1 è il valore del macd come era alla barra 1 del grafico, la barra precedente a quella attuale che è indicizzata come barra 0

Ovviamente non vuoi usare quel singolo valore del macd nel tuo operatore condizionale su tutto il grafico storico.

Devi indicizzare il macd allo stesso indice di barra di ogni barra, quindi per esempio alla barra 500 hai bisogno di questo

l'ultimo parametro deve cambiare per corrispondere al numero della barra a cui il tuo indicatore sta applicando i suoi algoritmi.

Questo è il motivo per cui ne hai bisogno all'interno del ciclo, così puoi usare l'iteratore del ciclo del ciclo per l'ultimo parametro e quindi ottieni il tuo valore macd come era per ogni barra del grafico storico.

Spero che questo aiuti a chiarire un po' le cose.

Giusto, l'avevo capito.

Tuttavia, quando si aggiungono i codici come if(val1 > 0 && faster > slower) questo non funziona quando si dichiarano faster e slower al di fuori del ciclo.

AHHHHH Capisco, quindi perché lo spostamento è (i), allora ne ho bisogno all'interno del ciclo OOOOPPPS LOL
 
Agent86:
Perché for(int i = Bars-1 ? <----------------------- Le barre sono indicizzate proprio come gli array, la prima barra=0, invece di 1. Quindi l'ultima barra è Bars-1;

E perché questo è meglio di for(int i = Bars ?? <----- vedi sopra.

Si prega di consigliare grazie


Inoltre:

Presumo che questo sia vero per tutti, e non solo per gli indicatori / indicatori personalizzati?<--- quello di cui io e WHRoeder: abbiamo discusso sono questioni piuttosto generali. Niente di specifico. Stavamo solo parlando tra di noi della dichiarazione delle variabili e delle loro assegnazioni, ecc, con i loop.

 
diostar:

Inoltre:


for(int i=Bars; i>=0; i--) è il codice che ho usato

for(int i=Bars-1; i>=0: i--) è suggerito

Pensavo che Bars = numero di barre nel grafico corrente ? almeno secondo il dizionario.

Quindi --i ho pensato che stesse contando alla rovescia dal numero di barra più alto come 1002 o qualcosa del genere e contando --i fino a -1
Perché mentre i>=0 dovrebbe contare fino a -1 prima di diventare falso. Se fosse 0 o maggiore sarebbe vero e loop un'ultima volta fino a raggiungere -1

Almeno questo è il modo in cui pensavo che funzionasse? Mi sbaglio?

Se i=0 e ++i e contato su allora pensavo che avrebbe contato fino alla fine all'ultima barra.

Ma in questo caso Bars-1 che dici non sarebbe in realtà tutte le barre chiuse ma in realtà include la barra[0] che non è ancora chiusa o qualcosa del genere?

Non sono sicuro di capire la differenza tra Bars-1 e Bars. Ha qualcosa a che fare con l'attuale barra 0 che non viene contata quando ci si riferisce semplicemente a Bars?

Per favore consigliatemi grazie


 

sì, perché hai una barra 0, quindi Bars ti dà il conteggio delle barre nel grafico, compresa la barra 0

quindi considera un grafico piccolo, ci sono solo 2 barre nel grafico, bar[0] e bar[1]

Bars ti dà il conteggio quindi Bars == 2

se volete applicare il vostro indicatore per iniziare dall'ultima barra del grafico

Potreste provare i=Bars.

Come sappiamo, Bars = 2 ma non c'è nessuna barra indicizzata come bar[2] l'ultima barra è Bar[1]

quindi dovete fare i=Bars-1

 
Agent86:
for(int i=Bars; i>=0; i--) è il codice che ho usato<--- diciamo, per es. Close[i], questo conta da close[Bars] fino a close[0]. Quando i=Barre, esiste close[i]?

for(int i=Bars-1; i>=0: i--) è suggerito<--- diciamo, per es. Close[i], questo conta da close[Bars-1] fino a close[0]. Quando i=Bars-1, esiste close[i]?

Pensavo che Bars = numero di barre nel grafico corrente ? almeno secondo il dizionario. <---ok

Così --i ho pensato che stesse contando in giù dal numero della barra più alta come 1002 o qualcosa del genere e contando --i in giù fino a -1 Esiste close[1002], close[-1]?
Perché mentre i>=0 quindi dovrebbe contare fino a -1 prima di diventare falso. Se fosse 0 o maggiore sarebbe vero e andrebbe in loop un'ultima volta fino a raggiungere -1 <---- a close[-1], restituisce 0. Non falso

Almeno questo è il modo in cui pensavo che funzionasse? Mi sbaglio? <--- vedi sotto ref.

Se i=0 e ++i e contato su allora pensavo che avrebbe contato fino alla fine dell'ultima barra <--- lo farà obbedientemente.

Ma in questo caso Bars-1 che dici non sarebbe in realtà tutte le barre di chiusura ma in realtà include la barra[0] che non è ancora chiusa o qualcosa del genere? <---in questo caso, il prezzo di chiusura restituirà l'attuale prezzo Bid tick

Non sono davvero sicuro di capire la differenza tra Bars-1 e Bars. Ha qualcosa a che fare con l'attuale barra 0 che non viene contata quando ci si riferisce semplicemente a Bars? <--- vedi sotto ref

Si prega di consigliare Grazie di cuore





doppio Close[]
Array di serie che contiene i prezzi di chiusura per ogni barra del grafico corrente.

Gli elementi dell'array di serie sono indicizzati in ordine inverso, cioè dall'ultima alla prima. La barra corrente che è l'ultima nell'array è indicizzata come 0. La barra più vecchia, la prima nel grafico, è indicizzata come Bars-1.
 
Capisco, per qualche ragione pensavo che il buffer gestisse questo argomento un po' diversamente, perché tecnicamente non ho nemmeno dichiarato il numero di elementi nell'array, quindi pensavo che il buffer lo risolvesse già.

Comunque ho capito questo e ha senso, grazie

 
Agent86:
Capisco, per qualche motivo pensavo che il buffer gestisse questo argomento in modo un po' diverso, perché tecnicamente non ho nemmeno dichiarato il numero di elementi dell'array, quindi ho pensato che il buffer avesse già risolto questo problema.

Comunque ho capito questo e ha senso, grazie



Cosa? Non avevo capito che ti riferivi a tutto questo ai buffer indicatori. Ora che lo so, leggi questi riferimenti presi da: https://www.mql5.com/en/articles/1500

(1) buffer di indicatori & array utente - sono entrambi uguali e DIVERSI. & Il motivo per cui i buffer di indicatori non sono dimensionati dall'utente, non ha niente a che fare con il fatto che sia già stato elaborato:

double ExtMapBuffer1[];

Questo è un normale array. Ma la dimensionalità non è indicata e l'inizializzazione non viene eseguita. Questa matrice sarà in seguito impostata come buffer di dati.

(2) i buffer degli indicatori in uscita e in entrata (il buffer di dati di cui sopra) possono sembrare uguali, ma diversi.

SetIndexBuffer(0,ExtMapBuffer1);

Questa funzione "lega" un array a un numero di buffer. Cioè indica che il buffer con il numero indicato userà l'array indicato per immagazzinare dati. Quindi, cambiando gli elementi di questo array cambierete il valore del buffer. In realtà un array è un buffer di dati. Ilprimo argomento è il nome dell'array che deve essere legato.


Vedete, funziona tutto. Ora vediamo cosa fa il codice:

for(int i=0;i<Bars;i++)

Usiamo il ciclo for per passare attraverso tutti gli elementi del buffer di dati. Poiché ad ogni elemento del buffer corrisponde una certa barra, usiamo il ciclo, partendo dalla barra zero (l'ultima disponibile) e finendo con la prima disponibile, che è in successione una in meno della variabile Bars (perché contiamo le barre da zero).

{
   ExtMapBuffer1[i]=MathRand()%1001;
}

Ad ogni iterazione un contatore viene aumentato di uno, e ci spostiamo dall'ultima barra disponibile alla prima assegnando ad ogni elemento del buffer (che corrisponde ad una certa barra) un numero casuale da 0 a 1000. Se vi è difficile capire come un certo elemento del buffer corrisponde a una certa barra, provate a cambiare il ciclo nel modo seguente e vedete il risultato nel terminale:

for(int i=0;i<Bars;i++)
{
   ExtMapBuffer1[i]=i;
}



 
diostar:

doppio Chiudere[]
Array di serie che contiene i prezzi di chiusura per ogni barra del grafico corrente.

Gli elementi dell'array di serie sono indicizzati in ordine inverso, cioè dall'ultima alla prima. La barra corrente che è l'ultima nell'array è indicizzata come 0. La barra più vecchia, la prima nel grafico, è indicizzata come Bars-1.

Ok, penso di averlo capito ora, grazie
 
Grazie a tutti

Mentre imparo di più sugli indicatori sembra che il design che sto usando non sarebbe molto utile per l'uso in un EA ma solo forse buono per l'uso visivo e/o manuale.

Dal momento che il contatore conta alla rovescia 1-- sembrerebbe che utilizzando questo metodo non sarebbe buono per fare riferimento a qualsiasi oggetto array per l'uso nel trading a meno che forse mi riferisco solo a un particolare shift[i] nel qual caso dovrei capire come fare riferimento specificamente solo a quegli elementi dell'array che vorrei utilizzare per un segnale di trading situato solo a quelle particolari barre.

Usarlo così com'è causerebbe probabilmente il trading su tutto il grafico proprio come l'indicatore

Quindi ora immagino che dovrò imparare solo come fare riferimento a vari elementi dell'array in qualsiasi indicatore per fare riferimento a quei valori/tempi/barre ecc.

Grazie a tutti per l'aiuto, e questo mi darà molto da pensare su come potrei creare indicatori iCustom e renderli utili in un EA