Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 986

 
Artyom Trishkin:

In OnInit() chiamate la serie temporale del simbolo: iTime(Symbol,Timeframe,1);

All'inizio di OnTick(), chiedete la barra necessaria della serie temporale necessaria tramite la corrispondente iFunc(), o se( iTime(Symbol,Timeframe,10)==0) ritornate;

In questo caso, l'Expert Advisor non rileverà una nuova barra e aspetterà il prossimo tick.

In OnInit() abbiamo richiesto i dati della serie temporale, attivando così la paginazione dei dati.

In OnTick() controlliamo se la storia minima richiesta è disponibile per l'EA e se non è ancora disponibile, aspettiamo il prossimo tick.

E fino a quando tutti i dati richiesti dall'Expert Advisor non saranno ricevuti, esso aspetterà il prossimo tick.

Non appena tutti i dati necessari vengono scaricati e ottenuti, l'Expert Advisor inizierà a lavorare con la nuova barra e la storia richiesta.

Per mantenere aggiornati i dati seriali, assicuratevi di accedervi almeno una volta ogni due minuti. Fai un secondo timer per circa un minuto e mezzo (90 secondi) e in esso, accedi semplicemente a qualsiasi serie temporale del simbolo desiderato, per esempio iTime(Symbol,Timeframe,1); Senza controllare i dati ricevuti - semplicemente "sposta" la storia. Quindi tutti i dati sul simbolo saranno sempre aggiornati.

Naturalmente, proverò a controllare la nuova barra usando tutti i TF ma non è sincrono, questo non è MT4. Il problema non è con la barra ma con gli indicatori che non sono attivati dall'indicatore, che a sua volta è attivato dall'EA.

Lavoro a minuti, quindi la cronologia dovrebbe essere sempre aggiornata.

E, tutti questi controlli sono fatti per il test e non faranno altro che rallentare il lavoro su un conto reale, perché lì tutto funziona più lentamente che nelle condizioni stazionarie del tester, ripeto che su un conto reale l'indicatore funziona correttamente.

 

Finora ho risolto il problema controllando la prontezza degli indicatori, che sono falliti, prima dell'inizio del codice principale

//При появлении нового бара проверяем корректность расчета индикаторов
      if(isNewBar_Predv_Calc_Ind()==true)Predv_Calc_Ind=true;
      if(Predv_Calc_Ind==true)
      {
      double arr_DonUp=ZZ_Vibor(0,2,0);
      double arr_DonDown=ZZ_Vibor(0,3,0);
      double arr_DonUp_m2=ZZ_Vibor(1,2,0);
      double arr_DonDown_m2=ZZ_Vibor(1,3,0);
      double arr_DonUp_m5=ZZ_Vibor(2,2,0);
      double arr_DonDown_m5=ZZ_Vibor(2,3,0);
      double arr_DonUp_m15=ZZ_Vibor(3,2,0);
      double arr_DonDown_m15=ZZ_Vibor(3,3,0);
      if (arr_DonUp<1     || arr_DonDown<1    ||
          arr_DonUp_m2<1  || arr_DonDown_m2<1 ||
          arr_DonUp_m5<1  || arr_DonDown_m5<1 ||
          arr_DonUp_m15<1 || arr_DonDown_m15<1
         )return;
      else{Predv_Calc_Ind=false;}      
      }
//Операции выполняются только при появлении следующего бара   
   if(!isNewBar()) return;

Ma questo approccio non è universale, perché è necessario elencare tutti gli indicatori, c'è un altro metodo più universale per far funzionare correttamente l'ambiente tester?

 
Artyom Trishkin:

In OnTick() controlliamo se la storia minima richiesta è disponibile per l'Expert Advisor, e se non è ancora disponibile - aspettiamo il prossimo tick.

E fino a quando tutti i dati richiesti dall'EA non saranno ottenuti, esso aspetterà il prossimo tick.

Non appena tutti i dati necessari sono stati pompati e ottenuti, l'Expert Advisor inizierà a lavorare con la nuova barra e la storia richiesta.

Come proponi di controllare la disponibilità della storia, non capisco...

 
fxsaber:

Aggiungere questa linea prima della funzione MQL4

e funzionerà in MT5.

Questo è geniale. Grazie mille!

 
Ciao, sono un giovane pensionato che vorrebbe fare tali pulsanti in MT5.

Si può dire MT5 può implementare tali pulsanti, forse già hanno uno, condividere il codice ...


Il pulsante "Start " e il pulsante "Close all orders". MT5, tutte le coppie, tutti i timeframes, 4/5 cifre. Lotto iniziale 0,01 centesimi inclusi.
Prevedere lo slittamento e le riquotazioni.

Funzioni per il pulsante "Start
Una volta scartato manualmente il Fibo, dovresti aprire da 1 a 11 ordini in una volta in BAY o SELL al prezzo corrente.
Se avete precedentemente selezionato nelle impostazioni quanti e quali ordini (1, 2, 5, 7 o tutti e 11) devono essere aperti in direzione del Fibo dispiegato.
Nelle impostazioni era possibile specificare la dimensione manuale del lotto per ogni ordine, o aumentarla/diminuirla dinamicamente.

TP - Take Profit è impostato in ordine crescente da 1 a 11 ordini ai livelli Fibo di 61.8; 78.6; 100.0;
161.8; 185.4; 200.0; 261.8; 285.0; 423.6; 561,8; 685.4

SL - Stop Loss in dimensione di - 2 spread (calcolato automaticamente) dalla linea zero del fibo.

TS - Trailing Stop tira tutti gli ordini dietro di sé.
1. Trailing Stop sposta lo SL di tutti gli ordini al 38,2 + 2 spread se il prezzo ha raggiunto il livello 61,8,
2. Trailing Stop sposta lo SL di tutti gli ordini rimanenti al livello 50.0 + 2 spread se il prezzo raggiunge il livello 100.0,
3. trailing SL di tutti gli ordini rimanenti a 78.6+2 spreads se il prezzo raggiunge il livello 161.8,
4. trailing SL di tutti gli ordini rimanenti al livello di spread 100.0+2 quando il prezzo raggiunge il livello 261.8. 5.
5. trailing SL di tutti gli ordini rimanenti al livello di spread 200.0+2 quando il prezzo raggiunge il livello 423.6,
6. il trailing sposta lo SL di tutti gli ordini rimanenti al livello di spread 423.6+2 se il prezzo ha raggiunto 561.8;

Lafunzione del pulsante "Chiudi tutti gli ordini" è quella di chiudere forzatamente tutti gli ordini.
 

Ciao, se i prezzi Ask e Bid della classe CSymbolInfo sono più o meno chiari, come ottenere per esempio SessionInterest o SessionBuyOrdersVolume o SessionPriceLimitMin, dà degli zeri, non riesco a capire perché...

 
Александр Юрин:

Ciao, se i prezzi Ask e Bid della classe CSymbolInfo sono più o meno chiari, come ottenere ad esempio SessionInterest o SessionBuyOrdersVolume o SessionPriceLimitMin, dà degli zeri, non riesco a capire perché...

Se il server di trading trasmette queste informazioni, le riceverete.

Di norma, queste informazioni sono trasmesse dai Broker per i simboli delle azioni (non confondere i Broker e i centri di negoziazione).

 
Vladimir Karputov:

Se il server di trading trasmette queste informazioni, le riceverete.

Queste informazioni sono di solito trasmesse dai Broker per i simboli di scambio (non confondere Broker e centri di negoziazione).

Broker Otkritie, il RTS Index Futures, suppongo che deve trasmettere almeno SessionPriceLimitMin e SessionPriceLimitMax (perché sono, per quanto ho capito, i prezzi di apertura utilizzati negli ordini a mercato). L'apertura non si traduce... Io prescrivo per esempio:

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - dal vostro EA

Ricevo solo i prezzi di Ask nel registro

File:
y2a4cgbfjw.png  63 kb
 

Per favore, aiutatemi a scrivere un pezzo di codice che determini correttamente la data dell'ultima barra con qualsiasi spostamento in qualsiasi TF, preciso al TF corrente.

int              N_bar=iBarShift(Symbol(),PERIOD_CURRENT,iTime(Symbol(),PERIOD_H1,0));//номер текущего бара
datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,N_bar+1);//только для минуток и то может быть не корректно!

Print("StopDt_Shift=",TimeToString(StopDt,TIME_DATE|TIME_MINUTES));

Questo codice generalmente funziona, ma solo se l'ora di inizio della barra corrente coincide con la barra attuale (arrotondata al minuto), poiché il mio grafico attuale è M1. E se non coincide, allora si verificano vari contrattempi, a seconda dei diversi TF. Per esempio, ho bisogno di sapere la data di inizio dell'ultima barra M1 nell'ultima ora, se erano le 12 nessun problema, l'ora sarà 12:59, ma se erano le 13 sarà 13:58 perché la barra oraria ha aperto alle 14:05 e non alle 14:00 e la funzioneiBarShift ha restituito la barra più vicina alle 14:00, cioè 13:59.

Aggiunto: fatto questo, sembra funzionare

datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,_Shift-1),iTime(Symbol(),PERIOD_CURRENT,0)));
 
Александр Юрин:

Otkritie broker, RTS index futures, presumo che dovrebbe trasmettere almeno SessionPriceLimitMin e SessionPriceLimitMax (come ho capito sono utilizzati in ordini di mercato da prezzi di apertura ). L'apertura non si traduce... Io prescrivo per esempio:

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - dal vostro EA

Ricevo solo i prezzi di Ask nel registro

Il server è reale o è una demo?
Motivazione: