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

 
Igor Makanu:

Prova a porre la domanda in modo diverso, la tua domanda potrebbe non essere chiara

Cercherò di spiegare. Ma tenete presente che non sono un programmatore, praticamente.

Abbiamo un indicatore di tick che costruisce una curva sui valori di offerta.

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

Ora quello che voglio fare.

Fissare l'indicatore sul grafico. Ottiene il primo valore di bid1 al primo tick. Ricordatelo (io l'ho fatto - inserisco il secondo buffer y[0] e registro il suo valore in init()).

Al secondo tick otteniamo il secondo valore di bid2.

Poi abbiamo bisogno di ottenere la differenza di punti. delta=bid1-bid2 (ho fatto così: delta=x[0]-x[1]).

Ora aggiungete delta a y[0] e ottenete il valore di y[1], che corrisponde effettivamente al valore di bid2.

La curva dell'indicatore dovrebbe essere identica a quella che stiamo cercando, ma è tracciata utilizzando i valori calcolati delle differenze di offerta.

Questo indicatore è necessario come modello per ulteriori calcoli.

Non lanciare pietre. L'ho spiegato meglio che potevo.

Grazie.

 
Oleg Bondarev:

Cercherò di spiegare. Ma tenete presente che sono un programmatore principiante, praticamente.

Abbiamo un indicatore di tick, che costruisce una curva per valori di offerta.

Ora quello che voglio fare.

Fissare l'indicatore sul grafico. Ottiene il primo valore di bid1 al primo tick. Ricordatelo (io l'ho fatto: ho inserito il secondo buffer y[0] e prescritto il suo valore in init()).

Al secondo tick otteniamo il secondo valore di bid2.

Poi abbiamo bisogno di ottenere la differenza di punti. delta=bid1-bid2 (ho fatto così: delta=x[0]-x[1]).

Ora aggiungete delta a y[0] e ottenete il valore di y[1] che corrisponde effettivamente al valore di bid2.

La curva dell'indicatore dovrebbe essere identica all'indicatore ricercato, ma è tracciata utilizzando i valori calcolati delle differenze di offerta.

Questo indicatore è necessario come modello per ulteriori calcoli.

Non lanciare pietre. Ho cercato di spiegarlo meglio che potevo.

Grazie.

Non è chiaro cosa vuoi fare

c'è un problema qui - usi i buffer degli indicatori come un array per memorizzare i tick (Bid), la dimensione del buffer degli indicatori cambia il terminale stesso, e inoltre - il terminale sposta i buffer degli indicatori stessi all'apparizione di una nuova barra

dovreste usare un array per memorizzare i tick, e usare un buffer di indicatori per disegnare

Ho creato un codice simile al tuo, dove salvo i tick in un array

#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  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ora, dovreste aggiungere il vostro calcolo a questo codice e disegnarlo usando il buffer dell'indicatore Label1Buffer come da vostra idea

 
Sarebbe bello se aggiungessero la possibilità di cambiare le proprietà di un altro indicatore programmaticamente. Più o meno, dopo aver aggiunto (programmaticamente) un altro indicatore al grafico, è possibile impostare il suo colore, stile e spessore delle linee
 
Igor Makanu:

non è chiaro cosa vuoi fare

ecco il problema esatto - usate i buffer degli indicatori come un array per memorizzare i tick (Bid), la dimensione del buffer degli indicatori cambia il terminale stesso, e inoltre - il terminale sposta i buffer degli indicatori stessi quando appare una nuova barra

dovreste usare un array per memorizzare i tick, e usare un buffer indicatore per disegnare

Ho creato un codice simile al tuo, dove salvo i tick in un array

Ora, dovete aggiungere il vostro calcolo a questo codice e disegnarlo usando il buffer dell'indicatore Label1Buffer, come da vostra idea

Grazie per aver risposto. Vi torturerò ancora un po'.

Devo aggiungere il calcolo qui?

int OnCalculate()

Ecco il mio calcolo.

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

L'ho aggiunto e niente.

 
Yevhenii Levchenko:
Sarebbe bello se aggiungessero la possibilità di cambiare le proprietà di un altro indicatore programmaticamente. Più o meno, dopo aver aggiunto (programmaticamente) un altro indicatore al grafico, è possibile impostare il colore, lo stile e lo spessore delle linee

Usa Canvas e disegna cartoni animati.

 

Allegherò una foto in più.

ind

 
Oleg Bondarev:

Aggiunto e niente.

non è così che funziona ))))

Per disegnare usando i buffer degli indicatori in MQL, significa mettere un valore nel buffer dell'indicatore - nel mio esempio, è Label1Buffer (assegnare un valore)

nel tuo esempio assegni dei valori solo quando una condizione è soddisfatta e se la condizione non è soddisfatta? - Quindi non verrà stampato nulla.


E ancora, ho creato un "modello" dove l'array TickArr contiene i valori dei tick Bid, ma nelle tue condizioni usi i valori precedenti del buffer dell'indicatore - e chi ha messo quali valori in questi buffer?


Prova a disegnare una linea vicino al buffer dell'indicatore, poi confronterai i tick.

 
Oleg Bondarev:

Allegherò una foto in più.


E se l'angolo è invertito? Come verrebbe fatto il calcolo?

 
Oleg Bondarev:

Allegherò una foto in più.


Se dici che sei praticamente uno zero nella programmazione, allora perché ti assumi dei compiti così poco standard, forse dovresti iniziare con quelli semplici? O per migliorare la tua conoscenza delle basi? È più facile farlo fare a te, sì.
 
Igor Makanu:

non funzionerà ))))

Per disegnare usando i buffer degli indicatori in MQL, significa mettere un valore (assegnare un valore) al buffer dell'indicatore - nel mio esempio, il Label1Buffer

nel tuo esempio assegni dei valori solo quando una condizione è soddisfatta e se la condizione non è soddisfatta? - Quindi non verrà stampato nulla.


E ancora, ho creato un "modello" dove l'array TickArr contiene i valori dei tick Bid, ma nelle tue condizioni usi i valori precedenti del buffer dell'indicatore - e chi ha messo quali valori in questi buffer?


Prova a disegnare una linea dal buffer dell'indicatore, e poi confronterai i tick.

Ho avvertito che sono un hacker).

L'ho fatto in questo modo.

#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  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ora disegna il grafico in tick ma ci sono alcune interruzioni di linea.

Sto facendo un 4.