Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 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;
Hola a todos. He aquí una pregunta. Hay un trozo de código Dice. Quiero decir que debería decir comprar o vender, pero sólo cuando el AO y el AC están en el mismo plano. Comprar por debajo de cero y vender por encima de cero.
¿Es así? Gurús, por favor, ayuda.
La pregunta es básicamente esta. ¿Es este un código normal o una mierda?
 
MASTERXAYS:
Hola a todos. He aquí una pregunta. Hay un trozo de código Dice. Quiero decir que debería decir comprar o vender, pero sólo cuando el AO y el AC están en el mismo plano. Comprar por debajo de cero y vender por encima de cero.
¿Es así? Por favor, ayuden a los gurús.
La pregunta es la siguiente. ¿Es este un código normal o una mierda?

Yo calificaría todo el planteamiento de "mierda" .

¿Ha visto alguna vez que el precio siga a un indicador? Además, tenga en cuenta que estos son los indicadores de B. Williams, y él, como usted sabe, no operó en el mercado de divisas, y la idea misma es obsoleta.

 
-Aleks-:
¿Y cómo, lo siento, se realiza esta puesta a cero?
Exactamente igual que la puesta a cero de los tipos simples. Asignándoles un valor 0. Tan pronto como se asigna un valor 0 a los campos requeridos, se utiliza la operación inversa StructToTime().
 
MASTERXAYS:
Hola a todos. He aquí una pregunta. Hay un trozo de código Dice. Quiero decir que debería decir comprar o vender, pero sólo cuando el AO y el AC están en el mismo plano. Comprar por debajo de cero y vender por encima de cero.
¿Es así? Por favor, ayuden a los gurús.
La pregunta es básicamente la siguiente. ¿Es este un código normal o una mierda de aceite verde?

Lea mi artículo donde se describen los códigos de construcción de señales. Pero yo personalmente escribo las funciones de señal de esta manera.

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:

Será 1, ambos tiempos se redondean primero a un día entero y luego se restan.

¿Qué te hace pensar que todos los números de la expresión están redondeados? No es redondo. Estoy de acuerdo en que una variable sea redondeada.

Y si se redondean, mostré un ejemplo - la barra actual de hoy y la calculada ayer - TF de 1 hora - su diferencia sería igual a cero en todos los redondeos ... Tal vez si siempre redondeamos hacia arriba...

Alexey Kozitsyn:
Exactamente igual que la puesta a cero de los tipos simples. Asignándolos a 0. En cuanto haya asignado 0 a los campos obligatorios, utilice la operación inversa StructToTime().

Gracias - Lo intentaré de nuevo - los ejemplos en la Ayuda no son buenos...

 
-Aleks-:

¿Qué te hace pensar que todos los números de la expresión están redondeados? No hay redondeo. Pero la variable es redonda - estoy de acuerdo.

Y si se redondea, mostré un ejemplo - barra actual de hoy y barra estimada de ayer - TF de 1 hora - su diferencia sería igual a cero en todos los redondeos ... Tal vez si siempre redondeamos hacia arriba...

Al dividir enteros (int, long, datetime, etc.) el resultado es un entero, es decir, se descarta el resto. 00:00 de hoy y 23:59:59 de ayer, la diferencia será de 1 día.

 

¿Puede decirme, por favor, MQL4...
No puedo entender, el indicador funciona en M5, ¿cómo hacer referencia a la alta o baja de la barra anterior en H1 en su código?
Como iHigh(NULL,PERIOD_H1, i) ... El punto es determinar (poner una flecha arriba/abajo en el gráfico M5) si la vela M5 actual ha roto el precio Alto de la hora anterior.


 
En el código del indicador MQL4, sustituyendo la línea
for(i=pos; i<rates_total; i++) 
con
for(i=pos; i<rates_total-1; i++) 
conduce al hecho de que el indicador no se considera en la barra actual (no terminada) - simplemente no hay línea de indicador bajo esta barra.
En MQL5, la barra actual tiene algunos valores de indicador extraños, a veces sólo 0,0000.
¿Qué puedo hacer al respecto?
 
MikeZv:

Por favor, dame una pista, MQL4...
No puedo entender, el indicador funciona en M5, ¿cómo referirse a la alta o baja de la barra anterior en H1?
Como iHigh(NULL,PERIOD_H1, i) ... El punto es determinar (poner una flecha arriba/abajo en el gráfico M5) si la vela M5 actual ha roto el precio Alto de la hora anterior.


MikeZv:
En el código del indicador MQL4 sustituya la línea
con
conduce al hecho de que el indicador no se calcula en la barra actual (no terminada) - simplemente no hay línea de indicador bajo esta barra.
En MQL5, la barra actual tiene algunos valores de indicador extraños, a veces sólo 0,0000.
¿Qué puedo hacer al respecto?

No importa cómo se giren los topes de los indicadores allí - sólo Juna puede ayudar aquí.

Añadido:

Para el momento de la depuración compruebe - qué valor hay en el array time[i] - para que entienda desde qué extremo empieza a contar las barras y dónde tiene la barra "cero".

 
Karputov Vladimir

Poco se torcieron los topes de los indicadores allí - sólo Juna puede ayudar aquí.
... desde qué extremo se empieza a contar las barras y dónde se tiene la barra "cero".

Vladimir, gracias por responder a la primera pregunta, echaba de menos estas funciones...

Pongo el mismo indicador en MT4 y MT5 (por supuesto el código está adaptado a cada plataforma).
Hasta la barra cero sus valores son los mismos, así que aparentemente desde un extremo... :)
Y al desactivar el cálculo en la barra actual en MT4 no se dibuja nada bajo la barra actual, en MT5 - valores erróneos.

Archivos adjuntos:
mvt_Vlt.mq4  5 kb
mvt_Vlt.mq5  5 kb
Razón de la queja: