Caratteristiche del linguaggio mql4, sottigliezze e tecniche - pagina 8

 
  1. La prima chiamata dell'indicatore attraverso l'Expert Advisor utilizzando iCustom causa l'avvio di OnInit e OnCalculate dell'indicatore
  2. L'indicatore non chiama il suo OnCalculate fino alla prossima chiamata di iCustom.
  3. L'uscita dall'Expert Advisor chiama l'indicatore OnDeinit.
Gli indicatori iCustom non sono completi. Ed è impossibile ricevere i valori del buffer degli indicatori avviati manualmente, utilizzando gli strumenti MQL4.
 
fxsaber:
Gli indicatori iCustom non sono completi.

Cos'è l'incompletezza? Gli eventi non vengono gestiti?

 
Andrey Khatimlianskii:

Cos'è l'incompletezza? Gli eventi non vengono elaborati?

Sì.

 
#property strict

#define  HOUR 3600
#define  DAY (24 * HOUR)
#define  WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
  if (Symb == NULL)
    Symb = _Symbol;
    
  return(iTime(Symb, TimeFrame, iBarShift(Symb, TimeFrame, time) - (NextBar ? 1 : 0)));
}

datetime GetTimeDayOfWeek( const int Shift = 0, const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
  const datetime Res = TimeCurrent() / DAY * DAY;
  
  return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - 3) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}


Applicazione

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  PRINT(TimeGMT());
  PRINT(TimeServerGMT());  
}


L'approccio è buono in quanto funziona non solo su weekend, Tester e tempo reale, ma anche su dati di terze parti. Cioè si determinano le citazioni GMT prese da altri che la MT.

 
fxsaber:

E se invece diTimeCurrent(), il tempo dell'ultimo tick sullo strumento, il calcolo non fosse disturbato?

 
Vitaly Muzichenko:

E se invece diTimeCurrent(), prendete il tempo dell'ultimo tick per lo strumento, il calcolo non sarà rotto?

Non lo farà. Il TimeCurrent influenza l'algoritmo in modo molto indiretto. Si può prendere il tempo del bar, ecc.

È semplicemente necessario calcolare la data dell'ultima domenica passata (nella storia delle barre) in qualsiasi modo - per avere barre prima di domenica e dopo domenica. Potete almeno usare TimeLocal per questo.

 
È difficile non amare un linguaggio che permette di scrivere tale codice
double Lots[] = {0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

Sono sicuro che gli sviluppatori non hanno previsto queste cose quando hanno scritto il linguaggio. Come si è scoperto che MQL4 è pieno di cose così utili è un mistero.

 
fxsaber:
È difficile non amare un linguaggio che permette di scrivere un tale codice

Sono sicuro che gli sviluppatori non hanno previsto queste cose quando hanno scritto il linguaggio. Come si è scoperto che MQL4 è pieno di cose così utili è un mistero.

Non c'è nessun mistero. L'ho usato per molti anni anche in mql5, ma dobbiamo convertire esplicitamente il tipo di posizione e il tipo di ordine in tipo int.

Dichiaro semplicemente un array come questo

double  Lots[6] = {0.0};
Puoi anche memorizzare i ticketypes in un array.
 
Alexey Viktorov:

Nessun mistero. L'ho usato per molti anni e anche in mql5, ma bisogna passarlo esplicitamente al tipo int.

Lì il significato sarà molto diverso.