Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1087

 
rabanik:
Buon pomeriggio. Per favore aiutatemi a scrivere il seguente codice, per un EA. Voglio fare attraverso un array (se avete un'opzione migliore, per favore aiutatemi). In generale, l'EA invia messaggi, ma voglio che li invii attraverso un array (temporaneo). Cioè quando inizia l'invio del messaggio, l'Expert Advisor controlla se il messaggio è stato inviato in precedenza (controlla se il messaggio è memorizzato nell'array), se no, invia il messaggio, se il messaggio viene trovato, allora l'invio viene omesso. Spero che sia chiaro) Grazie mille!

Sei sicuro della dichiarazione del problema?

Semplicemente, ci sono delle opzioni:

- Non ripetere l'ultimo messaggio

- per ignorare quello superato (viene impostato un certo intervallo di tempo), vale a dire che il messaggio deve essere ripetuto.

P.S. La prima variante è un caso speciale della seconda, ma è molto più facile da implementare. La tua definizione del problema è anche un caso speciale della seconda variante con ritardo infinito.

Se vi interessa, ecco la soluzione del vostro problema.

Definiamo due array: uno di testo, che memorizza i messaggi, e uno di indice, per la ricerca dei messaggi.

La matrice degli indici è di tipo int. Nella prima dimensione scriviamo il checksum del messaggio di testo. Nel secondo - il numero di riga del primo array. Una matrice di indici è ordinata per la prima dimensione.

Riceviamo un nuovo messaggio. Leggi il suo checksum. Usando la funzione ArrayBsearch() trovate tale messaggio. Se non viene trovato, allora il messaggio è originale. Aggiungilo all'array di messaggi e, checksum con riferimento all'array di indici, ricordando di ordinarlo.

Quali sono le opzioni per il checksum? Io prenderei questo: prenderei in considerazione il numero di caratteri e il checksum del testo. Il checksum del testo, per esempio, è la somma dei codici dei caratteri. Date le recenti modifiche, non può superare 65 536*256. Cioè, il checksum del messaggio può apparire come segue:

il numero di caratteri moltiplicato per 10 milioni e aggiungere il checksum del testo.

 

pro! c'è un problema con la linea sull'angolo.

Ho costruito unTRENDBYANGLE usando le coordinate.

ObjectCreate(0,"anglestok",OBJ_TRENDBYANGLE,0,0,0);
ObjectSet("anglestok",OBJPROP_TIME1,X1); ObjectSet("anglestok",OBJPROP_PRICE1,Y1);
ObjectSet("anglestok",OBJPROP_TIME2,X2); ObjectSet("anglestok",OBJPROP_PRICE2,Y2);

- Ho bisogno di un angolo.

anglestok= ObjectGetDouble(0,"anglestok",OBJPROP_ANGLE);

aiuto dice che la linea creata dal programma - l'angolo di ZERO è ok.

Ho eseguito lo stesso codice di nuovo alle stesse coordinate senza toccare la linea - appare il numero corretto di gradi, non zero. perché, come posso farlo bene la prima volta?

o ho dato una coordinata - chiedo l'angolo - dice 0. poi ne do un'altra - dice l'angolo delle coordinate precedenti. senza senso

 
In quali casi mettono const dopo la descrizione della firma della funzione? Non riesco a trovare nessuna informazione su questo.
void qwe(int abc) const {...}
 
Non riesco a trovare nessuna persona veramente competente qui, mi sono appena iscritto per niente =/
 
K_i_r_i_t_o:
Ho spostato questo commento all'inizio perché nessuno ha risposto, ma ne ho davvero bisogno =/
È possibile implementare questo:se premo un tasto qualsiasi, una parte del codice dell'indicatore si accende (responsabile della creazione di un oggetto con un clic del mouse), poi se si verifica un evento (la seconda parte del codice, l'evento può essere, creando lo stesso oggetto per esempio), allora la prima parte del codice si disattiva (e se non lo faccio, l'oggetto viene creato da ogni clic), e viene eseguito anche quando si preme il tasto, e così via intorno)
È possibile. Aggiungere il blocco OnChartEvent. In esso, tieni traccia delle pressioni necessarie, delle misure e descrivi la reazione ad esse secondo la tua idea.
 
SunnYtheDreamer:
È possibile. Aggiungere il blocco OnChartEvent. In esso, tieni traccia delle pressioni necessarie, delle misure e descrivi la reazione ad esse, secondo la tua idea.
Implementare la disabilitazione di parte del codice per il periodo di tempo prima di premere il tasto è impossibile =/ C'è una variante più semplice, ma c'è un problema,quando si preme il tastodevoriportare il suo valore all'inizio della prima istruzione if
#define  VK_D 0x44
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam) // параметр события типа string 
{ 
 Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);

int      y     =(int)dparam;
datetime dt    =0;
double   price =0;  
int      window=0;
int i;
int x=(int)lparam;

if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

if(id==CHARTEVENT_KEYDOWN) 
{ switch(int(lparam)) 
{ case VK_D:
i=rand();
}}}}
 
K_i_r_i_t_o:
Non posso implementare la disabilitazione di una parte del codice per il periodo prima della pressione del tasto =/ C'è un modo più semplice, ma c'è un problema:ho bisogno diriportare il suo valore all'inizio della prima istruzione if quando il tasto viene premuto.
if (id==CHARTEVENT_CLICK)
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

   if(id==CHARTEVENT_KEYDOWN) 
   {
      switch(int(lparam)) 
      {
         case VK_D: i=rand();
      }
   }
}
Questo codice sarà eseguito solo se il mouse viene cliccato. In questo caso, dopo 3 righe di codice, viene controllato l'evento della pressione del tasto. E queste 3 linee di codice vengono eseguite in pochi millisecondi, e anche se l'id durante la chiamata corrente OnChartEvent è in grado di cambiare, la possibilità che durante l'esecuzione di 3 linee di codice, il tasto venga premuto = 0%. Ovviamente, è inutile controllare l'id, all'interno di un blocco che si attiva ad un certo valore di id, e aspettare lì un valore diverso. Per prima cosa, controllate la pressione del tasto, in un blocco separato, salvate in una variabile il numero del tasto o semplicemente il fatto di premere il tasto desiderato. E con questa variabile, attivate o disattivate il pezzo di codice situato nel blocco per il clic del mouse.
char key = -1; //эта переменная должна быть объявлена за пределами блока OnCharEvent
if(id==CHARTEVENT_KEYDOWN)
key = lparam;

if (id==CHARTEVENT_CLICK && key == 'D')
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
   i=rand();
   key = -1;
}
 
SunnYtheDreamer:
Questo codice verrà eseguito solo se il mouse viene cliccato, con 3 linee di codice che controllano l'evento della pressione di un tasto. E queste 3 righe di codice vengono eseguite in pochi millisecondi, e anche se id durante la chiamata corrente OnChartEvent è in grado di cambiare, la possibilità che durante il tempo, esecuzione di 3 righe di codice, il tasto sarà premuto = 0%. Ovviamente, è inutile controllare l'id, all'interno di un blocco che si attiva ad un certo valore di id, e aspettare lì un valore diverso. In primo luogo, controllate la pressione del tasto, in un blocco separato, salvate in una variabile il numero del tasto o semplicemente il fatto di premere il tasto desiderato. E con questa variabile, attivate o disattivate il pezzo di codice situato nel blocco per il clic del mouse.

Grazie mille!) Questa è la linea che stavo cercando if (id==CHARTEVENT_CLICK && key == 'D'), non poteva collegare due eventi, questo non funzionava if (id==CHARTEVENT_CLICK & id==CHARTEVENT_KEYDOWN) Grazie mille ancora)

 

Ciao, ho una funzione che calcola la dimensione media di una candela dalle ultime n candele. a volte emette i seguenti valori: "5e-05.0". non ne ho bisogno, per mia vergogna non so quanto siano e come tagliarli. NormalizeDouble() non aiuta. per favore ditemi come calcolare tali numeri programmaticamente per tagliarli

 
pycha:

Ciao, ho una funzione che calcola la dimensione media di una candela dalle ultime n candele. a volte emette i seguenti valori: "5e-05.0". non ne ho bisogno, per mia vergogna non so quantitativamente quanti e come tagliarli. NormalizeDouble() non aiuta. per favore ditemi come calcolare tali numeri programmaticamente per tagliarli


5e-05 (5*10 alla -5° potenza) = 0,00005.
Cosa tagliare, allora:
if(val >= 0.00001)
Candele così piccole, 5 pips, solo a bassa latitudine, in un conto a 5 cifre, su timeframe bassi possono verificarsi. Se non avete a che fare con lo scalping, ma la media è a volte così piccola per n candele, allora l'implementazione della funzione dovrebbe essere sospetta.