[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 285

 
gyfto:

Giusto. Credo di aver finito. Ecco il raccoglitore di zecche rielaborato con il suo impacchettamento in seconde candele.

Lo era:

Diventato:

Commenti sul codice.

1. Non ha fatto lo switch-case nella selezione delle candele virtuali per risparmiare tempo di CPU, invece ha commentato le sezioni con la selezione (dato che la selezione viene fatta per esigenze specifiche una volta prima della compilazione).

2. Sul lavoro con l'ora locale (off-line che è) non portato alla mente. Nel ciclo"while(time==TimeLocal()){//fino a quando è passato un secondo", sospetto che ci debba essereMarketInfo in FileWriteDouble (mi sembra il top di un idiota). Se mi dici cosa sembrerebbe più logico lì, te ne sarò grato.

3. Un costrutto d'autore

L'ho dichiarato alla fine di init().

4. All'inizio di init() gli array dinamici

al posto delle variabili usate.

5. Per l'ottimizzazione, potete teoricamente usare le funzioni di file WinAPI e scrivere nella cronologia in una volta sola in un blocco di 44 byte (lunghezza della struttura MarketInfo o qualunque cosa sia in .hst).

6. Completamente rimossa la modellazione del tempo dell'autore per la scrittura nella cella Time[]. Per la stessa ragione, in head while loop non c'è nessun controllo per TimeLocal(), solo per TimeCurrent().

7. Cos'altro suggerisci per ottimizzare il codice?

Dal punto 4 si deve capire che stavi facendo un indicatore, poi tali azioni non sono chiare:

ArrayResize (bid, 1);//урезаем и обнуляем использованные массивы
ArrayResize (ask, 1);

ArrayInitialize() è molto probabilmente adatto!

E molto probabilmente, dovreste rifiutarvi di usare gli array di indicatori.

 
TarasBY:

ArrayInitialize() probabilmente funziona?!

ArrayInitialize(ask, EMPTY_VALUE); vuoi dire? Non l'ho fatto. Perché l'ho tagliato esattamente, avevo paura di un caso simile:

(a, b, c)//valori in ask dopo tre tick al secondo (fantastico, ma supponiamo).

ArrayInitialize(ask, 0);//essere (0, 0, 0)

FileWriteDouble(hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- La cella Close avrà 0. Ecco perché sto ridefinendo le dimensioni per evitare che questo accada. Controllare ArrayInitialize(ask, EMPTY_VALUE);.

TarasBY:

Dovete smettere di usare gli array di indicatori.

Sono dinamici, ecco di cosa mi sono innamorato. Meno comandi, meno cicli del processore. Devi fare 500 millisecondi di elaborazione a qualsiasi f... ...per farlo.

 
sapete se è possibile sostituire gli ordini Send e Close in un EA con una finestra manuale ed entrare nel mercato attraverso questa finestra, è necessario per quei broker che non permettono di usare gli EA
 
gyfto:

ArrayInitialize(ask, EMPTY_VALUE); vuoi dire? Non l'ho fatto. Avevo paura di un caso simile, per questo ho iniziato a ridurlo:

(a, b, c)//valori in ask dopo tre tick al secondo (fantastico, ma supponiamo).

ArrayInitialize(ask, 0);//essere (0, 0, 0)

FileWriteDouble(hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- La cella Close avrà 0. Ecco perché sto ridefinendo le dimensioni per evitare che questo accada. ArrayInitialize(ask, EMPTY_VALUE);; controllali.


Sono dinamici, è di questo che mi sono innamorato. Meno comandi, meno cicli del processore. Devi gestire 500 millisecondi di elaborazione in ogni collo di bottiglia teoricamente possibile... ...per farlo.

Non è quello che voglio dire: qualcosa mi dice che non riuscirai a ridurre l'array di indicatori. Inoltre, se ci sono celle non riempite in tale array, c'è SEMPRE qualche valore lì: 0 o EMPTY_VALUE, e cosa si ottiene in questi calcoli:

bid[ArrayMaximum(bid)];
ask[ArrayMinimum(ask)];
E per logica generale: eseguirei l'intera collezione di tick in un ciclo e controllerei separatamente il tempo e, non appena il tempo della "nuova barra" è passato, lo scriverei nel file, azzerando e tagliando gli array di lavoro nel processo.
 
ex_kalibur:
Se so, è possibile cambiare gli ordini Send e Close in advisor per richiamare manualmente la finestra di trading ed entrare nel mercato attraverso questa finestra, è necessario per quei broker che non permettono l'uso di advisor
Finestra "Proprietà" del consulente -> scheda "Generale" -> "Trading automatico". -> Mettere una casella di controllo su "Conferma manuale" - Non conosco un altro modo.
 
TarasBY:

E per logica generale: eseguirei l'intera collezione di tick in un ciclo e controllerei separatamente il tempo e, una volta passato il tempo della "nuova barra", lo scriverei nel file, azzerando e ritagliando gli array di lavoro nel processo.


Strano... Io ce l'ho così... L'unica cosa è che il tempo è controllato nel ciclo di raccolta dei tick stesso, e l'array di lavoro non viene tagliato fino a quando una copia del tick non è stata disegnata tante volte quanti sono i tick meno un secondo. Un secondo passato - viene disegnato un nuovo tick, due - una copia del tick precedente e un nuovo tick, tre - due copie del tick precedente e un nuovo tick, ecc. Invece delle copie del tick precedente è possibile disegnare un trattino dal livello Close, questa variante è commentata nel codice.
 
gyfto:

Strano... Io ce l'ho così... L'unica cosa è che il tempo è controllato nel ciclo stesso, e l'array di lavoro non viene tagliato fino a quando una copia del tick non viene disegnata tante volte quanti erano i tick meno uno. Un secondo passato - viene disegnato un nuovo tick, due - una copia del tick precedente e un nuovo tick, tre - due copie del tick precedente e un nuovo tick, ecc. Invece delle copie del tick precedente è possibile disegnare un trattino dal livello Close, questa variante è commentata nel codice.

Io e te stiamo parlando di cicli diversi. Sto parlando di questo:

    while (!IsStopped() && IsExpertEnabled())
    {
        //---- Сбор тиков
    }
 
Qualcuno può dirmi come rimuovere gli zeri dopo il punto decimale? Ho 4 cifre decimali nel mio codice per qualche motivo. Ecco il codice. stringa l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
 
Demon2057:
Qualcuno può dirmi come rimuovere gli zeri dopo il punto decimale? Ho 4 cifre decimali nel mio codice per qualche motivo. Ecco il codice. stringa l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
https://docs.mql4.com/ru/strings/StringSubstr
 

Potete dirmi cosa sto sbagliando...

Ho bisogno di una variabile di tipo doppio per contenere la data come 0,20130429164459 (cioè 2013.04.29 16:44:59)

Parte del codice EA:

#include <stdlib.mqh>
bool once=false;
int start()
  {
  if (once==false)
     {
    double DTM; // дата и время в формате 0,20130429164459
    int YY=TimeYear(   TimeCurrent());   // Year
    int MN=TimeMonth(  TimeCurrent());   // Month         
    int DD=TimeDay(    TimeCurrent());   // Day
    int HH=TimeHour(   TimeCurrent());   // Hour         
    int MM=TimeMinute( TimeCurrent());   // Minute
    int SS=TimeSeconds(TimeCurrent());   // Second
    DTM = YY*0.0001+MN*0.000001+DD*0.00000001+HH*0.0000000001+MM*0.000000000001+SS;
    
   Alert ("Значение переменной DTM с 06 знаками равно ", DoubleToStrMorePrecision(DTM,6));
   Alert ("Значение переменной DTM с 07 знаками равно ", DoubleToStrMorePrecision(DTM,7));
   Alert ("Значение переменной DTM с 08 знаками равно ", DoubleToStrMorePrecision(DTM,8));
   Alert ("Значение переменной DTM с 09 знаками равно ", DoubleToStrMorePrecision(DTM,9));
   Alert ("Значение переменной DTM с 10 знаками равно ", DoubleToStrMorePrecision(DTM,10));
   Alert ("Значение переменной DTM с 11 знаками равно ", DoubleToStrMorePrecision(DTM,11));
   Alert ("Значение переменной DTM с 12 знаками равно ", DoubleToStrMorePrecision(DTM,12));
   Alert ("Значение переменной DTM с 13 знаками равно ", DoubleToStrMorePrecision(DTM,13));
   Alert ("Значение переменной DTM с 14 знаками равно ", DoubleToStrMorePrecision(DTM,14));
   Alert ("Значение переменной DTM с 15 знаками равно ", DoubleToStrMorePrecision(DTM,15));
   once=true;
      }
   return(0);
  }

Il registro eventi per Precision 12,13 e 14 dà un risultato sbagliato, vedi immagine