[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 131

 
win_idx è quello giusto?
 
alsu:
win_idx ha capito bene?

win_ind risulta essere corretto.

ObjectCreate("max",OBJ_HLINE,win_idx,0,top); disegna nella finestra corretta,


ObjectSet("max",OBJPROP_COLOR,Yellow); disegna nel colore corretto,

ObjectSet("max",OBJPROP_WIDTH,0); disegna la linea corretta,

ma non definisce il parametro superiore in

double top=WindowPriceMax(win_idx);

e topBuffer[] è vuoto.


Il codice

#proprietà indicator_separate_window
#proprietà indicator_buffers 3
#proprietà indicator_color1 Lime
#property indicator_color2 Red
//--- buffer
doppio ExtMapBuffer1[];
doppio ExtMapBuffer2[];
doppio topBuffer[];


bool initFinished=false; // aggiungere una variabile che ricordi lo stato di inizializzazione.
// false - l'inizializzazione non è ancora avvenuta.
// true - è stato inizializzato
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int init()
{
//---- indicatori
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(2,DRAW_NONE);
SetIndexBuffer(2,topBuffer);

IndicatoreCifre(5);
//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di deinizializzazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di iterazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),
limite;

se(barre contate>0)
barre contate..;

limit=Bars-counted_bars;
//----
for(int i=0;i<limit;i++)

{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);

se(initFinished==false)
{
IndicatoreNomeCorto("MACD_max-min");

int win_idx=WindowFind("MACD_max-min");
// trova il numero della nostra sottofinestra dell'indicatore

se(win_idx<0)
{
// se il numero di sottofinestra è -1, c'è un errore
Stampa("Finestra non trovata");
ritorno(0);
}

double top=WindowPriceMax(win_idx);
/trova il valore massimo della scala verticale della sottofinestra specificata del grafico corrente


ObjectCreate("max",OBJ_HLINE,win_idx,0,top);
// disegna una linea orizzontale in una sottofinestra del nostro indicatore

ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);

WindowRedraw();
// ridisegna la finestra per vedere la linea

initFinished=true;
// il disegno è finito

}

topBuffer[i]=top;


}

//----
ritorno(0);
}
//+------------------------------------------------------------------+

 
MK07:

win_ind risulta essere corretto.

ObjectCreate("max",OBJ_HLINE,win_idx,0,top); disegna nella finestra corretta,


ObjectSet("max",OBJPROP_COLOR,Yellow); disegna nel colore corretto,

ObjectSet("max",OBJPROP_WIDTH,0); disegna la linea corretta,

ma non definisce il parametro superiore in

double top=WindowPriceMax(win_idx);

e topBuffer[] è vuoto.


Codice

#proprietà indicator_separate_window
#proprietà indicator_buffers 3
#proprietà indicator_color1 Lime
#property indicator_color2 Red
//--- buffer
doppio ExtMapBuffer1[];
doppio ExtMapBuffer2[];
doppio topBuffer[];


bool initFinished=false; // aggiungere una variabile che ricordi lo stato di inizializzazione.
// false - l'inizializzazione non è ancora avvenuta.
// true - è stato inizializzato
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore personalizzato
//+------------------------------------------------------------------+
int init()
{
//---- indicatori
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(2,DRAW_NONE);
SetIndexBuffer(2,topBuffer);

IndicatoreCifre(5);
//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di deinizializzazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di iterazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),
limite;

se(barre contate>0)
barre contate..;

limit=Bars-counted_bars;
//----
for(int i=0;i<limit;i++)

{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);

se(initFinished==false)
{
IndicatoreNomeCorto("MACD_max-min");

int win_idx=WindowFind("MACD_max-min");
// trova il numero della nostra sottofinestra dell'indicatore

se(win_idx<0)
{
// se il numero di sottofinestra è -1, c'è un errore
Stampa("Finestra non trovata");
ritorno(0);
}

double top=WindowPriceMax(win_idx);
/trova il valore massimo della scala verticale della sottofinestra specificata del grafico corrente


ObjectCreate("max",OBJ_HLINE,win_idx,0,top);
// disegna una linea orizzontale in una sottofinestra del nostro indicatore

ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);

WindowRedraw();
// ridisegna la finestra per vedere la linea

initFinished=true;
// il disegno è finito

}

topBuffer[i]=top;


}

//----
ritorno(0);
}
//+------------------------------------------------------------------+



Scusate l'intromissione.

topBuffer[i] dietro il ciclo e il disegno, provate questo:

int start()
  {
   int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
        ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
        
          if(initFinished==false)
           { 
             int win_idx=WindowFind("MACD_max-min");
             // находим номер подокна нашего индикатора
      
             if(win_idx<0)
              {
               // если номер подокна равен -1, то возникла ошибка
                 Print("Окно не найдено");
                 return(0);
              }  
              
             double   top=WindowPriceMax(win_idx); 
              //находим максимальное значение вертикальной шкалы указанного подокна текущего графика
             topBuffer[i]=top;
             Comment( "\n"," top = ",top); 

             ObjectCreate("max",OBJ_HLINE,win_idx,0,0);
             // рисуем горизонтальную линию в подокне нашего индикатора
             ObjectSet("max", OBJPROP_PRICE1, top);  
             ObjectSet("max",OBJPROP_COLOR,Yellow);
             ObjectSet("max",OBJPROP_WIDTH,0);
 
             WindowRedraw();      
             // перерисовываем окно, чтобы увидить линиию   
      
             initFinished=true;
            // рисование закончено  
        
           } 
        
            
                
        
      }  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
//Пробуйте с учетом мнения alsu. 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],ExtMapBuffer2[];
int init(){SetIndexStyle(0,DRAW_LINE);SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min");return(0);}
int deinit(){return(0);}
//+------------------------------------------------------------------+
int start(){int counted_bars=IndicatorCounted(),limit,win_idx;double top;
if(counted_bars>0)counted_bars--;limit=Bars-counted_bars;win_idx=WindowFind("MACD_max-min");
for(int i=0;i<limit;i++){ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
  ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);}
  top=WindowPriceMax(win_idx);ObjectDelete("max");
  if(ObjectFind("max")!=win_idx){ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
  ObjectSet("max",OBJPROP_COLOR,Yellow);ObjectSet("max",OBJPROP_WIDTH,0);}return(0);}
//+------------------------------------------------------------------+
 
Sono un principiante e ho installato MetaFX e expert advisor sulla demo tutto funziona e non vuole lavorare sull'originale non vuole solo stare in piedi
 

Ciao!

Per favore, indicatemi la direzione giusta:

Mi vengono date N variabili esterne dello stesso tipo. Come scegliere il valore massimo tra loro senza sovraccaricare il codice - MathMax restituisce il massimo di due valori, ma se è, diciamo, 20?

Oppure, come creare un array da questi dati, che poi applicano ArrayMaximum?

extern int A = 10;
extern int .......;

extern int N = 1253;

Grazie in anticipo!

 
Roll:

https://docs.mql4.com/ru/array/ArrayMaximum

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)
Cerca l'elemento con il valore massimo. La funzione restituisce la posizione dell'elemento massimo nella matrice.
Parametri:
array[] - array numerico, che viene cercato.
count - Numero di elementi da cercare.
Start - L'indice di partenza per la ricerca.
Esempio:
double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int maxValueIdx=ArrayMaximum(num_array);
Print("Valore massimo = ", num_array[maxValueIdx]);


Ma, sotto forma di

int Max [N] = {A,.....,N};

l'array non viene creato.

Dove: A,......N sono le variabili date dello stesso tipo. Numero di variabili = N

 

Esempio di creazione di un array di stringhe da variabili esterne (script):

extern string sym1="GBPUSD";
extern string sym2="GBPJPY";
extern string sym3="EURUSD";
extern string sym4="EURJPY";
extern string sym5="AUDUSD";
extern string sym6="AUDJPY";
extern string sym7="NZDUSD";
extern string sym8="USDCAD";

string sym[8];
//+------------------------------------------------------------------+
int init(){sym[1]=sym1;sym[2]=sym2;sym[3]=sym3;sym[4]=sym4;
   sym[5]=sym5;sym[6]=sym6;sym[7]=sym7;sym[8]=sym8;return(0);}

int start(){Alert("символ  ",sym[1]);return(0);}
 
Roll:

Esempio di creazione di un array di stringhe da variabili esterne (script):


Grazie!

Ha funzionato, ma con una correzione: invece di

int init(){sym[1]=sym1;............

fare quanto segue

int init(){sym[0]=sym1;.......

e poi si contano tutti gli elementi.

 
r772ra:

Scusate l'intrusione.

topBuffer[i] dietro il ciclo e il disegno, provate in questo modo:

La tua opzione non funziona, ma un GRANDE GRAZIE per la tua attenzione, il duro lavoro e la comprensione dei problemi degli altri.