[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 317

 
Roger:


Pourquoi l'option la plus simple ne vous suffit-elle pas ?


Je suppose que parfois il faut regarder un problème sous un angle différent. Bien, merci.
 
gyfto:

hoz, à je me demandais comment raccourcir encore plus le si.Regardez : si on met une variable

on a cnt=cnt+step, où

Mais 1=cnt/cnt, a -cnt=cnt/(-1), la seule différence est le dénominateur. Rappelons maintenant que x^0=1, x^1=x, c'est-à-dire que nous pouvons mettre notre variable booléenne _if dans l'exposant, c'est-à-direstep=cnt/a*(cnt^_if); où

Mais ±a est supposé être 2*_if-1, c'est à dire

Ou nous simplifions


Wow, vous avez simplifié les choses. Je ne comprends pas votre logique.
 
J'ai pensé que nous allions descendre à si... :-)))
 
zoritch:
J'ai pensé que nous allions descendre à si... :-)))

J'ai aussi compris que je ne comprenais rien. Pas même ces icônes que je ne comprends pas... :)
 
hoz:

Les barres d'un seul signe sont en hausse, c'est-à-dire haussières.

int LastCandlesType(int trend)
{
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Comment faire en sorte que lorsqu'un paramètre de tendance est passé à cette fonction, qui sera responsable du transfert de la tendance principale supposée du moment, le calcul soit basé sur ce paramètre.

C'est-à-dire que si la tendance == baisse, la fonction dans la boucle était comme maintenant, et sila tendance == hausse, l' Open[i ] et le Close[i] étaient échangés dans la boucle, de sorte que les conditions étaient respectées. Dans ce cas, le prix de clôture de la barre sera inférieur au prix d'ouverture et la différence sera négative.

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if ((2*trend-1)*(Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if ((2*trend-1)*(Close[i] - Open[i]) < i_sizeOfSequentialCorrectionBar * pt)    // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Ou pour simplifier encore plus

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      bool _if=((2*trend-1)*(Close[i] - Open[i])>=i_sizeOfSequentialCorrectionBar * pt); cnt=cnt+cnt/((2*_if-1)*MathPow(cnt, _if));
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

Δ est la différence, c'est-à-direClose[i] - Open[i], ^ est le signe de puissance. const - constante dans cette expression, c'est-à-direi_sizeOfSequentialCorrectionBar * pt, notation mathématique standard, je n'ai rien inventé. 2*bVar-1 est similaire à±1, bVar étant ici une variable bool. Et l'expression 2*bVar-1 prend les valeurs non pas 0 et 1, mais -1 et +1.≥ est MQL4 >=, également une notation mathématique standard.step est un pas, c'est-à-dire que dans cnt++ le pas est 1, et dans cnt=0 le pas est -cnt. Quoi d'autre n'était pas clair dans les notations ?

 
Je ne sais pas comment créer des journaux, mais je suis sûr que je les obtiendrai tous en un jour. Quelques sociétés de courtage à 5 chiffres, ces journaux de la journée atteignent une taille terrifiante (1,6 gb), et l'espace sur le vps est limité. Merci d'avance.
 
M2012K:
Comment puis-je suggérer - comment faire pour que MT4 supprime automatiquement les logs gratuits (ou ne les crée pas du tout) ? Je dois utiliser des sociétés de courtage à 5 chiffres, ces journaux commencent à grossir en un jour (de 1,6 gb), et la place sur le serveur virtuel est limitée. Merci d'avance.

Vous pouvez le faire vous-même :

Bibliothèque 1, bibliothèque 2.

==============

Bien que le dernier fichier (courant) soit ouvert par le terminal. Il n'est pas facile de le supprimer. Mais vous pouvez supprimer le contenu, qui est écrit au début.

La création de journaux n'est pas désactivée.

==============

1. Créez un lien symbolique (library1) vers le dossier logs dans le dossier files.

2. Supprimez tous les fichiers inutiles à l'aide des outils MQL4.

Ouvrez le fichier actuel en utilisant MQL4. Modifiez-le selon vos besoins.

4. Fermez le dossier.

5. Vous pouvez supprimer le lien. Vous n'êtes pas obligé de le faire. Ce sera utile plus tard.

==============

Vous pouvez également créer un fichier script (BAT) et l'exécuter dans le conseiller expert. Le script est le même que ci-dessus. Seulement sans créer de lien. Travailler avec des fichiers, bien sûr, en utilisant les outils Windows.

 
M2012K:

Comment puis-je conseiller de supprimer automatiquement les journaux gratuits (ou de ne pas les créer du tout) ?

Parce que sur certains DCs à 5 chiffres, ces logs pour une journée atteignent une taille effrayante (de 1.6 gb), et l'espace sur le vps est limité. Merci d'avance.

des journaux quoi ?

Quelle est l'erreur ?

 

Bonjour ! J'ai besoin d'aide pour affiner mon robot primitif. Pour commencer, je vais vous expliquer ma stratégie simple qui permet de savoir plus clairement où l'aide est nécessaire et dans quel but.

L'essence de TS :

1. Si le prix d'ouverture est inférieur à la MA et que le prix de clôture est supérieur, nous achetons.

2. Si le prix d'ouverture est supérieur à la MA et que le prix de clôture est inférieur, nous devons vendre.

Si le prix s'est écarté de X% du prix le plus favorable, alors nous fermons l'ordre. Ceci est similaire à un stop suiveur mais au lieu de pips X% de la distance d'ouverture de l'ordre et du meilleur prix. Comme indiqué sur la photo :

AB - distance entre l'ouverture de l'ordre et le prix le plus favorable ; BC=X% de AB ; C - clôture de l'ordre.

J'ai écrit les points 1 et 2 dans le programme :

extern int period=50;
extern int ma_shift=0;
extern int Magic=666;
extern double lot=0.1;
extern int SL=150;


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  int kolpos=0;
  double ma=iMA (NULL,0,period,ma_shift,MODE_SMMA,PRICE_MEDIAN,0);
//----
   for (int pos=0; pos<OrdersTotal(); pos++)
   {
   OrderSelect (pos, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
   kolpos++;
   }
   if (kolpos==0)
   {
 
   if(Open[1]>ma && Close[1]<ma)  
   OrderSend(Symbol(),OP_SELL,lot,Bid,10,Bid+SL*Point,0,NULL,Magic,0,Red);
   if(Open[1]<ma && Close[1]>ma)  
   OrderSend(Symbol(),OP_BUY,lot,Ask,10,Ask-SL*Point,0,NULL,Magic,0,Green);
   
   }
   
   
  
//----
   return(0);
  }

De manière générale, j'ai besoin d'aide pour écrire une fonction de clôture des ordres pour mon TS (point 3) et pour adapter le code existant à la fonction.

P.S. Et je sais que le TS n'est pas bon.

 
gyfto:

Ou simplifier encore plus.

Ici, Δ signifie la différence, c'est-à-dire queClose[i] est Open[i], et ^ est un signe de degré. const - constante dans cette expression, c'est-à-direi_sizeOfSequentialCorrectionBar * pt, notation mathématique standard, je n'ai rien invent é.2*bVar-1 est similaire à±1, bVar étant ici une variable bool. Et l'expression 2*bVar-1 prend les valeurs non pas 0 et 1, mais -1 et +1.≥ est MQL4 >=, également une notation mathématique standard.step est un pas, c'est-à-dire que step est égal à 1 dans cnt++, et step est égal à -cnt dans cnt=0. Quoi d'autre n'était pas clair dans les notations ?

gyfto, merci pour l'explication. Mais il y a un point. De toute façon, nous ne pouvons pas résoudre le problème en changeant le chiffre de sortie de l'expression. À l'heure actuelle, lorsque la mise à zéro se produit, les prix d'ouverture et de clôture doivent être "échangés". C'est-à-dire qu'à mon sens, l'universalité ne peut être atteinte. C'est ce que je me suis demandé.

Vadim a écrit il y a quelque temps que mettre une fonction à l'intérieur de la boucle ralentit le code d'un ordre de grandeur. Je me demande si cela s'applique uniquement aux cas où une fonction calcule ses valeurs à chaque itération de la boucle ou à tout autre cas ? Par exemple, jusqu'à ce que je finisse d'écrire l'Expert Advisor, j'ai réécrit la fonction que j'essayais de simplifier en utilisant le schéma suivant:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                            // Счётчик идущих друг за другом свечей с..
       cntDn;                                                                                // .. требуемыми признаками
       
   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if (directionMA == CROSS_UP)
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                     // .. прибавим 1 к счётчику

         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                   // .. счётчик обнуляем

         if (cntDn == i_sequentBarsСount)                                                   // Если cnt баров в подряд медвежьи..
             return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                         // .. Выходим из функции
      }

      if (directionMA == CROSS_DN)
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                     // .. прибавим 1 к счётчику

         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                   // .. счётчик обнуляем
     
         if (cntUp == i_sequentBarsСount)                                                   // Если cnt баров в подряд бычьи..
             return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                         // .. Выходим из функции
      }
   }
}

J'ai fait en sorte que les compteurscntUp etcntDn soient différents, car ils peuventavoir une valeur à la fois, puis une autre lorsque les barres de calcul sont utilisées dans un cycle.Et le compteur peut additionner une valeur et continuer à additionner une autre valeur. Et si la variable est la même, le nombre de barres d'une caractéristique sera ajouté au compteur de barres d'une autre caractéristique.

C'est là que le conseil est nécessaire, peut-être est-il préférable de résumer d'une autre manière ?

Le problème est que le conseiller expert n'est pas encore très important. J'ai les wagons et cette fonction. J'ai l'impression qu'au lieu d'être longue, la chouette vend et vice versa. J'essaie de comprendre comment cela peut se produire. Peut-être qu'il y a un problème ici ?

Raison: