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

 
C'è la necessità di nascondere gli oggetti secondo un criterio. Come posso nascondere gli oggetti in un grafico (principalmente linee)? Gli oggetti possono essere selezionati per prefisso.
 
Seric29:
C'è la necessità di nascondere gli oggetti secondo un criterio. Come posso nascondere gli oggetti in un grafico (principalmente linee)? Gli oggetti possono essere selezionati per prefisso.

OBJPROP_TIMEFRAMES aiuta a farlo. Ma non tutti in un mucchio, ma in un ciclo uno per uno.

 
Alexey Viktorov:

OBJPROP_TIMEFRAMES aiuterebbe in questo. Ma non tutti in un mucchio, ma in un ciclo uno alla volta.

Lo farò, voglio una mappatura periodo per periodo e sperimenterò, grazie per il consiglio.

 

In che modo il programma sarà più veloce?

1. var.- se si scrivono funzioni universali. In questo caso, il numero di controlli aumenta, ma la quantità di codice diminuisce, perché alla fine ci sono meno funzioni, meno variabili inizializzate, ma c'è uno svantaggio menzionato prima.

La seconda variante è se scriviamo più funzioni che eseguiranno calcoli meno complessi. In questo caso, la quantità di codice aumenta, si inizializzano più variabili e il compilatore dovrà eseguire il codice a vuoto per trovare la funzione desiderata, ma c'è un vantaggio, il numero di controlli diminuisce.

Chi ci pensa?

 
Seric29:

In che modo il programma sarà più veloce?

1. var.- se si scrivono funzioni universali. In questo caso, il numero di controlli aumenta, ma la quantità di codice diminuisce, perché alla fine ci sono meno funzioni, meno variabili inizializzate, ma c'è uno svantaggio menzionato prima.

La seconda variante è se scriviamo più funzioni che eseguiranno calcoli meno complessi. In questo caso, la quantità di codice aumenta, più variabili vengono inizializzate e il compilatore dovrà eseguire spesso il codice per trovare la funzione giusta, ma c'è un vantaggio, il numero di controlli diminuisce.

Chi ci pensa?

Opzione 2, un sacco di piccole funzioni, ma sei 2 mesi all'oscuro della differenza tra compilatore e interprete, il compilatore non esegue codice a vuoto, crea tabelle di collegamenti a funzioni, variabili, costanti... e poi usa quelle tabelle per saltare in fase di esecuzione

qui leggerehttps://habr.com/ru/company/intel/blog/143446/

gli sviluppatori hanno scritto la stessa cosa qui da qualche parte cercando il threadhttps://www.mql5.com/ru/forum/304239/page36#comment_11049194


SZZ: ecco come funziona il compilatorehttps://habr.com/ru/sandbox/114988/

Делиться не всегда полезно: оптимизируем работу с кэш-памятью
Делиться не всегда полезно: оптимизируем работу с кэш-памятью
  • habr.com
Делиться с ближним своим для нас, божьих тварей, это очень характерно, считается добродетелью, и вообще, как утверждает первоисточник, положительно отражается на карме. Однако в мире, созданном архитекторами микропроцессоров, такое поведение не всегда приводит к хорошим результатам, особенно если это касается разделения памяти между потоками...
 
Alexey Viktorov:

È semplicemente incredibile. Come si può leggere la documentazione per vedere DRAW_HISTOGRAM2 e non vedere DRAW_COLOR_HISTOGRAM2

Oh, e ci sono buffer extra dichiarati.

Buona sera. Provato per molto tempo e invano. L'istogramma disegna correttamente, ma la colorazione in diversi colori (sopra e sotto il livello 50) non ha vinto. Per favore, ditemi dove ho sbagliato. Testo qui sotto, il file è collegato.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
double    ColorHistogram_2Colors[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
////--- установим пустое значение для HISTOGRAM2
//   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);   
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
   PlotIndexSetString(2,PLOT_LABEL,"UP");
   PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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[])
  {
   int i,k,start;
   
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,0);
   
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else          ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>50){
         cl=0;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
         } 
      if(ExtMainBuffer[i]<50){
         cl=1;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

 
Sergey Voytsekhovsky:

Buona sera. Provato per molto tempo e invano. L'istogramma disegna correttamente, ma la colorazione in diversi colori (sopra e sotto il livello 50) non ha vinto. Per favore, ditemi dove ho sbagliato. Testo qui sotto, il file è collegato.


In modalità debug stavo guardando i valori passo dopo passo:

  • ExtMainBuffer[i]
  • cl
  • ColorHistogram_2Buffer1[i]
  • ColorHistogram_2Buffer2[i]
  • ColorHistogram_2Colors[i]
Sembra azzeccare tutto, ma i grafici a barre sono solo verdi, quelli sotto i 50 non sono colorati di rosso.
 
Sergey Voytsekhovsky:

In modalità debug, guardate i valori passo dopo passo:

  • ExtMainBuffer[i]
  • cl
  • ColorHistogram_2Buffer1[i]
  • ColorHistogram_2Buffer2[i]
  • ColorHistogram_2Colors[i]
Sembra contare correttamente, ma gli istogrammi sono solo verdi, quelli sotto i 50 non sono colorati di rosso.
 
Sergey Voytsekhovsky:

In modalità debug, guardate i valori passo dopo passo:

  • ExtMainBuffer[i]
  • cl
  • ColorHistogram_2Buffer1[i]
  • ColorHistogram_2Buffer2[i]
  • ColorHistogram_2Colors[i]
Sembra ottenere tutto bene, ma l'istogramma è solo verde, quelli sotto 50 non sono colorati in rosso.
Date un'occhiata al codice
Normalized_Volume
Normalized_Volume
  • www.mql5.com
Индикатор Normalized Volume - индикатор нормализованного объёма. Отображает средний объём в диапазоне баров в виде цветной гистограммы с пороговым уровнем. Имеет два настраиваемых параметра:
 
Igor Makanu:

ma tu sei sul tiro ...

Beh, questo è comprensibile, ho appena chiamato figurativamente il programma un compilatore, ma in generale in quale caso sarebbe meglio?