Caratteristiche del linguaggio mql4, sottigliezze e tecniche - pagina 20

 
fxsaber:

Non lo farà. L'algoritmo TimeCurrent è influenzato molto indirettamente. Si possono prendere gli orari dei bar, ecc.

Hai solo bisogno di calcolare la data dell'ultima domenica (nella cronologia delle barre) in qualsiasi modo - in modo che ci siano barre prima di domenica e dopo domenica. Potete usare TimeLocal per questo.

Il risultato sarà sempre GMT+3 se la data di quotazione è vicina alle 00:00 (sessioni non-stop), o GMT+3+N - dove N è il numero di ore dalla chiusura della sessione a mezzanotte o da mezzanotte all'apertura. Che cosa ha a che fare questo con il fuso orario delle citazioni?

 
Ivan Titov:

Il risultato sarà sempre GMT+3 se ci sono virgolette intorno alle 00:00 (sessioni di 24 ore), o GMT+3+N - dove N è il numero di ore dalla chiusura della sessione a mezzanotte o da mezzanotte all'apertura. Cosa ha a che fare questo con il fuso orario delle citazioni?

Non ricordo affatto questo argomento, quindi non posso rispondere alla domanda. Se c'è un'incongruenza, è meglio che cominci a dimostrarla.

 
fxsaber:

Non ricordo affatto questo argomento, quindi non posso rispondere alla domanda. Se c'è un'incongruenza, è meglio che cominci a dimostrarla.

Qui da questo codice sul terminale BCS (simbolo ED-9.19) la funzioneTimeServerGMT() restituisce il tempo 2019.08.11 22:48:55 quando TimeCurrent() è 2019.08.12 11:48:55.

 
Ivan Titov:

Da questo codice sul terminale BCS (simbolo ED-9.19) la funzione TimeServerGMT() restituisce il tempo 2019.08.11 22:48:55 quando TimeCurrent() è 2019.08.12 11:48:55

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

Caratteristiche del linguaggio mql4, sottigliezze e trucchi

fxsaber, 2018.03.29 14:32

// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю

Non ho prestato attenzione a questo commento nel codice.

 
fxsaber:

Non ho prestato attenzione a questo commento nel codice.

Stai dicendo che se i personaggi non forex hanno la storia disponibile, non funzionerà?

Ecco anche un esempio per il forex su Alpari-Demo EURUSD,H1 nel tester:

Per 2019.02.19 14:00:00 ritorna 2019.02.19 11:00:00

Per 2019.06.19 14:00:00-ritorni 2019.06.19 11:00:00

Anche se in inverno dovrebbe essere GMT+2 e in estate GMT+3 (EET).

 
Ivan Titov:

Stai dicendo che se i personaggi non forex hanno una storia disponibile, non funzionerà?

Non mi ricordo. Ma probabilmente è stato scritto per un motivo.


È importante sapere a cosa serve l'offset GMT. Forse la mia visione di questo valore è troppo ristretta, tuttavia, vedo la sua utilità in una sola cosa - la capacità di sincronizzare diversi BP di prezzo tra loro.

Non vedo altre ragioni. Quindi queste funzioni devono essere in grado di sincronizzare ad esempio EURUSD in diversi broker (con diversi GMT-offset). Se questo non accade, solo allora c'è un errore.

 
fxsaber:

È importante capire a cosa serve l'offset GMT. Forse la mia visione di questo valore è troppo ristretta, ma vedo la sua utilità per una sola cosa: la capacità di sincronizzare i vari BP dei prezzi tra loro.

Non vedo altre ragioni. Quindi queste funzioni devono essere in grado di sincronizzare ad esempio EURUSD in diversi broker (con diversi GMT-offset). Se questo non accade, solo allora c'è un errore.

O un prezzo BP con alcune notizie BP. Allora il trucco non funziona?

 
Andrey Khatimlianskii:

O un prezzo BP con un qualche tipo di notizia. Il trucco fallirà allora?

Prima si sincronizzano i due simboli forex sulle diverse fonti. Dopo di che diventa chiaro il pregiudizio dell'uno rispetto all'altro. Sulla base di questi dati, il resto dei simboli

di queste fonti.

La sincronizzazione con il calendario sarebbe bene controllare. Prendi le notizie in inverno e in estate. E vedere se coincide o no.

 
I commenti non relativi a questo argomento sono stati spostati in "Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici".
 

Calcolo della redditività.

// Вычисляет профитность на истории не пересекающихся закрытых позиций.
bool GetSumGain( const double Risk, double &SumGain, double &MaxDD, double &RF, const string Symb, const int Magic = -1 )
{
  bool Res = true;
  const double Leverage = Risk * 100;  
      
  SumGain = 1;
  MaxDD = 0;
  RF = 1;

  double MaxGain = SumGain;
  double DDGain = SumGain;
    
  for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Res = (SumGain > 0)); i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL) &&
        (OrderSymbol() == Symb) && ((Magic == -1) || (OrderMagicNumber() == Magic)))        
    {
      SumGain *= 1 - Leverage * ((OrderType() << 1) - 1) * (1 - OrderOpenPrice() / OrderClosePrice());
      
      if (SumGain > MaxGain)
        MaxGain = SumGain;
      else if (1 - SumGain / MaxGain > MaxDD)
      {
        MaxDD = 1 - SumGain / MaxGain;
        
        DDGain = SumGain;
      }
    }
    
  RF = SumGain / DDGain;
      
  return(Res);
}


Applicando

#property strict
#property  show_inputs

input int MagicNumber = 1; // Для какого мэджика вычислить профитность?

#define  D(A) DoubleToString(A, 2)

void OnStart()
{
  for (int i = 1; i <= 20; i++)
  {
    double SumGain, MaxDD, RF;    
    const double Risk = i * 0.1;
    
    if (GetSumGain(Risk, SumGain, MaxDD, RF, _Symbol, MagicNumber))   
      Print((string)MagicNumber + ": при риске " + D(Risk) +
                                  " увеличение было бы в " + D(SumGain) + " раза" +
                                  " с максимальной относительной просадкой по балансу " + D(MaxDD) + 
                                  ", фактор восстановления = " + D(RF));   
  }
       
}


Risultato

1: при риске 0.30 увеличение было бы в 2.16 раза с максимальной относительной просадкой по балансу 0.19, фактор восстановления = 2.01
1: при риске 0.20 увеличение было бы в 1.68 раза с максимальной относительной просадкой по балансу 0.13, фактор восстановления = 1.60
1: при риске 0.10 увеличение было бы в 1.30 раза с максимальной относительной просадкой по балансу 0.07, фактор восстановления = 1.27
Motivazione: