Mt4 Fin de soporte. - página 26

 

Si a alguien le gusta mi solución, que me escriba en persona. Lo perfeccionaré y lo regalaré.

Buena suerte a todos.

 
Реter Konow:

A mi solución se le puede añadir fácilmente un ciclo de símbolos, la comprobación de la apertura de una nueva barra cuando llega una cotización, etc. ¿Y qué tiene que ver la POO con esto?

Has elegido un ejemplo equivocado. Piensa en otra cosa en tu tiempo libre.

Y tú lo haces. Teniendo en cuenta que los personajes pueden cambiar - después de todo, es cierto cuando se leen los personajes.

 
Artyom Trishkin:

Hazlo. Dado que los personajes pueden cambiar - porque cuando se lee los personajes es cierto.


Bueno, ¿y si lo hago? ¿Qué dices entonces? Te voy a contar un secreto: para mí, este tipo de tareas son un auténtico juego de niños. ¿De verdad crees que no puedo hacerlo? Eso es simplemente ingenuo...

 
Реter Konow:

Bueno, ¿y si lo hago? ¿Qué dices entonces? Te voy a contar un secreto: para mí, este tipo de tareas son un auténtico juego de niños. ¿De verdad crees que no puedo hacerlo? Eso es simplemente ingenuo...

Pues hazlo ya.

 
Vitaly Muzichenko:

Artyom no ha respondido a la pregunta, pero la cuestión es esta: escribir en estilo procedimental, para que funcione correctamente

No hay duda. Cobertura para ahorrar la comparación de las operaciones de cadena, bueno, si el cliente es un maniático y va a operar en todos los símbolos simultáneamente.

Pero parece que no hay ningún otro lugar para guardar las operaciones y la memoria - todo es mínimo

void OnTimer(){

   Alert(Fn_new_bar("EURUSD", PERIOD_D1)); }

//+------------------------------------------------------------------+

uint Sp_Adler32(string line){

   ulong s1 = 1;

   ulong s2 = 0;

   uint buflength=StringLen(line);

   uchar char_array[];

   ArrayResize(char_array, buflength,0);

   StringToCharArray(line, char_array, 0, -1, CP_ACP);

   for (uint n=0; n<buflength; n++){

      s1 = (s1 + char_array[n]) % 65521;

      s2 = (s2 + s1)     % 65521;}

   return ((s2 << 16) + s1);}

//+------------------------------------------------------------------+

bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf){

   static datetime st_time[]; 

   static uint     st_id[];

   

   //---- set

   datetime new_time = iTime(symb, tf, 0);     if(new_time==0) return(false); 

   uint     new_id   = Sp_Adler32(StringConcatenate(symb,EnumToString(tf))); 

   datetime old_time = 0; 

   uint     old_id   = 0;

   

   //---- find

   int size = ArraySize(st_time); 

   for(int i=0; i<size; i++){

      if(st_id[i]!=new_id) continue; 

      old_id   = st_id  [i]; 

      old_time = st_time[i];

      break;}

   

   //----add new element

   if(old_time==0){

      ArrayResize(st_time, size+1); st_time[size]=new_time;

      ArrayResize(st_id,   size+1); st_id  [size]=new_id; }

   

   //----

   return(old_time>0 && old_time<new_time);}


 
Реter Konow:

Pido disculpas por el ligero retraso.

Esta es la primera versión de la función. Puedes perfeccionarla y desarrollarla aún más. Si observa un error, le rogamos que nos haga llegar sus comentarios.


La cuestión no está en la POO, sino en el hecho de que su código es lineal, aunque probablemente nunca lo aprenda...

 
Galina Bobro:

No hay problema. Cobertura para ahorrar la comparación de las operaciones de cadena, bueno, si el cliente es un maníaco y va a operar en todos los caracteres simultáneamente.

Pero parece que no hay ningún lugar donde guardar las operaciones y la memoria - todo es mínimo.


Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Fin de soporte de Mt4.

Artyom Trishkin, 2017.09.10 23:21

Tenía un objetivo para el resultado final de su código de estilo procedimental para trabajar en un bucle de este tipo:

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Artyom Trishkin:


Llamada mal por costumbre -bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf) es la función correcta.

 
Artyom Trishkin:

Pues hazlo ahora.


DE ACUERDO. Su solución sólo funciona con las garrapatas. El mío tiene un temporizador. ¿Crees que mi método de sincronización con las apariciones de la barra tiene un inconveniente. De acuerdo. Que sea así. Añadiré una comprobación de la llegada de una cotización antes de establecer una nueva bandera de barra. Añadiré otro parámetro a la función: un símbolo. El usuario elegirá el símbolo por el que quiere recibir el nuevo evento de barra y lo enviará a la función. La función comprobará la hora de la última cita de este símbolo. A continuación, compararemos la hora de la aparición formal del bar y la hora de la cotización y fijaremos la bandera del evento.

Acabo de empezar a estudiar este tema, pero no veo ninguna dificultad.

 
Galina Bobro:

No se trata de POO, se trata de que tu código sea lineal, aunque quizás nunca lo sepas...

Lineal, no lineal... ¿Estás hablando de nuevo de la ópera en la programación?
Razón de la queja: