mql5 - linea verticale dopo un certo tempo dall'ultimo scambio - pagina 2

 
Vladimir Karputov:

Vorrei chiarire il termine "ultimo scambio".

È l'ultimo scambio nel giorno corrente? O per gli ultimi N giorni?

L'ultimo affare entro 24 ore - non c'è bisogno di andare più indietro nella storia.

 
renatmt5:

l'ultima transazione in 24 ore - non c'è bisogno di approfondire la storia.

Ecco come funziona:

L'indicatore usa il codice per creare, spostare e cancellare una linea verticale dall'aiutoOBJ_VLINE. (solo la creazione di linee funziona nell'indicatore finora). Il nome della linea è impostato nel parametro di input"Vertical line name".

Ultimo accordo Spostamento Linea verticale

Lalinea verticale viene creata in OnOnit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


Per minimizzare il carico, interroghiamo la storia una volta al minuto. A tal fine, dichiariamo la variabileExtLastMove nell'area delle variabili globali del nostro programma (in questo caso, nell'indicatore)

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- questa variabile memorizzerà l'ora dell'ultimo accesso alla storia del trading.


Poi in OnCalculate(), sottraiamo il tempo memorizzatoExtLastMove dal tempo corrente (tempo dell'ultima citazione usando qualsiasi simboloTimeCurrent) e se la differenza è inferiore a 60 secondi, usciamo.

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

se la differenza è maggiore, allora registriamo un nuovo tempo inExtLastMove.


Si accede alla storia del trading usando LastProfitForPeriod().

Qui si usano due date: da e a. La data "A" è impostata sul futuro (l'ora corrente più un giorno), ladata "Da" si ottiene sottraendo 24 ore dall'ora corrente

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


Questo è tutto per ora, è un sacco di testo...

 
Vladimir, grazie mille per il tuo codice e soprattutto per i commenti ai suoi frammenti!
Non capisco solo perché abbiamo bisogno di to_date uguale al futuro? Può essere fino al momento attuale? Sembra che non possiamo determinare il risultato dell'affare in futuro :) O abbiamo bisogno di questo giorno nel futuro per tracciare la linea nel tempo futuro?
Un'altra domanda sul loop.
Per quanto ho capito, carichiamo un array con i dati sui deal e facciamo un loop attraverso l'array da zero deal all'ultimo deal, confrontando il tempo con l'ultimo scritto e sovrascrivendo la variabile last_time, se il deal_time è successivo. O forse è vero il contrario - l'array può essere cercato dalla fine? In realtà, l'ultimo elemento dell'array sarà l'ultima transazione chiusa per la quale abbiamo bisogno di dati?
Forse faccio qualche errore logico - per favore non giudicate troppo duramente :)
 
significava per(uint i=0;i<totale;i++) cambiare in for(uint i=totale;i>=0;i--)
 
In effetti, non avete nemmeno bisogno di un ciclo - indirizzate semplicemente l'elemento dell'array con il numero ordinale i=totale
 
Solo non capisco perché abbiamo bisogno di to_date uguale a bussare nel futuro?

Ne abbiamo bisogno in questo modo. Per ottenere garantito "da" e all'ora corrente.

O forse è possibile cercare l'array dalla fine?

Se il compito è quello di trovare l'ultima transazione, allora l'array deve passare attraverso e cercare esattamente il tempo - solo nel caso in cui succeda qualcosa o la logica interna del kernel venga cambiata e le transazioni vengano resettate in modo casuale.

 
Vladimir Karputov:

Questo è il modo per farlo. Per avere la garanzia di ottenere "da" e verso l'ora corrente.

Se il compito è quello di trovare l'ultima offerta, allora Array deve passare e cercare l'ora esatta - solo nel caso in cui succeda qualcosa o la logica interna del kernel cambi e le offerte vengano scartate a caso.

Ok, capito. In linea di principio, data la limitazione della storia di 24 ore non ci sarà chiaramente un carico significativo quando si passa attraverso i dati :)

 
renatmt5:

Ok, ho capito. In linea di principio, dato il limite di 24 ore di storia, è chiaro che non ci sarà un carico di lavoro significativo quando si esaminano i dati :)

Quindi, il tocco finale è quello di spostare la linea a seconda del profitto ottenuto.

Ti ricordi quali sono le regole di spostamento lì?

 
Ho capito bene che last_time e result sono le variabili con cui stiamo lavorando. Il risultato determina di quanto tempo la linea sarà spostata (ridisegnata) nel futuro. Allora il blocco di codice "Profitto del periodo" dovrebbe essere messo prima del blocco "Spostare la linea verticale" per spostare la linea tenendo conto dei dati dell'ultima operazione.
È corretto o sto confondendo qualcosa?
 

Ecco una spiegazione del perché il parametro "prima" dovrebbe essere fatto in futuro:

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

Errori, bug, domande

Renat Fatkhullin, 2016.11.04 12:43

Non fare mai TimeCurrent() come data di fine, fai TimeCurrent()+86400 per assicurarti che tutti gli scambi finali siano catturati.

TimeCurrent non è l'ultima ora esatta, ma "l'ultima ora conosciuta del server durante gli aggiornamenti", che non è precisa al 100%. Soprattutto all'inizio.