[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 645

 
artmedia70:

Il n'y a presque aucune logique - la simple sortie des lignes dans l'ordre l'une après l'autre...




J'utiliserais des fonctions pour faciliter la compréhension.

//--------------------------------------------------------------- 1 --
// Функция вывода на экран графических сообщений.
//--------------------------------------------------------------- 2 --
  int Informations()
  {
   int   Win_ind;                     // Номер окна индикатора
   int   x,y;
   
   trH4     =Trend_PSAR(NULL,240);  // Четырёхчасовой тренд
   trH1     =Trend_PSAR(NULL,60);   // Часовой тренд
   trM30    =Trend_PSAR(NULL,30);   // Получасовой тренд
   trM15    =Trend_PSAR(NULL,15);   // 15-ти минутный тренд

//--------------------------------------------------------------- 3 --
   Win_ind= WindowFind("Info");        // Ищем номер окна индикатора
   if (Win_ind<0)return;               // Если такого окна нет, уходим
//--------------------------------------------------------------- 4 --
   x =10; y =17;
   MyObject("Equ",         x,    y,   "Свободные средства",                   9, "Tahoma", Gold);
   MyObject("EquVal",      x*23, y,   DoubleToStr(Equ_NEW,2),                 9, "Tahoma", Yellow);

//.................................
   WindowRedraw();                      // Перерисовываем все объекты
   return;
  }


void MyObject(string Name, int X, int Y, string Text, int Size, string Srift, color CL){
   if (ObjectFind(Name)==-1)
      ObjectCreate(Name,OBJ_LABEL,1,0,0,0,0);
   ObjectSet(Name,OBJPROP_XDISTANCE,X);
   ObjectSet(Name,OBJPROP_YDISTANCE,Y);
   ObjectSetText(Name, Text, Size, Srift, CL);
}
 
ToLik_SRGV:

Je me suis également posé la question, mais je n'ai rien trouvé d'utile. En ce qui concerne l'optimisation, vous connaissez déjà le grand frein d'iCustom :), dans les indicateurs il y a une restriction sur le nombre de barres, qui peut être calculé (par IndicatorCounted() ou strictement par le nombre de barres). Dans le code, il est inutile de s'embêter avec le nombre et la complexité des différentes constructions comme if, while, etc. Vous ne gagnerez pas beaucoup, mais avec le temps et l'expérience, le code deviendra plus "beau". Eh bien, en mode visualisation, lorsque chaque "rebond" est modélisé, il sera lent dans presque tous les cas (en fonction de la complexité du système, bien sûr). J'ai lu quelque part que si les calculs complexes sont dans une dll, ce sera plus rapide, mais je ne l'ai pas vérifié. Avec dll, aussi assez de nuances.

Je me souviens que des commandes comme TimeCurrent() ralentissaient beaucoup (quand il y en a plusieurs dans le code).

- Il vaut mieux l'utiliser une fois - le mettre dans une variable, puis accéder à la variable.

 
Vinin:


J'utiliserais les fonctions pour une perception facile

Oui, bien sûr, Victor, c'est beaucoup plus lisible. Mais j'essaie déjà, dans la mesure du possible, d'écrire "de face" - c'est très lent, et dans la mesure du possible, j'essaie de gagner des millisecondes...
 
chief2000:

Je me souviens que des commandes comme TimeCurrent() étaient très lentes (lorsqu'il y en a plusieurs dans le code).

- Il vaut mieux l'utiliser une fois - le mettre dans une variable, puis accéder à la variable.

Super ! Cela vaut la peine de revoir le code et de le refaire...
 
chief2000:

Je me souviens que des commandes comme TimeCurrent() étaient très lentes (lorsqu'il y en a plusieurs dans le code).

- Il est préférable de l'utiliser une fois, c'est-à-dire de le stocker dans une variable et d'accéder ensuite à cette variable.

Comment puis-je définir correctement une telle variable afin qu'elle puisse être appelée ultérieurement ?

Je le déclare d'abord dans les variables globales

datetime CurTime ;

Et ensuite dans start()

Je lui attribue une valeur :

CurTime=TimeCurrent() ;

et j'obtiens une erreur : 'CurTime' - variable attendue.

Comment le faire correctement ?

Et une autre question : si j'assigne des valeurs à certaines variables non pas dans start() mais dans init(), est-ce qu'elles fonctionneront correctement ?

Je veux dire que certaines fonctions, par exemple TimeCurrent(), seront toujours appelées à chaque tick, si une variable est assignée à cette fonction au début de start().

 
Merde ! CurTime donne une erreur, CurrTime ne le fait pas... Quel est le problème ?
 
artmedia70:
Merde ! CurTime donne une erreur et CurrTime ne le fait pas... Quel est l'intérêt ?
Le fait est que CurTime est le nom obsolète de la fonction TimeCurrent, donc le compilateur se plaint toujours lorsqu'un nom de variable coïncide avec un nom de fonction...
 
keekkenen:
Le fait est que CurTime est le nom obsolète de la fonction TimeCurrent, donc quand un nom de variable correspond à un nom de fonction, le compilateur se plaint toujours...
Eh bien ! Merci, je le saurai à l'avenir.
 

Mes amis, mon bloc logique personnel est un peu en panne. Je n'arrive pas à décider comment me comporter dans cette situation :

Nous travaillons dans deux directions, c'est-à-dire que l'achat et la vente ont leurs propres unités de contrôle séparées. Les positions peuvent être ouvertes de manière contre-directionnelle, tout dépend de la direction dans laquelle le marché évolue dans chaque TF.

Supposons que le marché soit ouvert à la vente et à l'achat (le M5 et le M15) et qu'il se retourne soudainement dans la direction opposée, à l'opposé de la vente ouverte le M5 et le M15 (enfin, quelle que soit la situation dans le monde...). Dans ce cas, toutes les ventes ouvertes commencent à augmenter considérablement le drawdown, et puisque nous avons également des achats ouverts, il est possible de fermer certaines positions à la fois dans les achats et les ventes, pour fermer les ventes déficitaires avec des pertes minimales au détriment des achats fermés.

Je ne peux donc pas me prononcer sur la logique de cette situation. Ce qu'il devrait être ?

Au cas où, voici un exemple :


 

Chers amis, pour en revenir au sujet d'hier :

   double c1b[];
   for(i=1;i<=PeriodB;i++)
   {
   c1b[i]=iCCI(NULL,0,PeriodB,PRICE_TYPICAL,i);
   }
   double c1b_1=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,1);
   double c1b_2=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,2);
   double c1b_3=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,3);
   
   double c1s[];
   for(i=1;i<=PeriodS;i++)
   {
   c1s[i]=iCCI(NULL,0,PeriodS,PRICE_TYPICAL,i);
   }
   double c1s_1=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,1);
   double c1s_2=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,2);
   double c1s_3=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,3);

if (NormalizeDouble(c1s_1,4)>NormalizeDouble(c1s_2,4)&&NormalizeDouble(c1s_2,4)<NormalizeDouble(c1s_3,4))
//if (c1s_1>c1s_2&&c1s_2<c1s_3)
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(c1b_1,4)<NormalizeDouble(c1b_2,4)&&NormalizeDouble(c1b_2,4)>NormalizeDouble(c1b_3,4))
//if (c1b_1<c1b_2&&c1b_2>c1b_3)
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }

S'il vous plaît, dites-moi ce que signifie le message du journal de bord :

2010.06.24 17:28:26 TestGenerator : erreur de données non correspondantes (limite de volume 5357 au 2010.01.06 08:00 dépassée)