[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 479

 
SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 

No sé cuál es tu lógica, conmigo esta configuración dibuja las últimas 30 barras del indicador

Una vez más, SetIndexDrawBegin() calcula las barras desde el extremo izquierdo del gráfico

comprobar antes de empezar a discutir

 
merkulov.artem:

BIEN. Trataré de esbozar la esencia del problema, tal vez alguien sugiera o ayude a implementarlo de una manera más sencilla.

Estamos trabajando en un gráfico de minutos. Tomemos la barra de un minuto (high+low/2 - valor medio de la barra) en el gráfico del 29/10/12 a las 00:00 - será un punto de referencia.

Luego comprobamos la desviación de este precio hacia arriba en 10 pips (cada desviación correcta es +1).

Cuando alcanzamos la desviación de 10 puntos desde el punto de partida - el contador +1; y empezamos a comprobar otras desviaciones, pero desde el punto, donde alcanzamos la desviación de 10 puntos, y esperamos la siguiente subida de 10 puntos en el precio.

Por ejemplo, obtenemos:

Si (punto de inicio) + 10 pips<= precio (utilizamos todos los precios posteriores de las barras desde el punto de inicio.) Obtenemos un contador = contador +1; y comenzamos el punto de inicio ya desde este punto -(punto de inicio + 10 pips).

Si (punto de inicio + 10 pips) +10 pips <= precio (se utilizan todos los precios posteriores de las barras desde el punto de referencia) obtenemos contador=Contador+1; y partimos de este punto-(punto de inicio + 10 pips) +10 pips.

Si(punto de inicio+ 10 pips+ 10 pips) + 10 pips <= precio (utilizamos todos los precios posteriores de las barras desde el punto de referencia.) obtenemos contador=Contador+1; y partimos de este punto -(punto de inicio + 10 pips+ 10pips) + 10 pips.

y así sucesivamente...

Hasta llegar a un contador de 10(contador == 10).

Y cada nuevabarra formadade 1 minuto (alto+bajo/2 - valor medio de la barra) comprobamos esta condición y esperamos hasta que el contador llegue a10 (contador == 10). Supongamos que han pasado dos días, cada nueva barra que se forma la comprobamos y cambiamos si las condiciones son correctas .....

Y cuando alcanzamos el contador =10 - emitimos el mensaje de que "Contador == 10". Fijamos el punto de partida 2 días antes del fijado originalmente por el usuario, es decir, del29/10/12 a las 00:00 al 31/10/12 a las 00:00 y repetimos el ciclo.

Repite el ciclo y avanza así por el programa.

Es decir, debemos tomar las barras recién formadas y dibujar(alto+bajo/2 - valor medio de la barra). Y comprueba las condiciones y, si son correctas, cámbialas como se ha descrito anteriormente.

¡He intentado implementarlo a través de un array, es muy confuso y da valores erróneos! Por favor, ayúdenme a implementar este algoritmo.


Aquí no se necesitan arrays para nada. ¿Es esto siquiera un Asesor Experto, un script o un indicador? La cuestión es que el código del Asesor Experto será diferente al del indicador para la realización de esta tarea.

Y aquí hay una desventaja importante. Mira, hemos marcado el punto de partida y está justo en el pico de la tendencia alcista. Supongamos que no tenemos en cuenta la lectura de esta vela en la obtención posterior de 10 puntos - llamémosla vela inicial. Entonces, la siguiente vela va hacia abajo y no cogemos ninguno de los dos niveles = punto de partida + 10 pips: el precio baja. Así que podemos decir, que estamos atascados durante mucho tiempo - el precio bajó y puede subir y bajar de todos modos - no alcanzará el nivel del punto de partida de todos modos - los osos lo han presionado fuertemente. Pero digamos que tuvimos suerte y después de 5.000 velas el precio volvió al nivel del punto de partida, e incluso subió 10 pips. Hemos perdido mucho tiempo, pero ahora podemos poner el precio igual al punto de partida + 10 puntos en la variable y esperar hasta que el precio alcance el nivel = nivel de la variable + 10 puntos... En resumen, no necesitamos todo eso - a juzgar por su descripción estamos cogiendo el nivel = punto de partida + 10*10 = punto de partida + 100 pips. Una vez alcanzado este nivel, desplazamos la fecha de inicio 2 días hacia el futuro y calculamos un nuevo punto de partida. Esto es complicado - hay una manera más fácil.

Establecemos la fecha de inicio en variables personalizadas (precedidas por extern en el código). Declarar una variable de tipo datetime. Supongamos que es la variable dt_StartDate (fecha de inicio) y luego en el bloque de inicialización le asignamos el valor almacenado en la variable personalizada. Luego buscamos la vela que coincida con esta fecha y calculamos el punto de partida utilizando su fórmula. Sin embargo, no es el punto de partida, sino el nivel de precios de partida. Declare una variable de tipo doble, por ejemplo d_StartLevel (nivel inicial) e introduzca el valor del nivel calculado en la variable. O puede ser aún más fácil - no declarar una variable, sino dibujar una línea horizontal a través del precio inicial calculado. Llamémoslo StartLevel. Ahora vamos a dibujar la segunda línea en el gráfico a una distancia = 100 puntos hacia arriba desde el nivel inicial - llamémosla OtlovLevel. Además, no necesitamos ninguna matriz - en cada tick simplemente observaremos si el precio es mayor que OtlovLevel o no. En cuanto lo sea, aumentamos el valor de la variable dt_StartDate en 2 días, calculamos de nuevo el nivel de inicio y desplazamos la línea de inicio hasta allí. A continuación, volvemos a tomar 100 puntos de la línea de salida y arrastramos la línea OtlovLevel hasta allí. Eso es todo, la tarea está resuelta. Cada vez podemos solicitar el precio al que se fija cualquier línea y compararlo con el precio actual o con el precio Alto de la vela actual.

 
midorum:

No sé cuál es tu lógica, conmigo esta configuración dibuja las últimas 30 barras del indicador

Una vez más, SetIndexDrawBegin() calcula las barras desde el extremo izquierdo del gráfico

compruébalo antes de discutir.

Así que no estoy discutiendo. Aquí tienes un vistazo. Tomemos un indicador CCI estándar. He sustituidoCCIPeriod por(Bars- CCIPeriod) en la función SetIndexDrawBegin . Sólo he cambiado el amarillo resaltado en el código...

Aquí está el código:

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Lógicamente, siCCIPeriod es 14. EntoncesSetIndexDrawBegin(0, Bars - CCIPeriod) debería dibujar sólo las 14 últimas barras. Comienza a partir del valor (Bar - 14). Pero esto es lo que veo en la pantalla

 
hoz:

Así que no estoy discutiendo. Aquí tienes un vistazo. Tome el indicador estándar CCI. He sustituidoCCIPeriod en la función SetIndexDrawBegin por(Bars- CCIPeriod). Sólo he cambiado el amarillo resaltado en el código...

Aquí está el código:

Lógicamente, siCCIPeriod es 14. EntoncesSetIndexDrawBegin(0, Bars - CCIPeriod) debería dibujar sólo las 14 últimas barras. Comienza a partir del valor (Bar - 14). Pero esto es lo que veo en la pantalla

Esto es lo que veo en la pantalla

en la parte superior el indicador nativo, abajo cambió a SetIndexDrawBegin(0, Bars-CCIPeriod);

 
midorum, mis disculpas. Mi error. El MetaEditor abrió otra terminal... Ya funciona. Gracias.
 
hoz:
midorum, mis disculpas. Mi error. El MetaEditor abrió otra terminal... Ya funciona. Gracias.
Sí, ese es el problema con el que siempre estoy luchando también: 3 terminales, y el Editor se confunde de carpetas. Mejor ejecutarlo a través del botón en el terminal y abrir el archivo en él manualmente.
 

Buen día gente, por favor denme una respuesta, cómo determinar que la vela de 15 minutos se abrió, usé una cadena alucinante, pero resultó que no siempre la vela se abre por tiempo... creo que hay una forma más sencilla de saber que la vela se abrió... pero no la entiendo...

if ((TimeMinute( TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) | (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) | (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)

 
stater:

Buen día gente, por favor denme una respuesta, cómo determinar que la vela de 15 minutos se abrió, usé una cadena alucinante, pero resultó que no siempre la vela se abre por tiempo... creo que hay una forma más sencilla de saber que la vela se abrió... pero no la entiendo...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) | (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) | (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater:

Buen día gente, por favor denme una respuesta, cómo determinar que la vela de 15 minutos se abrió, usé una cadena alucinante, pero resultó que no siempre la vela se abre por tiempo... creo que hay una forma más sencilla de saber que la vela se abrió... pero no la entiendo...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) | (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) | (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
La función devuelve true cuando aparece una nueva barra en M15
 
Vinin:

La función devuelve true cuando aparece una nueva barra en M15
¡Muchas gracias!