Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 563

 
Василий:
Sì, sto chiedendo di MQL 5. Sì, si dovrebbe accedere ai dati del simbolo corrente. I dati sono necessari nel codice EA. Quindi ho bisogno, per esempio, di conoscere il prezzo di chiusura della barra che precede quella attuale.
Guarda l'esempio per CopyTime
 
Karputov Vladimir:
Guarda l'esempio per CopyTime
Capito, cercherò di capirlo. Grazie!
 
Василий:
Sì, sto chiedendo di MQL5? Sì, si dovrebbe accedere ai dati del simbolo corrente. I dati di cui abbiamo bisogno nel codice di Expert Advisor. Così, per esempio, ho bisogno di conoscere il prezzo di chiusura della barra che precede quella attuale

Dovresti leggere un po' la documentazione.

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

Ecco un esempio per ottenere il prezzo di chiusura e i buffer degli indicatori

ENUM_ORDER_TYPE indicator_01()
  {
   double ma[2];
   double close[2];
   static int h_ma=INVALID_HANDLE;
   if(Bars(_Symbol,PERIOD_CURRENT)<ma_period+1)return(WRONG_VALUE);
   if(h_ma==INVALID_HANDLE || h_ma==0)
     {
      h_ma=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
      return(WRONG_VALUE);
     }
   if(CopyBuffer(h_ma,0,1,2,ma)<2) return(WRONG_VALUE);
   if(CopyClose(_Symbol,PERIOD_CURRENT,1,2,close)<2) return(WRONG_VALUE);

   if(close[1]>ma[1]&&close[0]<ma[0])return(ORDER_TYPE_BUY);
   if(close[1]<ma[1]&&close[0]>ma[0])return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Sergey Gritsay:

...

Ecco un esempio per ottenere il prezzo di chiusura e i buffer degli indicatori

Cattivo esempio. La variabile che memorizza l'handle dell'indicatore in MQL5 deve essere dichiarata nell'"header" - nell'area delle variabili globali, e l'handle deve essere ottenuto in OnInit(). E solo allora potrete fare riferimento all'handle dell'indicatore per ottenere dati da qualsiasi parte del programma.
 

Ciao a tutti!

Sto ottenendo i dati sulla cronologia degli scambi nel tester utilizzando l'evento OnTrade.

  for(int i=0;i<HistoryDealsTotal();i++){
       ulong deal_ticket=HistoryDealGetTicket(i);
       Print("ticket=",deal_ticket);
       Print("price=",HistoryDealGetDouble(deal_ticket,DEAL_PRICE));
       Print("time=",TimeToString(HistoryDealGetInteger(deal_ticket,DEAL_TIME)));

E questo è ciò che ottengo nei registri.

0 22:58:16.487 Core 1 2016.04.01 00:00 Numero di barre nella storia del terminale per il simbolo-periodo GBPUSD al momento = 7729
JR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 Tentativo di scambio 0 con lotto 0,01
EL 0 22:58:16.487 Core 1 2016.04.01 03:00:00 market buy 0.01 GBPUSD sl: 1.43033 tp: 1.44034 (1.43646 / 1.43654 / 1.43646)
GO 0 22:58:16.487 Core 1 2016.04.01 03:00:00 deal #2 buy 0.01 GBPUSD at 1.43654 done (based on order #2)
GE 0 22:58:16.487 Core 1 2016.04.01 03:00:00 deal performed [#2 buy 0.01 GBPUSD at 1.43654]
NK 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ordine eseguito comprare 0,01 a 1,43654 [#2 comprare 0,01 GBPUSD a 1,43654]
HI 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=1
HM 0 22:58:16.487 Core 1 2016.04.01 03:00:00 price=0.0
HH 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 00:00
CR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=2
ID 0 22:58:16.487 Core 1 2016.04.01 03:00:00 price=1.43654
OP 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 03:00

Da dove viene il primo scambio con prezzo zero? Non lo faccio :-).

Non lo faccio :-) Spiega plz.

Z.P. Credo di aver capito. Il primo affare ha un profitto di 10K. Non so cosa farci, ma è comunque strano. Perché?

Ed ecco un'altra domanda. L'accordo (comprare a 1.43654) non è stato ancora aperto. Come è apparso nella storia?

Ho bisogno di ottenere dati SOLO sulle transazioni chiuse nell'array come in MQL4. Come si fa?

P.S. Filtrare per DEAL_ENTRY_OUT ?

 
Alexandr Saprykin:
Hai provato a reinstallare il terminale?
Sì, grazie. Questa è stata l'unica cosa che mi ha aiutato.
 
Karputov Vladimir:
Cattivo esempio. La variabile che memorizza l'handle dell'indicatore in MQL5 deve essere dichiarata nell'"header" - nell'area delle variabili globali del programma, ottenere l'handle in OnInit(). E solo allora potrete fare riferimento all'handle dell'indicatore per ottenere dati da qualsiasi punto del programma.

Non sono del tutto d'accordo con te sull'ottenere un handle, perché la funzione OnInit() viene eseguita una volta e non c'è la garanzia al 100% che l'indicatore venga creato dalla prima volta. Potresti avere ragione sulla dichiarazione di una variabile, ma voglio sapere se la seguente documentazione dice qualcosa di peggio della variante con una variabile statica

Le variabili locali dichiarate con la parola chiave static salvano i loro valori finché la funzione esiste. Ad ogni successiva chiamata di una funzione, queste variabili locali contengono i valori che avevano nella chiamata precedente.

 
<br / translate="no">

Filtra per DEAL_ENTRY_OUT

 
Sergey Gritsay:

Non sono del tutto d'accordo con te sull'ottenere un handle, perché la funzione OnInit() viene eseguita una volta e non c'è la garanzia al 100% che l'indicatore venga creato dalla prima volta. Potresti avere ragione sulla dichiarazione di una variabile, ma voglio sapere quanto è peggio l'opzione di una variabile statica nella documentazione

...

Controlleremo questo in OnInit() quando creiamo un handle dell'indicatore. Se il manico dell'indicatore non è stato creato, onOnit() restituiràINIT_FAILED. Cioè, il manico dell'indicatore viene creato solo una volta e solo in OnInit(). Questo non è il "4" - casino e vagabondaggio e dichiarazione di maniglie in tutti gli angoli del programma.
 
Karputov Vladimir:
A tal fine, OnInit() controlla se l'handle dell'indicatore è stato creato. Se l'handle dell'indicatore non è stato creato, OnOnit() dovrebbe restituireINIT_FAILED. Cioè, il manico dell'indicatore viene creato solo una volta e solo in OnInit(). Questo non è "4" - non è un casino e non è un vagare e dichiarare maniglie in tutti gli angoli del programma.
Non sarei così categorico nella mia affermazione. Non è un casino negli armadi, è un casino nelle teste (c)