L'oscillatore di equità di MQL5 significa - pagina 2

 
DV2010: ma perché un valore di Equity che cambia non viene mostrato sull'indicatore, anche se i valori che cambiano (controllati!) vengono scritti nell'array dell'indicatore?

Lì non viene scritto nulla, il ciclo non viene chiamato. Controllate voi stessi.
 

Questo è il punto: il ciclo viene chiamato su tutti i tick!

Guardate voi stessi! Ho messo l'output nel corpo del ciclo di proposito:

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[]){
   for (int i = prev_calculated; i <= rates_total-1; ++i){
      Print("Equity - OnCalculate - Cycle: prev_calculated=",prev_calculated,"   rates_total=",rates_total);
      Print("Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=", AccountInfoDouble(ACCOUNT_EQUITY));
      Values[i] = AccountInfoDouble(ACCOUNT_EQUITY);
   }
   return rates_total;
}

Ed ecco il risultato finale:

2011.01.20 13:58:56     Core 1  OnTester result 0
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9949.299999999999
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: prev_calculated=6418   rates_total=6419
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #12 buy 0.15 EURUSD at 1.33593 done (based on order #12)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #11 buy 0.15 EURUSD at 1.33593 done (based on order #11)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9929.65
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: prev_calculated=6417   rates_total=6418
 
DV2010:

Questo è il punto: il ciclo viene chiamato su tutti i tick!

Guardate voi stessi! Ho messo l'output nel corpo del ciclo di proposito:

Ed ecco il risultato finale:

Cosa c'entrano i test? Esegui l'indicatore sul grafico e vedrai. Non dimenticare di fare le mie modifiche.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

La ragione per testare qui è che ho bisogno di vedere il cambiamento di Equity nel periodo testato sulla storia.

Ho fatto le tue correzioni, ho eseguito l'indicatore sia in modalità test che trascinandolo su un nuovo grafico.

L'indicatore funziona per l'intero periodo, fino alle quotazioni attuali, così come per qualsiasi timeframe (o cosa significa esattamente "vedrai tutto"?)

Tuttavia il valore di Equity rimane costante, anche se l'output al log mostra che cambia.

( Altrimenti, come possiamo sapere se il ciclo funziona o no, se non attraverso Print? )

...Per sicurezza, ecco lo "scheletro" dell'Expert Advisor con indicatore allegato:

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1=0;
void OnInit(){
   Equity1 = iCustom(NULL,0,"Equity",
                          5,          // Период
                          0,          // Смещение
                          MODE_SMA,   // Метод рассчета
                          PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick(){
   Expert1.OnTick();
}
void OnDeinit(const int reason){
   Expert1.Deinit();
}
 
DV2010:

La ragione per testare qui è che ho bisogno di vedere il cambiamento di Equity nel periodo testato sulla storia.

Ho fatto le tue correzioni, ho eseguito l'indicatore in modalità test e trascinandolo su un nuovo grafico.

L'indicatore funziona per l'intero periodo, fino alle quotazioni attuali, così come per qualsiasi timeframe (o cosa significa esattamente "vedrai tutto"?)

Tuttavia il valore di Equity rimane costante, anche se l'output al log mostra che cambia.

( Altrimenti, come possiamo sapere se il ciclo funziona o no, se non attraverso Print? )

...Per sicurezza, ecco lo "scheletro" dell'Expert Advisor con indicatore allegato:

Non ha senso mettere l'indicatore sbagliato in un EA, non lo renderà migliore. Non hai ancora controllato la mia opzione?
 

Forse mi sbaglio, ma non si confronta l'aspetto dell'indicatore sul grafico al termine del test con i calcoli fatti durante il test?

Il punto è che i risultati (array di calcolo) dell'indicatore personalizzato dal tester non vengono trasferiti al grafico in alcun modo, ma l'indicatore specificato viene semplicemente lanciato su un nuovo calcolo sul grafico.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

Esegui questo indicatore su un grafico a minuti (se hai una posizione aperta) e dopo 10-15 minuti avrai un'immagine come questa.


Codice:

//+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,100);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Values,false);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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("prev_calculated=",prev_calculated,"   rates_total=",rates_total);
   int limit=prev_calculated;
   if(limit>0) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for(int i=limit; i<rates_total;++i)
     {
      Values[i]=AccountInfoDouble(ACCOUNT_EQUITY);
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

Roche, ti ho già chiesto quale sia il mio indicatore sbagliato, e ti ho anche scritto di come ho controllato la tua variante . E ho cercato di spiegartelo nel modo più dettagliato possibile, mentre tu hai scritto solo brevemente "il ciclo non funziona" e "lo vedrai da solo"...

...Renat, da quanto ho capito, l' indicatore verrà visualizzato sul grafico dopo il completamento del test, in base ai calcoli effettuati durante il test e il riempimento della matrice dell'indicatore. Ma cosa significa che i risultati del tester non vengono trasferiti al grafico dell'indicatore personalizzato dal tester?

Allora di cosa hanno bisogno e perché la linea dell'indicatore scompare subito, quando elimino l'assegnazione dei valori a un array dal codice (anche se è una linea orizzontale costante, scompare)?

Pensavo che la corrispondenza tra l'array di valori dell'indicatore che vengono riempiti in OnCalculated e i valori dell'indicatore sul grafico non fosse ambigua, altrimenti come si possono inizializzare i valori dell'indicatore?

È difficile da capire... Sembra un compito banale, ma ci sto lottando da diversi giorni, ed è difficile trovare qualcuno che possa almeno accennare a come può essere risolto diversamente sulla storia e se è risolto del tutto.

Ancora una volta, come ho capito (correggetemi se sbaglio, se non vi dispiace).

1.Specifico un periodo di prova nel tester e seleziono un Expert Advisor con il mio indicatore collegato.

2. laprima chiamata OnCalculated è chiamata con i parametri prev_calculated =0 e rates_total = numero di tick (barra) corrispondente all'inizio del test. In questo periodo, il valore di equilibrio rimane al livello iniziale e costante.

Lechiamate consecutive di OnCalculated per barra all'interno del periodo di test, avvengono per ogni singola barra, e qui possiamo inizializzare un array di valori di indicatori con quei dati che cambiano (per esempio, duplicare il prezzo, che ho ricevuto, ma perché non inizializzare i valori Equity invece di cambiare i prezzi ?)

E comunque, qui sei un professionista. Spero che questo semplice compito sia risolto, o MetaTrader deveancora raggiungere tali "altezze"? :)))

Ho offerto la mia semplice soluzione a questo problema, ma si rifiuta di funzionare.

Allora come può essere implementato - un grafico di Equity sotto il grafico del prezzo basato sui risultati dei test sulla storia?

 
Vi dirò una cosa, non sarà facile risolvere il vostro problema fino a quando la modalità di visualizzazione non sarà lanciata. C'è una soluzione: scrivere i dati azionari in un file durante il test, poi scrivere i dati dal file al buffer dell'indicatore e tracciare il grafico azionario.
 

Rosh, la variante per l'online è già stata postata, ma come qualcuno che lavora principalmente con la Storia, ho bisogno di una variante che funzioni su dati storici. E trovo ancora difficile capire quale possa essere la difficoltà principale.

Il trader ha un'idea del grafico dell'equilibrio online a causa di un numero minore di operazioni (a meno che non sia un extrascalder che ha a malapena il tempo di premere Buy e Sell).

In effetti, la dinamica dell'Equity diventa critica su una lunga storia con centinaia o addirittura migliaia di trade, ma il grafico nel tester non fornisce un semplice confronto di queste dinamiche con la dinamica dei prezzi in linea di principio (a meno che, naturalmente, MetaQuote non consideri la cosa principale per i programmatori una rapida eliminazione di esperti già preparati senza analisi di serie separate di posizioni deboli e forti).