Mt4 Fine del supporto. - pagina 25

 
Artyom Trishkin:

Dovete solo scrivere una funzione in cui l'utente chiede: "C'è una nuova barra sulla M5?" e ottiene una risposta sì/no.

Per esempio:

Ecco la vostra funzione IsNewBar() e la svilupperemo e la torceremo/rovesceremo ulteriormente con un'ulteriore estensione del compito


Mi sembra che questo non sia un buon esempio per dimostrare l'utilità dell'OOP.
Ecco, per esempio, una variante che usa solo una funzione:

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   IsNewBar(0,false); // режим сбора информации
   if(IsNewBar()) Print("Пришел новый бар текущего ТФ");  // режим считывания информации
   if(IsNewBar(PERIOD_H4)) Print("Пришел новый бар H4");  // режим считывания информации
   if(IsNewBar(PERIOD_D1)) Print("Пришел новый бар D1");  // режим считывания информации
   
  }
bool IsNewBar(ENUM_TIMEFRAMES tf=PERIOD_CURRENT,bool out=true)
  {
   static const ENUM_TIMEFRAMES TF[22]=
     {
      PERIOD_CURRENT,PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
     };
   static bool newbar[22];
   static bool FirstTime=true;
   static int acb[22]; // array of current bars
   if(FirstTime)
     {
      for(int i=0;i<22;i++) acb[i]=Bars(Symbol(),TF[i]);
      FirstTime=false;
      return(false);
     }
   int curtf=0;
   while(TF[curtf]!=tf) curtf++;
   if(out) return (newbar[curtf]);
   for(int i=0;i<22;i++)
     {
      int CurBars=Bars(Symbol(),TF[i]);
      if(acb[i]<CurBars)
        {
         acb[i]=CurBars;
         newbar[i]=true;
        }
      else newbar[i]=false;
     }
   return(false);
  }

potete ovviamente rimuoverlo daOnTick e inserirlo inOnTimer

 
Реter Konow:

Riguardo a questa domanda, penso che vi sbagliate. Si prega di controllare con il Service Desk. Lasciamo che rispondano alla domanda: se si formano nuove barre nella piattaforma indipendentemente dall'arrivo delle quotazioni, oppure no. Se no, allora in caso di una nuova barra controlla se c'era una citazione su di essa. Se lo era, il nuovo bar è stato formato. Possiamo farlo in questo modo. Non c'è bisogno di cambiare molto.

Oh mamma mia... Leggete già le informazioni. Sono molto sorpreso che tu non lo sappia, e quando te lo dicono, ne dubiti anche tu. Non guarderò nemmeno nella direzione del Service Desk per domande così infantili - ti rideranno in faccia. Allora chiediglielo tu stesso - hai un link a servicedesk nel tuo profilo.
 
Nikolai Semko:

Mi sembra che questo non sia un buon esempio per dimostrare l'utilità dell'OOP.
Ecco, per esempio, una variante che usa solo una funzione:

è possibile, naturalmente, rimuoverlo daOnTick e inserirlo inOnTimer

Non ho guardato la logica, beh, supponiamo che ipoteticamente funzioni correttamente.

E da qualche personaggio a caso?

Immaginate che il programma usi una lista di simboli dalla finestra Market Overview, e che l'utente possa cambiare i set di simboli in qualsiasi momento.

 
Personalmente non ho visto il codice OOP di @Nikolai Semko.


Con rispetto.

 

Artyom è un po' indietro con la sua domanda, ma la domanda è questa: scrivetelo in stile procedurale in modo che funzioni correttamente

void OnTick()
 {
 
  if(IsNewBar("AUDCAD",PERIOD_H1)) {
   // задача №1
  }
 
  if(IsNewBar("GBPJPY",PERIOD_M15)) {
   // задача №2
  }
 
  if(IsNewBar("EURUSD",PERIOD_H4)) {
   // задача №3
  }

 }

// Функция "Новый бар"
bool IsNewBar(....) {
 здесь код, который нужно написать
}
 
Реter Konow:

Sì, con un timer. Appare una nuova barra senza citazione. Ci interessa esattamente l'evento dell'apparizione della barra, mentre possiamo fissare la citazione in Optisk();

Una barra apparirà in ogni caso.


Qui abbiamo la spiegazione delle barre:

L'ora di apertura della barra Time[i] di solito non corrisponde all'ora di arrivo del tick. Il tempo di apertura di una barra per qualsiasi timeframe è sempre un multiplo del timeframe. Ogni primo tick che si verifica all'interno del timeframe è una barra che si forma; se nessun tick è arrivato all'interno del timeframe, non si formerà nessuna barra neanche in questo timeframe.

 
Vitaly Muzichenko:

Artyom non ha veramente coperto la questione, ma la domanda è questa: scrivetelo in stile procedurale, in modo che funzioni correttamente

Ho voluto aggiungere gradualmente dei compiti per rendere veloce, conveniente, facile e semplice per le persone l'attuazione del compito. Per mostrare più tardi come si fa facilmente usando OOP.

Ma lo stesso principale respingente di OOP si è allontanato dalla soluzione del problema :)

 
Artyom Trishkin:

Ho voluto aggiungere gradualmente dei compiti per rendere veloce, conveniente, facile e semplice per le persone l'attuazione del compito. Per mostrare poi quanto sia facile farlo con OOP.

Ma lo stesso principale rifiutatore di OOP ha rifiutato la soluzione del compito :)

Sì, non l'ho detto esattamente io, parafraserò:

Artem non ha aperto un po' la questione, e la questione è questa: scrivere in stile procedurale che funzioni correttamente

Forse tornerà e dimostrerà che è molto facile e semplice

 
Vitaly Muzichenko:

Non l'ho proprio detto io, quindi lo riformulo:

Artyom non ha veramente coperto la domanda, e la domanda è questa: scrivere in stile procedurale, in modo che funzioni correttamente

Forse tornerà e dimostrerà che è molto facile e semplice.

Avevo l'obiettivo di far funzionare il suo codice in stile procedurale in un tale ciclo alla fine:

   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:

Avevo l'obiettivo che il risultato finale sarebbe stato che il suo codice in stile procedurale avrebbe funzionato in un tale ciclo:

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

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