Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 533

 
      // AO
      if(ao) {
         CopyTime(symbol_name[st],ao_time_frame,1,1,time_buf);
         if(symbol_ao_timebar[st]!=time_buf[0]) {
            symbol_ao_timebar[st]=time_buf[0];
            double ao_buf[];
            CopyBuffer(symbol_ao_handle[st],0,enter_bar,2,ao_buf);
            if(ao_buf[1]>ao_buf[0]&&ao_buf[0]<0) symbol_ao_signal[st]=0;
            if(ao_buf[1]<ao_buf[0]&&ao_buf[0]>0) symbol_ao_signal[st]=1;
            }
         }else symbol_ao_signal[st]=2;
      
      // AC
      if(ac) {
         CopyTime(symbol_name[st],ac_time_frame,1,1,time_buf);
         if(symbol_ac_timebar[st]!=time_buf[0]) {
            symbol_ac_timebar[st]=time_buf[0];
            double ac_buf[];
            CopyBuffer(symbol_ac_handle[st],0,enter_bar,2,ac_buf);
            if(ac_buf[1]>ac_buf[0]&&ac_buf[0]<0) symbol_ac_signal[st]=0;
            if(ac_buf[1]<ac_buf[0]&&ac_buf[0]>0) symbol_ac_signal[st]=1;
            }      
         }else symbol_ac_signal[st]=2;
Salve a tutti. Ecco una domanda. C'è un pezzo di codice C'è scritto. Voglio dire che dovrebbe dire comprare o vendere, ma solo quando l'AO e l'AC sono sullo stesso piano. Compra sotto lo zero e vendi sopra lo zero.
È così? Guru, per favore aiutatemi.
La domanda è fondamentalmente questa. È un codice normale o una stronzata?
 
MASTERXAYS:
Salve a tutti. Ecco una domanda. C'è un pezzo di codice C'è scritto. Voglio dire che dovrebbe dire comprare o vendere, ma solo quando l'AO e l'AC sono sullo stesso piano. Compra sotto lo zero e vendi sopra lo zero.
È così? Per favore, aiutate i guru.
La domanda è la seguente. È un codice normale o è una stronzata?

Definirei l'intero approccio " una stronzata" .

Avete mai visto il prezzo seguire un indicatore? Inoltre, si noti che questi sono gli indicatori di B. Williams, e lui non ha fatto trading sul mercato Forex, e l'idea stessa è superata.

 
-Aleks-:
E come, scusate, si esegue questo azzeramento?
Esattamente allo stesso modo dell'azzeramento dei tipi semplici. Assegnando loro il valore 0. Non appena si assegna il valore 0 ai campi richiesti, si usa l'operazione inversa StructToTime().
 
MASTERXAYS:
Salve a tutti. Ecco una domanda. C'è un pezzo di codice C'è scritto. Voglio dire che dovrebbe dire comprare o vendere, ma solo quando l'AO e l'AC sono sullo stesso piano. Compra sotto lo zero e vendi sopra lo zero.
È così? Per favore aiutate i guru.
La domanda è fondamentalmente la seguente. È un codice normale o qualche stronzata nell'olio verde?

Leggete il mio articolo dove sono descritti i codici di costruzione dei segnali. Ma personalmente scrivo le funzioni di segnale in questo modo.

ENUM_ORDER_TYPE GetSignal(int i,ENUM_TIMEFRAMES tf)
  {
   double bbup[1];
   double bbdw[1];
   double rsi[1];
   double macd[2];
   double stoh[2];
   double Close[2];

   if(IND01[i]==INVALID_HANDLE || IND01[i]==0){IND01[i]=iBands(m_symbol,tf,BB_period,0,2,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND02[i]==INVALID_HANDLE || IND02[i]==0){IND02[i]=iRSI(m_symbol,tf,RSI_period,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND03[i]==INVALID_HANDLE || IND03[i]==0){IND03[i]=iMACD(m_symbol,tf,MACD_fast_ema_period,MACD_slow_ema_period,9,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND04[i]==INVALID_HANDLE || IND04[i]==0){IND04[i]=iStochastic(m_symbol,tf,ST_Kperiod,ST_Dperiod,ST_slowing,MODE_SMA,STO_LOWHIGH);return(WRONG_VALUE);}

   if(CopyBuffer(IND01[i],1,0,1,bbup)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND01[i],2,0,1,bbdw)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND02[i],0,0,1,rsi)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND03[i],0,0,2,macd)<2) return(WRONG_VALUE);
   if(CopyBuffer(IND04[i],0,0,2,stoh)<2) return(WRONG_VALUE);
   if(CopyClose(m_symbol,tf,0,2,Close)<2) return(WRONG_VALUE);

   if(Close[0]<bbdw[0]&& Close[1]>bbdw[0]&&  stoh[1]>stoh[0]&&  stoh[0]<20  &&  rsi[0]<30  &&  macd[1]<macd[0]) return(ORDER_TYPE_BUY);
   if(Close[0]>bbup[0]&& Close[1]<bbup[0]&&  stoh[1]<stoh[0]&&  stoh[0]>80  &&  rsi[0]>70  &&  macd[1]>macd[0]) return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Aleksey Lebedev:

Sarà 1, entrambi i tempi vengono prima arrotondati a un giorno intero, poi sottratti.

Cosa ti fa pensare che tutti i numeri nell'espressione siano arrotondati? Non è arrotondato. Ma sono d'accordo che una variabile sarà arrotondata.

E se fossero arrotondati, ho mostrato un esempio - la barra attuale di oggi e quella calcolata di ieri - 1 ora TF - la loro differenza sarebbe uguale a zero in tutti gli arrotondamenti ... Forse se arrotondiamo sempre verso l'alto...

Alexey Kozitsyn:
Esattamente come l'azzeramento dei tipi semplici. Assegnando loro 0. Non appena avete assegnato 0 ai campi richiesti, usate l'operazione inversa StructToTime().

Grazie - proverò di nuovo - gli esempi nella Guida non sono buoni...

 
-Aleks-:

Cosa ti fa pensare che tutti i numeri nell'espressione siano arrotondati? Non c'è arrotondamento. Ma la variabile è arrotondata - sono d'accordo.

E se arrotondato, ho mostrato un esempio - barra attuale di oggi e calcolato ieri - 1 ora TF - la loro differenza sarebbe uguale a zero in qualsiasi arrotondamento ... Forse se arrotondiamo sempre verso l'alto...

Quando si dividono interi (int, long, datetime ecc.) il risultato è un intero, cioè il resto viene scartato. 00:00 di oggi e 23:59:59 di ieri, la differenza sarà di 1 giorno.

 

Puoi dirmi per favore, MQL4...
Non riesco a capire, l'indicatore funziona su M5, come fare riferimento all'alto o al basso della barra precedente su H1 nel suo codice?
Come iHigh(NULL,PERIOD_H1, i) ... Il punto è determinare (mettere una freccia su/giù sul grafico M5) se la candela M5 corrente ha rotto il prezzo massimo dell'ora precedente.


 
Nel codice dell'indicatore MQL4, sostituendo la linea
for(i=pos; i<rates_total; i++) 
con
for(i=pos; i<rates_total-1; i++) 
porta al fatto che l'indicatore non è considerato nella barra corrente (non finita) - semplicemente non c'è una linea dell'indicatore sotto questa barra.
In MQL5, la barra corrente ha alcuni strani valori dell'indicatore, a volte solo 0,0000.
Cosa posso fare?
 
MikeZv:

Per favore dammi un suggerimento, MQL4...
Non riesco a capire, l'indicatore funziona su M5, come fare riferimento a High o Low della barra precedente su H1?
Come iHigh(NULL,PERIOD_H1, i) ... Il punto è determinare (mettere una freccia su/giù sul grafico M5) se la candela M5 corrente ha rotto il prezzo massimo dell'ora precedente.


MikeZv:
Nel codice dell'indicatore MQL4 sostituire la linea
con
porta al fatto che l'indicatore non è calcolato sulla barra corrente (non finita) - semplicemente non c'è una linea dell'indicatore sotto questa barra.
In MQL5, la barra corrente ha alcuni strani valori di indicatore, a volte solo 0.0000.
Cosa posso fare?

Non importa come fate girare i buffer degli indicatori lì - solo Juna può aiutare qui.

Aggiunto:

Per il tempo di debugging controlla - quale valore è nell'array time[i] - così capisci da quale estremità inizi a contare le barre e dove hai la barra "zero".

 
Karputov Vladimir

Poco hai attorcigliato i buffer dell'indicatore lì - solo Juna può aiutare qui.
... Da quale estremità iniziate il conteggio delle barre e dove avete la barra "zero".

Vladimir, grazie per aver risposto alla prima domanda, mi mancavano queste funzioni...

Ho messo lo stesso indicatore in MT4 e MT5 (ovviamente il codice è adattato ad ogni piattaforma).
Fino a zero bar i loro valori sono gli stessi, quindi apparentemente da un'estremità ... :)
E quando si disabilita il calcolo sulla barra corrente in MT4 non viene disegnato nulla sotto la barra corrente, in MT5 - valori sbagliati.

File:
mvt_Vlt.mq4  5 kb
mvt_Vlt.mq5  5 kb
Motivazione: