[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 370

 
Chiripaha:

Nikolaï, c'est très bien que tu apprennes à programmer et à créer des programmes. Mais le fait est que vous n'avez pas exactement demandé de l'aide pour un cas particulier et obscur dans le programme, mais vous avez en fait décrit le TOR pour écrire le programme.

Ce que vous avez montré, à mon avis, est métaphoriquement parlant par rapport aux robots, un tas de pièces détachées hétérogènes. Ce n'est pas bien du tout.

Il n'est donc pas possible de signaler une erreur spécifique, car tout doit être refait d'une manière totalement différente. - IMHO, je ne prétends pas être plus que cela.

Mais ce n'est pas une raison pour s'énerver. Continuez à apprendre à écrire. Là, comme on dit, à la place de vous, bien sûr, vous pouvez "manger" (pour faire le travail), mais vous-mêmes ne vous en nourrissez pas (c'est-à-dire que vous n'apprenez pas). Alors, allez-y. Si l'un marche sur le chemin de l'autre.

Essayez d'écrire à nouveau avec une approche différente du problème. - Ça a marché pour moi.


Merci pour la critique. Dites-moi, est-ce réaliste de le mettre en œuvre ?
 
NICK_R:
Merci pour la critique. Est-il réaliste de faire cela ?

Bien sûr qu'elle l'est. Mais ce n'est pas une tâche simple. Ce n'est pas très difficile, mais ce n'est pas facile non plus. - C'est parfait pour étudier.
 
Chiripaha:

Merci beaucoup, Igor ! Je ne savais pas pour le DC et la lettre. Il doit s'agir d'un mini-compte - pour la lettre "m".

Savez-vous où le JPY a le coefficient 82 ? Les autres devises avaient GBP - 0.625, EUR - 0.7751937984.

L'idée est que lorsque vous convertissez des devises, le coefficient varie en fonction de l'évolution des taux de change. Pourquoi alors prendre des constantes ?

Sergey, ces chiffres ne signifient rien pour moi, donc je n'ai pas de réponse à cette question.

Et les préfixes dans l'écriture des symboles peuvent avoir ou non un sens.

 
TarasBY:

Sergey, ces chiffres ne signifient rien pour moi, donc je n'ai pas de réponse à cette question.

Et les préfixes dans l'écriture du symbole peuvent avoir ou non un sens.

OK. Merci !
 

Bonjour, chers collègues !

Pouvez-vous me dire comment sortir de la boucle (surlignée en rouge dans le code) ? L'indicateur ralentit terriblement.

#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); 
  }

Merci !


 
Fox_RM:

Bonjour, chers collègues !

Pouvez-vous me dire comment sortir de la boucle (surlignée en rouge dans le code) ? L'indicateur ralentit terriblement.

Merci !

Je vais quand même vous donner cette idée, peut-être idiote. Mais peut-être que j'en trouverai une plus sensée.

En ce qui concerne la tâche, vous avez besoin, pour la recherche finale, des données sur certaines barres, puis, lors de la première recherche, d'écrire les valeurs des données dans un tableau (ou un tampon - je ne suis pas très doué pour cela).

Et une fois la première recherche terminée, prenez les valeurs nécessaires de ce tableau (tampon) pour obtenir les données de la deuxième recherche.

Je ne suis pas particulièrement sûr que cela puisse aider à la vitesse. Mais je ne connais pas beaucoup les causes du freinage non plus. Il m'est difficile de dire quelque chose de plus qualifié à cet égard.

Quels pourraient être les avantages et les inconvénients. L'inconvénient est que dans ce cas, vous estimez la situation sur le bar non pas en ligne, mais après coup, lorsque les données sont déjà en quelque sorte inutiles. Mais... Ceci est compensé par le fait que, en fait, lorsque vous recalculez les anciennes données, vous n'en avez plus besoin en ligne. Et lorsque les données courantes arrivent, elles sont immédiatement traitées par la 2ème énumération. Il ne devrait donc pas y avoir de perte de pertinence dans ce cas. Et en plus - il résoudra votre tâche : se débarrasser du dépassement dans le dépassement. : ))

J'ai peut-être négligé quelque chose. Prenez mon idée d'un œil critique. Eh bien, et la meilleure critique est la pratique. Il suffit d'écrire et de revérifier ce qui va marcher et comment. Je pense que oui.

 

Il n'y a pratiquement aucune différence, juste un processus légèrement différent pour obtenir les points de contrôle A et B. J'ai déjà essayé avec des tableaux.

Ensuite, entre A et B, je devrais également faire une boucle entre les barres. Je ne vois pas d'autre solution, c'est pourquoi je demande.

Peut-être que quelqu'un peut me donner un indice. Peut-être y a-t-il quelque chose qui ne va pas dans la logique de l'écriture du code ?

 
Fox_RM:

Il n'y a pratiquement aucune différence, juste un processus légèrement différent pour obtenir les points de contrôle A et B. J'ai déjà essayé avec des tableaux.

Ensuite, entre A et B, je devrais également faire une boucle entre les barres. Je ne vois pas d'autre solution, c'est pourquoi je demande.

Peut-être que quelqu'un peut me donner un indice. Peut-être y a-t-il un problème dans la logique de l'écriture du code ?

Oui, exactement - nous devrons faire une boucle avec le trop-plein de toute façon. Il n'y a donc aucun moyen de l'éviter. Et il est fort probable que la question devrait être posée différemment : quelle est la cause du freinage et comment s'en débarrasser ?
 
Fox_RM:

Bonjour, chers collègues !

Pouvez-vous me dire comment sortir de la boucle (surlignée en rouge dans le code) ? L'indicateur ralentit terriblement.

Merci !

Vous pouvez regrouper l'indicateur à cet endroit - il s'agira d'une petite optimisation de l'indicateur :

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;
}

comme ça :

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;}
}

C'est ici :

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

Vous pouvez le changer en :

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

Ensuite, vous avez des "Textes" qui s'accumulent dans l'indicateur. Avant de placer un nouveau texte, vous devez supprimer les anciens. Cela peut vraiment ralentir l'indicateur - c'est peut-être la raison. Puisque vous recevez autant de ces textes qu'il y a de ticks sur les paramètres sélectionnés.

Si quelqu'un m'indique la meilleure façon d'implémenter ceci dans le code - car je demande moi-même une aide similaire en matière de codage.

 
Fox_RM:

Il n'y a pratiquement aucune différence, juste un processus légèrement différent pour obtenir les points de contrôle A et B. J'ai déjà essayé avec des tableaux.

Ensuite, entre A et B, je devrais également faire une boucle entre les barres. Je ne vois pas d'autre solution, c'est pourquoi je demande.

Peut-être que quelqu'un peut me donner un indice. Peut-être y a-t-il un problème dans la logique de l'écriture du code ?


1) Veuillez dessiner le code sans sauvegarder les chaînes (dans un escalier).

2. Au lieu de répéter de courtes déclarations conditionnelles, utilisez la construction if(...) ... sinon...

3. Sortez l'appel de la fonction de formation d'objets graphiques de la boucle interne (frein principal).

Raison: