Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 553

 
Vitalii Ananev:

Invece di Close[2] metti il valore dell'indicatore sulla seconda barra (per esempio iRSI(.......,2) ) e invece di Close[1] metti il valore dell'indicatore sulla prima barra. E uroven è il valore del livello.

E il resto vi è già stato detto sopra.

Grazie.
 
Potete dirmi se qualcuno ha visto un volume laterale del giorno sul lato destro del grafico per mt5, per mt4 l'ho trovato qui https://www.mql5.com/ru/code/9777. Ho due varianti: o riscrivere le variabili o trovarne una già pronta. Oppure non vedo il senso di ordinare,,,,,,, , ho bisogno di verificare una teoria di equilibrio ,,,,. Ho trovato un lavoro per mt5 dove il profilo della giornata di ieri è disegnato a sinistra ma c'è un inconveniente importante, non mostra cosa succede oggi. Quindi voglio aggiungere alle informazioni del pattern grafico sulla destra quello che sta succedendo al momento del trading
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • voti: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

Prerequisito:


ProfitSellDBL è calcolato qui

Profit_Upgr = 0.01

Tral_Start__Upgr è equiparato a una variabile esterna di tipo int ed è uguale a 5.

Tral_Size__Upgr è similmente uguale a 4

TV - valore di tick, =10

SommaLotSellDBL = 0,04

L'ho letto. Ho visto come funzionerebbe se Tral_Start__Upgr, Tral_Size__Upgr e le loro variabili esterne fossero definite come doppie. Cioè quando tutto è dello stesso tipo senza alcuna conversione e perdita di dati. Il risultato è lo stesso. Cosa ho sbagliato?
 
Maria Baburina:
Leggere. Ho visto come funzionerebbe se Tral_Start__Upgr, Tral_Size__Upgr e le loro variabili esterne fossero definite come doppie. Cioè quando tutto è dello stesso tipo senza alcuna conversione e perdita di dati. Il risultato è lo stesso. Cosa ho sbagliato?

Un cieco che parla con un sordo. Se volete che qualcuno lo testi, avete bisogno del minimo codice possibile che possa essere compilato su un'altra macchina e testato. Nessun codice - niente di cui parlare.

Aggiunto: Utilizzare il debug:

-Preconfigurazione

-Punti diarresto

-Avviare ildebug

-Espressioniosservabili

-Chiama la pila

-debuggingpasso dopo passo

-Arrestare, riprendere e terminare il debug

-debug dellastoria

 

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

Bug, bug, domande

comp, 2016.04.03 18:21

Errore di runtime

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
  return(rates_total);
}

In quattro ha funzionato bene! In cinque è una rottura. È un'altra limitazione architettonica rispetto al quad? Dammi un link a una discussione su questo, non sono riuscito a trovarlo da solo.


 
Ho capito bene che si può assegnare qualcosa ai buffer degli indicatori solo dopo la prima chiamata del terminale stesso (non manualmente) a OnCalculate?
 
comp:
Ho capito bene, che qualcosa può essere assegnato ai buffer degli indicatori solo dopo la prima chiamata del terminale (non manualmente) OnCalculate?

Si può accedere ai buffer degli indicatori dopo che OnCalculate() è stato chiamato. Allo stesso tempo, il buffer dell'indicatore stesso dovrebbe essere dichiarato nell'area delle variabili globali:

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property  indicator_type1   DRAW_COLOR_HISTOGRAM
#property  indicator_color1  Green,Red
#property  indicator_width1  2
#property  indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define  DATA_LIMIT 37
 

Penso di aver trovato quello che stavo cercando, ma l'antichità del codice dà un errore

Aiutami a sistemarlo ...... se non è troppo disturbo.

e se potete aiutarmi a girarlo sul lato destro dello schermo sarebbe fantastico.

 
Karputov Vladimir:

Si può accedere ai buffer degli indicatori dopo che OnCalculate() è stato chiamato.

A quanto pare, si sbaglia. Si può applicare solo quando il terminale chiama OnCalculate. In questo caso, la condizione in MT4 è più flessibile, perché è sufficiente chiamare OnCalculate solo una volta. E in MT5, dovete aspettare la chiamata di OnCalculate dal terminale stesso ogni volta dopo il SetIndexBuffer. Prova

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define  TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

In MT4 questo indicatore funziona senza problemi, in MT5 si blocca con un errore. Come si è scoperto, in MT4 basta aspettare la prima chiamata di OnCalculate da parte del terminale e fare quello che si vuole con i buffer, compresa la loro ridefinizione usando SetIndexBuffer. Ma in MT5 dopo OGNI SetIndexBuffer è necessario attendere la prima chiamata di OnCalculate da parte del terminale.

Questa peculiarità non è documentata da nessuna parte. E non sembra corrispondere alla definizione di "principiante".

Possiamo aspettarci che in MT5 questo comportamento sia lo stesso di MT4? Cioè dopo la prima chiamata di OnCalculate da parte del terminale stesso sarebbe possibile chiamare SetIndexBuffer senza problemi?

 
comp:

A quanto pare, si sbaglia. Potete chiamarlo solo quando OnCalculate è chiamato dal terminale stesso. In questo caso, in MT4 la condizione è più flessibile, perché è necessario chiamare OnCalculate solo una volta. Ma in MT5, dovete aspettare la chiamata di OnCalculate dal terminale stesso ogni volta dopo il SetIndexBuffer. Prova

In MT4 questo indicatore funziona senza problemi, in MT5 si blocca con un errore. Come si è scoperto, in MT4 devi solo aspettare la prima chiamata di OnCalculate da parte del terminale e poi fare quello che vuoi con i buffer, compresa la loro ridefinizione usando SetIndexBuffer. Ma in MT5 dopo OGNI SetIndexBuffer è necessario attendere la prima chiamata di OnCalculate da parte del terminale.

Questa caratteristica non è documentata da nessuna parte. E non sembra corrispondere alla definizione di "principiante".

Possiamo aspettarci che in MT5 questo comportamento sia lo stesso di MT4? Cioè dopo la prima chiamata di OnCalculate da parte del terminale stesso sarà possibile chiamare SetIndexBuffer senza problemi?

Non impegnatevi nella verbosità - naturalmente, la chiamata di OnCalculate implica una chiamata del terminale stesso, perché
La funzione OnCalculate() viene chiamata solo negli indicatori personalizzati quando è necessario calcolare i valori dell'indicatore tramite l'eventoCalculate. Questo di solito accade quando viene ricevuto un nuovo tick per il simbolo per il quale l'indicatore è calcolato. L'indicatore non ha bisogno di essere collegato a nessun grafico di prezzo di questo simbolo.
Motivazione: