[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 309

 
artmedia70:

È vero: è buona educazione mettere in ordine la propria spazzatura...

Ma in questo contesto, come puoi dire se la "spazzatura" deve essere ripulita ora o viceversa: non è spazzatura - sono i dati necessari per ulteriori calcoli.

Da quanto ho capito, deinit() dovrebbe essere usato per pulire il cestino, ma... viene eseguito non solo quando il grafico di uno strumento di trading viene cancellato, quando Expert Advisor viene rimosso da esso, ma anche quando TF viene cambiato. In questo caso, tutti i dati accumulati per il TF saranno persi e l'Expert Advisor ricomincerà a lavorare con un array nullo quando ritorna al timeframe precedente. Lo stesso accadrà se cambiamo uno qualsiasi dei parametri dell'Expert Advisor.

Si scopre che in alcune situazioni la "raccolta dei rifiuti" è un processo logico complesso, non un semplice cambiamento della dimensione dell'array.


Beh, non è difficile. Nel ciclo, inizializzate l'array con dei valori. Poi lavoriamo con l'array risultante. Quando il lavoro è fatto, lo rendiamo di lunghezza zero. In caso di dubbio, potete farlo alla fine del codice appena prima di return(0).
 

Si prega di suggerire il codice qui sotto per leggere il file di log. Legge automaticamente il file di registro corrente per data e lo invia alla stampante.

Dove:

while (result>0) {

Il file viene assemblato da parti. Ma non ho bisogno di tutto il file, solo dell'ultima riga. Aiuta a correggere, per favore.

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      //MessageBox(msg,title,MB_OK|MB_ICONERROR);
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   //MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 
drknn:

Beh, non è difficile. Nel ciclo, l'array viene inizializzato con dei valori. Poi abbiamo lavorato con l'array risultante. Quando il lavoro è finito, lo rendiamo un array di lunghezza zero. In caso di dubbio, potete farlo alla fine del codice appena prima di return(0).

Sono stato frainteso.

Nel contesto della conversazione (se ho capito bene la premessa di questa conversazione), il loop è l'EA stessa. Dopo tutto, ogni volta che arriva un tick, l'array aumenta o rimane lo stesso a seconda che un nuovo valore debba essere scritto in esso.

Come possiamo sapere che il lavoro è finito, e non solo, per esempio, una persona ha cambiato i tempi? Anche per caso... In questo caso, verrà chiamata deinit() e tutti i dati saranno persi. L'Expert Advisor inizierà a memorizzare (scrivere in un array dinamico) di nuovo, in base ai valori ottenuti nel nuovo timeframe(un nuovo ciclo).

Questo è quello che voglio dire.

 
artmedia70:

Non sono stato capito.

Nel contesto della nostra discussione (se ho capito bene la premessa di questa discussione), il ciclo è il lavoro dell'Expert Advisor stesso. Dopo tutto, ogni volta che arriva un tick l'array viene aumentato o rimane invariato, a seconda che un nuovo valore debba essere scritto in esso.

Come si può dire se un lavoro è finito e non solo una persona che cambia i tempi, per esempio? Anche per caso... In questo caso, verrà chiamata deinit() e tutti i dati saranno persi. L'Expert Advisor inizierà ad accumularli (scriverli in un array dinamico) di nuovo, basandosi sui valori ottenuti nel nuovo timeframe(un nuovo ciclo).

Il mio punto è questo.

Se vai nei dettagli, puoi usare questa funzione. Vi dirà qual è il motivo della deinizializzazione.
 

Ho notato una caratteristica specifica del terminale. Poiché il calcolo del profitto dell'ordine non considera l'OrderSwap(), voglio che chiuda l'ordine in una volta sola.


Significa che dovremmo usare questa formula per chiudere l'ordine con un profitto:

(OrderProfit()+OrderSwap()+OrderCommission())>0

Non ho mai lavorato con la commissione e la commissione non è usata sulla demo, per questo non posso controllarla sul conto.

I miei calcoli sono corretti?

 
Zhunko:
Se vai nei dettagli, puoi usare questa funzione. Vi dirà il motivo della deinizializzazione.

Abbastanza giusto... :)

L'ho dimenticato. Ora, con la mia abitudine di usare "infallibile", lo useremo...

 
artmedia70:

ObjectGetValueByShift() per aiutarvi

E come ci lavorerai - solo tu lo sai...


Grazie, uomo gentile!
 
Due domande.

1. Come faccio a scrivere/inserire la prima e le successive variabili double abc[10] nell'array double ab=a*b?
2. Come scrivere l'undicesima variabile in un array, eliminando la prima?

L'ordine in cui le variabili sono scritte nell'array (avanti o indietro) non ha importanza. Le variabili nella matrice sono necessarie per determinare la media aritmetica.
 
Posso cambiare la dimensione del lotto di un ordine in sospeso?
 
Parn25:
Posso cambiare la dimensione del lotto di un ordine in sospeso?


No, non puoi.

tutto quello che si può cambiare è spiegato qui https://docs.mql4.com/ru/trading/OrderModify

Motivazione: