Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 824

 
lil_lil:

Grazie, come scrivere un ciclo per trovare il numero della barra che attraversa le due MA quando i primi due punti dell'algoritmo sono soddisfatti e ci sono valori delle due MA sulla prima barra?

/

.


Aha, hai risolto non attraverso gli array dopo tutto.

Nota: la soluzione attraverso gli array (copiando gli ultimi tre valori dagli indicatori negli array First[], Second[] e Third[]) è l'incrocio di due iMA- OnTick():

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


Nel vostro caso (un valore alla volta), il ciclo sarà come questo:

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - il valore dell'indicatore MA1 sulla barra #i, MA1_prev - il valore dell'indicatore MA1 sulla barra #i+1
MA2_curr - il valore dell'indicatore MA2 sulla barra #i, MA2_prev - il valore dell'indicatore MA2 sulla barra #i+1

Quando si ottiene un incrocio (il segnale della variabile è "-1" o "1") - il valore di i sarà il numero della barra in cui è avvenuto l'incrocio.

Questo è l'algoritmo più semplice per trovare il crossover, ma non è il più preciso.

 
Vladimir Karputov:

Sì, hai deciso di non usare gli array dopo tutto...


Grazie, il tuo altroMA Cross EA è stato usato come esempio

Voglio inserirlo sulla terza o quinta o...n barre dopo l'attraversamento

Vladimir Karputov:

Nel vostro caso (ottenendo un solo valore) il ciclo sarà come questo

Perché non c'è un'uscita dal loop quando si trova un crossover?

Queste condizioni possono essere messe fuori dal ciclo?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

Buon pomeriggio. Potreste dirmi in quale formato scaricare i dati storici dal server Finam o MFD.ru per importare lo storico delle quotazioni? Non posso assolutamente farlo. Posso solo salvarlo da txt a csv e questo è tutto.

 
Eol:

Buon pomeriggio. Potreste dirmi in quale formato scaricare i dati storici dal server Finam o MFD.ru per importare lo storico delle quotazioni? Non posso assolutamente farlo. Posso solo salvarlo da txt a csv e questo è tutto.


Non devi scaricare nulla in MetaTrader 5 :) - Non appena ti connetti al server di trading, la storia reale dei tick è disponibile per te. Guarda versoCopyTicks

 
Vladimir Karputov:

In MetaTrader 5 non è necessario scaricare nulla :) - Non appena ti connetti al server di trading, la storia reale dei tick è disponibile per te. Guarda versoCopyTicks


Ho solo bisogno di 10 anni di azioni russe. Il mio broker non mi dà tanto e difficilmente ne troverà uno.

 
5.0 Build 1755

Descrizione del problema

Buona sera, ho una domanda su MQL5 se potete aiutarmi.
Non ho ancora nessun libro di testo sul 5.
La domanda è.


#property indicator_level1 30 - Ho definito il parametro. Quando carico l'indicatore sul grafico. Ho capito.
Cambio la linea dalla funzione ColorBuffer[], se la linea scende sotto questo parametro.

Ho un problema qui. Se apro l'indicatore e cambio il parametro con un altro, anche dopo aver caricato l'indicatore la linea di livello è messa lì, ma l'indicatore la calcola usando il parametro che era impostato prima, cioè #property indicator_level1 30

Come devo affrontare questo livello per poterlo cambiare in fase di esecuzione?

- Già provato a controllare il parametro. E ricalcolare tutta la catena di indicatori.
Ma ancora non lo ridisegna come voglio io!

Aiuto!
:)

Sequenza delle operazioni

RSI.mqh

#proprietà indicatore_livello1 30

#proprietà indicatore_livello2 70


Nel codice di descrizione della Calculaite. Alla fine della linea dove la linea passa attraverso For, ho aggiunto la funzione per cambiare il colore della linea se è sotto questo livello.
ExtColorsBuffer [i] =0;
se (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Risultato atteso


Vedo lo stesso come sull'immagine ma quando apro le impostazioni e cambio il livello indicator_level1 / 2 nel processo di utilizzo dell'indicatore ottengo un ridisegno. L'indicatore è ridisegnato in modo che se la linea attraversa un livello cambia il suo colore. Ma per me è allo stesso livello di prima :)

Più informazioni

...

File:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

Descrizione del problema

Buona sera, ho una domanda su MQL5 se potete aiutarmi.
Non ho ancora nessun libro di testo sul 5.
La domanda è.


#property indicator_level1 30 - Ho definito il parametro. Quando carico l'indicatore sul grafico. Ho capito.
Cambio la linea dalla funzione ColorBuffer[], se la linea scende sotto questo parametro.

Ho un problema qui. Se apro l'indicatore e cambio il parametro con un altro, anche dopo aver caricato l'indicatore la linea di livello è messa lì, ma l'indicatore la calcola usando il parametro che era impostato prima, cioè #property indicator_level1 30

Come devo affrontare questo livello per poterlo cambiare in fase di esecuzione?

- Già provato a controllare il parametro. E ricalcolare tutta la catena di indicatori.
Ma ancora non lo ridisegna come voglio io!

Aiuto!
:)

Sequenza delle operazioni

RSI.mqh

#proprietà indicatore_livello1 30

#proprietà indicatore_livello2 70


Nel codice di descrizione della Calculaite. Alla fine della linea dove la linea passa attraverso For, ho aggiunto la funzione per cambiare il colore della linea se è sotto questo livello.
ExtColorsBuffer [i] =0;
se (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Risultato atteso


Vedo lo stesso come sull'immagine ma quando apro le impostazioni e cambio il livello indicator_level1 / 2 nel processo di utilizzo dell'indicatore ottengo un ridisegno. L'indicatore è ridisegnato in modo che se la linea attraversa un livello cambia il suo colore. Ma per me è allo stesso livello di prima :)

Più informazioni

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

Descrizione del problema

Buona sera, ho una domanda su MQL5 se potete aiutarmi.
Non ho ancora nessun libro di testo sul 5.
La domanda è.

Vorrei sapere perché non mi piace la risposta in un argomento separato.

Questo è il forum per il trading, i sistemi di trading automatico e il test delle strategie.

Ho bisogno di aiuto in MQL5 #property indicator_level

Alexey Viktorov, 2018.01.31 09:06

Igor, abbiamo entrambi torto. Non ho capito subito il compito...

Oltre alla direttiva #property potete impostare il livello dell'indicatore con la funzione

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

Di conseguenza, questo livello dovrebbe essere impostato nei parametri dell'indicatore in entrata. In questo caso, il livello sarà disegnato dal valore specificato e dovrebbe essere cambiato da questo valore.

Caso di prova

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   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[])
  {
//---
   int i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Spero che non sia difficile cambiare il colore secondo il livello definito nei parametri di input.
 

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

Bug, bug, domande

Aleksey Rodionov, 2018.02.06 16:31

Eccone uno interessante:

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


Se rimuovete %G in pintf allora il valore non verrà visualizzato, ma in Print viene visualizzato senza %G

Anche in Print viene mostrato il valore del saldo 10000.0, ma in printf solo l'intero 10000

Sono più interessato a quale sia la differenza tra Print e Printf e, soprattutto, perché non viene mostrato senza %G. Non ho capito nulla del libro di riferimento.


 

Ciao colleghi, ho una domanda, sto cercando di inserire un widget del mio segnale nella firma sul forum "forex money", ma hanno disabilitato o bloccato l'HTML, c'è un modo per convertirlo in un URL?

Ecco il codice <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>

Motivazione: