La tela è forte! - pagina 22

 
Nikolai Semko:

Nota, Peter, come ho implementato un multigradiente di 6 colori.

dove p cambia da 0 a 1.

uint Grad(double p)
  {
   static uint Col[6]={0xFFFF0000,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,0xFFFFFF00};
   p=p*5;
   int n=(int)p;
   if(n==5) return Col[5];
   double k=1-p+(int)p;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c2.c[0]+uchar(k*((int)c1.c[0]-(int)c2.c[0])+0.5),
               c2.c[1]+uchar(k*((int)c1.c[1]-(int)c2.c[1])+0.5),
               c2.c[2]+uchar(k*((int)c1.c[2]-(int)c2.c[2])+0.5));
  }

ZS Ma c'è un problema con il colore più esterno, che non sono ancora riuscito a risolvere.

Molto originale. ) p è un numero utente arbitrario o è legato a qualche parametro?

A cosa serve questo?

p=p*5;

Dopo questa linea p non ritorna al valore iniziale.

Qui:

double k=1-p+(int)p;

si può scrivere:

double k=1-p+n;

e perché non usate invece di

int n=(int)p;
int n=MathRound(p);

?

La funzione ARGB è una funzione standard di CCanvas o è tua?

 
Nikolai Semko:

C'è però un difetto nel colore più esterno, che non è ancora stato risolto.

Riparato:

uint Grad(double p)
  {
   static uint Col[6]={0xFF0000FF,0xFFFF00FF,0xFFFF0000,0xFFFFFF00,0xFF00FF00,0xFF00FFFF};
   if(p>0.9999) return Col[5];
   if(p<0.0001) return Col[0];
   p=p*5;
   int n=(int)p;
   double k=p-n;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c1.c[2]+uchar(k*(c2.c[2]-c1.c[2])+0.5),
                   c1.c[1]+uchar(k*(c2.c[1]-c1.c[1])+0.5),
                   c1.c[0]+uchar(k*(c2.c[0]-c1.c[0])+0.5));
  }

Il codice qui sopra è stato corretto.

 
Реter Konow:

La funzione ARGB è una funzione interna di CCanvas o è tua?

ARGB è una definizione di CCanvas. Per scoprirlo, si clicca il puntatore del mouse sul nome e si preme Alt+G

ReTag Konow:

A cosa serve questo?

5 è il numero di colori -1

 
Реter Konow:

e perché non lo usate al posto di

Quando non ho bisogno del doppio, preferisco questa opzione perché è molto più veloce.
 
Nikolai Semko:

ARGB è una definizione di CCanvas. Per scoprirlo, premi il puntatore del mouse sul nome e premi Alt+G

5 è il numero di colori -1

Ok. Non stavo criticando, stavo solo chiedendo. Sei bravissimo a lavorare con il colore.

 
Реter Konow:

Sei bravissimo con i colori.

È solo un hobby :)
 
Artyom Trishkin:

Sono d'accordo. Ma c'è una categoria di utenti che ne ha bisogno in modo diverso.

E cosa succede se i dati restituiti dall'indicatore kanvas superano i 512? I buffer non aiutano in questo caso. E gli utenti vogliono solo ricevere dati dagli indicatori nei loro programmi. E non vogliono incorporarli nel corpo dell'Expert Advisor (risparmierò un gufo - lasciatelo volare senza sonagli nel ...). E vogliono ricevere dati su qualsiasi barra richiesta, non solo su quelle visibili. E questo è giustificato. Ed è giustificato non solo dalla pigrizia e dal desiderio di avere tutto facile e semplice, ma anche dalle esigenze del TS.

Nikolai Semko:

Se stiamo parlando della grande maggioranza degli utenti che non sono programmatori, hanno bisogno o del gufo o dell'indicatore. Non hanno bisogno di un indicatore per il gufo.

Ho solo dato alcune informazioni su cui riflettere, non sto imponendo nulla. Lasciate che i programmatori decidano da soli cosa è conveniente e cosa no. Tuttavia, personalmente non credo che userò la funzione iCustom nei miei EA.

Forse non ho capito bene.

È logico supporre che un utente che ha comprato o scaricato un tale indicatore canvas bufferless dal mercato vorrà utilizzare i suoi dati nel suo EA.

Allora il più ragionevole per me sarebbe lo scambio attraverso una struttura appositamente creata dal produttore di questo indicatore, che viene letto attraverso una risorsa.

Il programmatore dovrebbe fare attenzione nel suo indicatore kanoval bufferless che questa struttura sia mantenuta nella risorsa aggiornata, e fornire all'utente l'inclu-file, in cui questa struttura è letta utilizzando gli eventi degli utenti o all'arrivo di ogni tick (non è ragionevole utilizzare il timer, credo).

E l'utente dovrebbe solo includere una linea di codice #include... e poi questa struttura sarà sempre disponibile con i dati reali dell'indicatore.

Sai, sarebbe più comodo dell'uso classico di iCustom, perché questa struttura può contenere comodamente variabili con nome e array di dati di diversi tipi (non solo di tipo doppio, come nei buffer dell'indicatore classico).

Sono abbastanza sicuro che le risorse di MQ sono implementate nello stesso modo dei buffer dell'indicatore.

 
Nikolai Semko:

Credo di non aver capito bene.

È abbastanza logico supporre che un utente che ha comprato o scaricato un tale indicatore canva dal mercato vorrà utilizzare i suoi dati nel suo EA.

In questo caso, il più ragionevole per me sarebbe lo scambio attraverso una struttura appositamente creata dal produttore di questo indicatore, che viene letto attraverso una risorsa.

Il programmatore dovrebbe fare attenzione nel suo indicatore canva bufferless che questa struttura sia mantenuta nella risorsa aggiornata, e fornire all'utente l'inclu-file che legge questa struttura utilizzando gli eventi utente.

E l'utente dovrebbe solo includere una linea di codice #include... e questa struttura sarà sempre disponibile con i dati reali dell'indicatore.

Penso che sia ancora più conveniente dell'uso classico di iCustom perché può contenere variabili e array di dati dal nome conveniente e l'utente non dovrà preoccuparsi del significato del numero di buffer e includere solo una linea di codice nel suo programma per avere un accesso completo e conveniente ai dati dell'indicatore.

Sono abbastanza sicuro che le risorse dell'MQ sono implementate nello stesso modo dei buffer degli indicatori.

Il meccanismo di trasferimento dei dati attraverso la risorsa stessa è estremamente semplice. Si tratta piuttosto del metodo di "comunicazione" tra i due programmi. Un programma scrive, l'altro programma legge. Quindi, il programma che scrive dati (indicatore) nella risorsa deve aderire al formato di messaggio specificato e il programma che legge deve "conoscere" questo formato. Allora la comunicazione tra i programmi sarà universale ed efficiente.

 
Реter Konow:

Il meccanismo di trasferimento dei dati attraverso la risorsa stessa è estremamente semplice. Si tratta piuttosto del metodo di "comunicazione" tra i due programmi. Un programma scrive e l'altro legge. Di conseguenza, il programma che scrive i suoi dati (indicatore) nella risorsa deve aderire al formato del messaggio, e il programma che legge deve "conoscere" questo formato. Allora la comunicazione sarà universale e applicabile.

Certo che lo farà. Dopo tutto, la parte di ricezione e trasmissione è fatta dall'unico sviluppatore che ha progettato l'indicatore stesso.

Il meccanismo di condivisione tramite una risorsa non è così semplice. Richiede certe abilità. Questo è quello che vedo come un vantaggio di questo metodo, perché sarà un privilegio per i programmatori più avanzati.

ZS Peter, un mese fa non ti sembrava che fosse estremamente semplice e necessario. Mi fa piacere che tu abbia sentito e capito il mio messaggio. :))

 
Nikolai Semko:

Beh, certo che lo farà. Dopo tutto, la parte di ricezione e trasmissione è fatta da un solo sviluppatore, che ha sviluppato lui stesso questo indicatore.

Il meccanismo di scambio attraverso la risorsa non è così semplice. Richiede certe abilità. Questo è quello che vedo come un vantaggio di questo metodo, perché sarà un privilegio per i programmatori più avanzati.

ZS Peter, un mese fa non ti sembrava che fosse estremamente semplice e necessario. Mi fa piacere che tu abbia sentito e capito il mio messaggio. :))

Sì, Nikolai, le risorse si sono rivelate un metodo molto efficace per scambiare dati tra programmi, e il loro uso si basa sulle unioni di cui mi hai parlato (e anche Vasiliy). Quindi, grazie a entrambi).

Il meccanismo stesso di trasferire dati in una risorsa e leggere da essa, è abbastanza semplice, ma il formato del messaggio è una questione complicata se si cerca l'universalità. Se risolviamo il problema per un indicatore particolare, tutto è semplice.

Motivazione: