Mt4 Fine del supporto. - pagina 26

 

Chiunque apprezzi la mia soluzione, mi scriva di persona. Lo perfezionerò e lo darò via.

Buona fortuna a tutti.

 
Реter Konow:

Un ciclo di simboli, il controllo dell'apertura di una nuova barra quando arriva una quotazione e così via possono essere facilmente aggiunti alla mia soluzione. E cosa c'entra l'OOP?

Avete scelto un esempio sbagliato. Pensate a qualcos'altro a vostro piacimento.

E tu lo fai. Dato che i personaggi possono cambiare - dopo tutto, è vero quando si leggono i personaggi.

 
Artyom Trishkin:

Fallo. Dato che i personaggi possono cambiare - perché quando si leggono i personaggi è vero.


Beh, e se lo facessi? Che cosa dice allora? Vi dirò un segreto: per me, questo tipo di compito è un gioco da ragazzi. Pensi davvero che non possa farlo? Questo è semplicemente ingenuo...

 
Реter Konow:

Beh, e se lo facessi? Che cosa dice allora? Vi dirò un segreto: per me, questo tipo di compito è un gioco da ragazzi. Pensi davvero che non possa farlo? Questo è semplicemente ingenuo...

Beh, fatelo già.

 
Vitaly Muzichenko:

Artyom non ha risposto alla domanda, ma la domanda è questa: scrivere in stile procedurale, in modo che funzioni correttamente

Senza dubbio. Hedge per salvare il confronto delle operazioni di stringa, beh, se il cliente è un maniaco e farà trading su tutti i simboli contemporaneamente.

Ma sembra che non ci sia nessun altro posto dove salvare le operazioni e la memoria - tutto è minimo

void OnTimer(){

   Alert(Fn_new_bar("EURUSD", PERIOD_D1)); }

//+------------------------------------------------------------------+

uint Sp_Adler32(string line){

   ulong s1 = 1;

   ulong s2 = 0;

   uint buflength=StringLen(line);

   uchar char_array[];

   ArrayResize(char_array, buflength,0);

   StringToCharArray(line, char_array, 0, -1, CP_ACP);

   for (uint n=0; n<buflength; n++){

      s1 = (s1 + char_array[n]) % 65521;

      s2 = (s2 + s1)     % 65521;}

   return ((s2 << 16) + s1);}

//+------------------------------------------------------------------+

bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf){

   static datetime st_time[]; 

   static uint     st_id[];

   

   //---- set

   datetime new_time = iTime(symb, tf, 0);     if(new_time==0) return(false); 

   uint     new_id   = Sp_Adler32(StringConcatenate(symb,EnumToString(tf))); 

   datetime old_time = 0; 

   uint     old_id   = 0;

   

   //---- find

   int size = ArraySize(st_time); 

   for(int i=0; i<size; i++){

      if(st_id[i]!=new_id) continue; 

      old_id   = st_id  [i]; 

      old_time = st_time[i];

      break;}

   

   //----add new element

   if(old_time==0){

      ArrayResize(st_time, size+1); st_time[size]=new_time;

      ArrayResize(st_id,   size+1); st_id  [size]=new_id; }

   

   //----

   return(old_time>0 && old_time<new_time);}


 
Реter Konow:

Mi scuso per il leggero ritardo.

Ecco la prima versione della funzione. Potete raffinarlo e svilupparlo ulteriormente. Se notate un errore, per favore date i vostri commenti.


Il punto non è nell'OOP ma nel fatto che il tuo codice è lineare, anche se probabilmente non lo imparerai mai...

 
Galina Bobro:

Nessun problema. Hedge per salvare il confronto delle operazioni sulle stringhe, beh, se il cliente è un maniaco e scambierà su tutti i caratteri contemporaneamente.

Ma sembra che non ci sia nessun altro posto dove salvare le operazioni e la memoria - tutto è minimo.


Forum sul trading, sistemi di trading automatico e test di strategia

Mt4 Fine del supporto.

Artyom Trishkin, 2017.09.10 23:21

Avevo un obiettivo per il risultato finale del suo codice in stile procedurale per lavorare in un tale ciclo:

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Artyom Trishkin:


Chiamato male per abitudine -bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf) è la funzione giusta.

 
Artyom Trishkin:

Bene, fallo ora.


OK. La tua soluzione funziona solo sulle zecche. Il mio è su un timer. Pensate che il mio metodo di cronometraggio con le apparizioni delle barre abbia un inconveniente. Ok. Che sia così. Aggiungerò un controllo per l'arrivo di una citazione prima di impostare una nuova bandiera a barre. Aggiungerò un altro parametro alla funzione - un simbolo. L'utente sceglierà il simbolo con cui vuole ricevere l'evento della nuova barra e lo invierà alla funzione. La funzione controllerà il tempo dell'ultima citazione di questo simbolo. Poi confronteremo l'ora dell'apparizione formale della barra e l'ora della quotazione e imposteremo il flag dell'evento.

Ho appena iniziato a studiare questo argomento, ma non vedo alcuna difficoltà.

 
Galina Bobro:

Non si tratta di OOP, si tratta che il tuo codice sia lineare, anche se non si può mai sapere...

Lineare, non lineare... Stai parlando di nuovo dell'opera nella programmazione?
Motivazione: