Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 696

 
Northwest:

1. Rimetti tutto a posto, non torturare il computer .

Mi dispiace, ma non puoi farlo, l'indicatore deve contare da sinistra a destra.

Non lo sto disturbando, lo sto usando per il suo scopo.

2.iBandsOnArray, iStdDevOnArray calcolati utilizzando i dati memorizzati nell'array

Sì, sono calcolati usando i dati dell'array bbMacd[], e poi?

3. L'array viene riempito in un ciclo.

In uno o nel primo?

Stai dicendo che per riempire un array, hai bisogno di un ciclo personale, in cui questo array viene riempito

è riempito e non possono essere eseguite altre operazioni?


È importante per me scoprire perché l'indicatore rallenta e come calcolare i punti in cui ciò accade.

Ho altre domande ma nessuna risposta.

Sfortunatamente, non hai offerto alcun indizio.

Se qualcosa viene costruito usando un array, dovrebbe essere costruito usando un array già esistente. Questo è un ciclo di preparazione della matrice e il secondo ciclo di disegno di un indicatore da questa matrice. Questo è un caso generale. Ci sono alcuni casi più specifici, ma dovrebbero essere considerati separatamente - per esempio, possiamo creare funzioni che restituiscono valori da una sola barra calcolata:

//+------------------------------------------------------------------+
//| BandsOnArray                                                     |
//+------------------------------------------------------------------+
double BandsOnArray(const int rates_total,const int index,const int period,const double deviation_bb,const double &array[],const int line,const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
   //--- calculate StdDev
   double dev=StdDevOnArray(rates_total,index,period,array);
   //--- base line
   double mid=0;              
   for(int i=0; i<period; i++)
      mid+=array[index+i];    
   mid/=period;               
   //--- upper line
   double top=mid+dev*deviation_bb;
   //--- lower line
   double btm=mid-dev*deviation_bb;
   return(line==UPPER_BAND ? top : line==LOWER_BAND ? btm : mid);
  }  
//+------------------------------------------------------------------+
//| StdDevOnArray                                                    |
//+------------------------------------------------------------------+
double StdDevOnArray(const int rates_total,const int index,const int period,const double &array[],const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
//--- calculate value
   double avg=0;              
   for(int i=0; i<period; i++)
      avg+=array[index+i];    
   avg/=period;               
   double sd=0;
   for(int i=0; i<period; i++)
      sd+=(avg-array[index+i])*(avg-array[index+i]);
   return(sqrt(sd/period));
  }  
//+------------------------------------------------------------------+

Ma richiedono anche un array di dati già preparato come input, perché StdDevOnArray e BandsOnArray usano Simple-smoothing per cui sono necessari i dati riempiti pari al valore di Period smoothing.

 

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

Qualsiasi domanda per i neofiti su MQL4, aiuto e discussione su algoritmi e codici

Artyom Trishkin, 2018.11.18 20:21

PlotIndexSetInteger(0,PLOT_ARROW,140);

Ma è necessario creare un numero di buffer pari al numero di settimane. E per ogni buffer devi dare un codice freccia da 140 a 149 - 1,2,3,4,5,6,7,8,9,10 - sono sufficienti dieci settimane per un anno? Sono solo 70 giorni. O come lo volevi tu?


È possibile sovrascrivere SetIndexArrow tramite case?

O almeno visualizzare i numeri su un istogramma?


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

Qualsiasi domanda, aiuto e discussione su algoritmi e codici per i principianti di MQL4

Artyom Trishkin, 2018.11.18 20:02

Il buffer viene riempito con il valore di un'ora. E se l'ora è zero, l'istogramma non sarà disegnato. Quindi, dobbiamo controllare se l'ora è uguale a zero (abbiamo impostato la ricerca dell'ora zero nelle impostazioni), e se è uguale a zero, dobbiamo inserire 0,1 invece del valore dell'ora (zero) nel buffer - per mostrare la colonna dell'istogramma. Questo mostrerà un valore di 0 invece di 0,1 nella finestra dei dati, poiché l'indicatore Digits è impostato su zero.


Ora lo vedo, grazie.

 
psyman:

SetIndexArrow può essere sovrascritto da un caso?

O almeno visualizzare i numeri su un grafico a barre?



Ora lo vedo, grazie.

Agisce su tutto il buffer in una volta sola.

Devi mettere un'icona di un numero di settimana sulla barra trovata, e ci dovrebbe essere il numero di settimane in un anno. Le frecce del numero sono chiaramente mancanti in Wingdings.

E' possibile uscire con i testi-oggetto e marcare le barre con il valore del numero della settimana, ma impostare l'icona del buffer a 32 - un carattere vuoto. Il valore sarà sulla barra, ma non sarà visualizzato. Poi il valore può essere il numero della settimana dell'anno, e nell'oggetto scrivi quello che vuoi e l'oggetto sarà visualizzato sulla barra trovata.

 

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

Qualsiasi domanda per i principianti su MQL4, aiuto e discussione su algoritmi e codici

Artyom Trishkin, 2018.11.19 10:50

Agisce su tutto il buffer in una volta sola.

Dovetemettere l'icona del numero della settimana sulla barra trovata, e ci dovrebbe essere il numero di settimane in un anno. Le frecce del numero sono chiaramente mancanti in Wingdings.

Si può girare con oggetti-testi, e segnare le barre con i valori del numero della settimana, ma l'icona per il buffer per impostare 32 - un carattere vuoto. Il valore sarà sulla barra, ma non sarà visualizzato. Poi il valore può essere il numero della settimana dell'anno, e nell'oggetto scrivi quello che vuoi e l'oggetto sarà visualizzato sulla barra trovata.


Ho scritto il giorno della settimana - lun, mar, mer, non il numero. Avete bisogno solo di 5 segni diversi sul grafico.

 
psyman:

Ho scritto il giorno della settimana - lun, mar, mer, non il numero. Avete bisogno solo di cinque segni diversi sul grafico.

Bene, allora avete bisogno di cinque buffer, e assegnate un numero di freccia diverso a ciascuno - da 140 a 144.

 
Artyom Trishkin:

Se qualcosa viene costruito usando un array, dovrebbe essere costruito usando un array già preparato. E questo è un ciclo di preparazione dell'array e il secondo ciclo di disegno dell'indicatore da questo array. Questo è un caso generale. Ci sono alcuni casi più specifici, ma dovrebbero essere considerati separatamente - per esempio, possiamo creare funzioni che restituiscono valori da una sola barra calcolata:

Ma richiedono anche un array di dati già preparato come input, perché StdDevOnArray e BandsOnArray usano Simple-smoothing per cui sono necessari i dati riempiti pari al valore di Period smoothing.

Grazie per aver chiarito la situazione.
 

ciao

Come posso creare una finestra pop-up con pulsanti per confermare/annullare manualmente una transazione?

 
Andrey Sokolov:

ciao

Come posso creare una finestra pop-up con pulsanti per confermare/annullare manualmente una transazione?

MessageBox()
 
Artyom Trishkin:
MessageBox()

Grazie

 

Ciao a tutti.

Come posso ottenere la percentuale del drawdown massimo come nel tester?

Ecco il codice:

double  MaxPeak,DD, MaxDD, DD2, MaxDD2;
--------------------------------------
--------------------------------------
это вывод:

 SM("Maximal drawdown        : " + DoubleToString(MaxDrawdown_Money(), 2)+ " (" + DoubleToString(MaxDrawdown_Protsent(), 2) +" %)");

-------------------------------------
-------------------------------------

//--------------------Рассчет % относительной просадки----------
double MaxDrawdown_Protsent()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD2 = NormalizeDouble((MaxPeak - AccountEquity())/MaxPeak*100,2);
}
if (MaxDD2< DD2)
{
MaxDD2 = DD2;
}
return (MaxDD2);
}
//---------------------Рассчет суммы максимальной просадки--------
double MaxDrawdown_Money()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD = NormalizeDouble(MaxPeak - AccountEquity(),2);
}
if (MaxDD< DD)
{
MaxDD = DD;
}
return (MaxDD);
}

L'importo del drawdown massimo è lo stesso del tester, la percentuale del drawdown relativo è anche la stessa del tester.

Come posso ottenere la percentuale di max drawdown come nel tester ?

Motivazione: