[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 370

 
TarasBY:

Con respecto a esta línea:

Últimamente, los DTs suelen añadir diferentes prefijos al nombre del símbolo (EURUSDm - por ejemplo) - hay que tenerlos en cuenta a la hora de referirse al entorno de mercado del símbolo.

P.D. ...Y para el estándar "EURUSD" StringSubstr ("EURUSD", 6) no será cero sino "".

Muchas gracias, Igor! No sabía lo de los DT y la carta. Puede ser una minicuenta para la "m".

¿Saben dónde tiene el JPY el coeficiente 82? Para otras monedas era 0,625 para la GBP, 0,7751937984 para el EUR

La idea es que al traducir las divisas, el coeficiente sea flotante al cambiar los tipos. ¿Por qué entonces tomar constantes?
 
Chiripaha:

Nikolai, es muy bueno que estés aprendiendo a programar y a crear programas. Pero la cuestión es que no pediste exactamente ayuda para un caso concreto y oscuro del programa, sino que esbozaste los términos de referencia para escribir el programa.

Lo que ha mostrado, en mi opinión, es, metafóricamente hablando en relación con los robots, un montón de piezas de recambio heterogéneas. No está bien en absoluto.

Así que no se puede señalar un error específico aquí, ya que todo debe ser rehecho de una manera completamente diferente. - En mi opinión, no pretendo ser más que eso.

Pero eso no es motivo para enfadarse. Sigue aprendiendo a escribir. Allí, como se dice, en lugar de usted, por supuesto, puede "comer" (para hacer el trabajo), pero usted mismo no se están convirtiendo en bien alimentados de este (es decir, no aprender). Así que adelante. Si uno camina el otro el camino.

Intenta escribir de nuevo con un enfoque diferente del problema. - A mí me ha funcionado.


Gracias por la crítica. Dígame, ¿es realista su aplicación?
 
NICK_R:
Gracias por la crítica. ¿Es realista hacer esto?

Por supuesto que sí. Pero no es precisamente una tarea sencilla. No es muy difícil, pero tampoco es fácil. - Es ideal para estudiar.
 
Chiripaha:

Muchas gracias, Igor! No sabía lo del DC y la carta. Debe ser una minicuenta - para la letra "m".

¿Sabe usted donde el JPY tiene el coeficiente de 82 ? las otras monedas tenían GBP - 0.625, EUR - 0.7751937984

La idea es que, al convertir las monedas, el coeficiente sea flotante a medida que cambien los tipos de cambio. ¿Por qué entonces tomar constantes?

Sergey, esos números no significan nada para mí, así que no tengo una respuesta a esa pregunta.

Y los prefijos en la escritura de símbolos pueden tener o no sentido.

 
TarasBY:

Sergey, estos números no significan nada para mí, así que no tengo respuesta a esta pregunta.

Y los prefijos en la escritura del símbolo pueden tener o no sentido.

DE ACUERDO. Gracias.
 

¡Buenas tardes colegas!

¿Puede decirme cómo salir del bucle (resaltado en rojo en el código)? El indicador se está ralentizando terriblemente.

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  DarkGray
#property  indicator_color2  PowderBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=3;
extern bool Show_Volume=true;
extern double coaf=0.5;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];

    double  price_up_start, price_up_end, AO_up;
    double  price_dn_start, price_dn_end, AO_dn;
    datetime time_up, time_dn, AO_time_up, AO_time_dn;
    double Vol_AO_up, Vol_AO_dn;
    int shift_up, shift_dn, dn_koaf, up_koaf, dn_koaf_round, up_koaf_round;
    
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
  //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(int i=0; i<limit; i++)   // -------------------------------------------- Основной цикл
   {
     
 //---- Awesom + Volumes
     
AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}

//----------------------------- Блок поиска значений -----------------------------------------//
 
 //-- Поиск Low & Time & Min_AO 
  if (AOBuffer3[i] < 0)
  {
 price_up_end = 0; AO_up = 0;  
 price_dn_start = Low[i]; if (price_dn_end == 0) price_dn_end = Low[i]; 
 if (price_dn_start <= price_dn_end) {price_dn_end = price_dn_start; time_dn = Time[i]; shift_dn = iBarShift(NULL, 0, time_dn);}
 if (AOBuffer3[i] <= AO_dn) {AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_dn = Time[i];}
 dn_koaf=dn_koaf_round;
 up_koaf_round++;
  }   
  
  //-- Поиск High & Time & Max_AO  
  if (AOBuffer3[i] > 0)
   {
  price_dn_end = 0; AO_dn = 0;  
  price_up_start = High[i];
  if (price_up_start >= price_up_end) {price_up_end = price_up_start; time_up = Time[i]; shift_up = iBarShift(NULL, 0, time_up);}
  if (AOBuffer3[i] >= AO_up) {AO_up = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_up = Time[i];}
  up_koaf=up_koaf_round;
  dn_koaf_round++;
   }   
 //--------------------------------- Выставляем значения --------------------------------------------//
    
   Vol_AO_up = 0; Vol_AO_dn = 0;
  if (shift_up > shift_dn)
    {
 for (int dn_br = shift_dn; dn_br <= shift_up; dn_br++)            //-------------- Перебор значений внутри основного цикла
          {
    Vol_AO_up += Volume[dn_br]; 
    SetText("Awesome_super_volumes"+up_koaf, DoubleToStr(Vol_AO_up,0), AO_time_dn, AO_dn, Blue);
          }   
  }
 
 if (shift_dn > shift_up)
    {
 for (int up_br = shift_up; up_br <= shift_dn; up_br++)            //-------------- Еще один перебор значений внутри основного цикла
          {
    Vol_AO_dn += Volume[up_br]; 
    SetText("Awesome_super_volumes"+dn_koaf, DoubleToStr(Vol_AO_dn,0), AO_time_up, AO_up, Red);
          }   
    }
 } 
           
//---- done

   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 6, "Arial Black", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }

Gracias.


 
Fox_RM:

¡Buenas tardes colegas!

¿Puede decirme cómo salir del bucle (resaltado en rojo en el código)? El indicador se está ralentizando terriblemente.

Gracias.

Aun así, te daré esta, quizás tonta, idea. Pero quizás se me ocurra una más sensata.

En cuanto a la tarea que necesita para la búsqueda final los datos en algunas barras, a continuación, en la primera búsqueda de escribir los valores de los datos en alguna matriz (o buffer - no soy muy bueno en esto).

Y después de completar la primera búsqueda, tomar los valores necesarios de este array (buffer) para obtener los datos para la segunda búsqueda.

Sólo que no estoy particularmente seguro de que esto ayude a la velocidad. Pero tampoco sé mucho sobre las causas del frenado. Me resulta difícil decir algo más calificado al respecto.

Cuáles podrían ser los pros y los contras. Lo malo es que en este caso se estima la situación en el bar no en línea, sino a posteriori, cuando los datos ya son algo inútiles. Pero... esto se compensa con el hecho de que, de hecho, cuando se recalculan los datos antiguos, ya no se necesitan en línea. Y cuando lleguen los datos actuales, serán procesados inmediatamente por la segunda enumeración. Así que no debería haber pérdida de relevancia en este caso. Y además - resolverá su tarea: deshacerse de los excesos en los excesos. : ))

Puede que haya pasado algo por alto. Toma mi idea de forma crítica. Bueno, y el mejor crítico es la práctica. Sólo tienes que escribir y comprobar qué y cómo va a funcionar. Creo que sí.

 

No hay prácticamente ninguna diferencia, sólo un proceso ligeramente diferente para obtener los puntos de control A y B. Ya lo he probado con arrays.

Entonces, entre A y B también tendría que hacer un bucle a través de las barras. No veo otra forma, por eso pregunto.

Tal vez alguien pueda darme una pista. ¿Quizás hay algo que no funciona en la lógica de la escritura del código?

 
Fox_RM:

No hay prácticamente ninguna diferencia, sólo un proceso ligeramente diferente para obtener los puntos de control A y B. Ya lo he probado con arrays.

Entonces, entre A y B también tendría que hacer un bucle a través de las barras. No veo otra forma, por eso pregunto.

Tal vez alguien pueda darme una pista. ¿Quizás hay algo que no funciona en la lógica de la escritura del código?

Sí, exactamente - tendremos que hacer un bucle con el desbordamiento de todos modos. Por lo tanto, no hay manera de evitarlo. Y lo más probable es que la pregunta se plantee de otra manera: ¿qué causa el frenazo y cómo eliminarlo?
 
Fox_RM:

¡Buenas tardes colegas!

¿Puede decirme cómo salir del bucle (resaltado en rojo en el código)? El indicador se está ralentizando terriblemente.

Gracias.

Puede agrupar el indicador en este lugar - será una pequeña optimización del indicador:

if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}

así:

if (Show_Volume==true)
{
 double nSum = Volume[i]*Point*coaf; double Vol_Arr[];  // Не знаю в этом случае можно через запятую переменные прописывать? - double nSum = Volume[i]*Point*coaf, Vol_Arr[];

 if (AOBuffer3[i]<=0) {ExtMapBuffer1[i] =  nSum; Vol_Arr[i] =  Volume[i]*Point*coaf;}
 if (AOBuffer3[i]>0)  {ExtMapBuffer1[i] = -nSum; Vol_Arr[i] = -Volume[i]*Point*coaf;}
}

Aquí está:

AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i];
// и тут
AO_up = AOBuffer3[i]*0.2+AOBuffer3[i];

Puedes cambiarlo por:

AO_dn = AOBuffer3[i]*1.2;
     // и
AO_up = AOBuffer3[i]*1.2;

Entonces, tienes "Textos" amontonados en el indicador. Antes de colocar el nuevo texto, hay que borrar los antiguos. Esto puede ralentizar mucho el indicador - tal vez esa sea la razón. Ya que se obtienen tantos de estos textos como ticks haya en los parámetros seleccionados.

Si alguien me dice cuál es la mejor manera de implementar esto en el código - porque yo mismo estoy pidiendo ayuda de codificación similar.