Fonctions utiles de KimIV - page 31

 
ShestkoFF писал (а) >>
Je ne le bloquerais pas, bien sûr. J'aurais laissé passer l'erreur et décidé de ce que j'en ferais.

Si vous bloquez l'EA à ce stade, il peut y avoir une position ouverte laissée par cet EA, ce qui serait un désastre.

Vous avez maintenant répondu à votre propre question sur la longue pause. Il s'agit d'attendre le signal pour ouvrir une position ou passer un ordre.

Merci, Vasily, une fois de plus, pour avoir réussi à m'égarer. Je me suis presque précipité pour réparer les codes... Et merci encore de m'avoir remis sur le droit chemin :-)

 
KimIV писал (а) >>

:-) Vous avez maintenant répondu à votre propre question concernant la longue pause. Cela permet d'attendre le signal pour ouvrir une position ou passer un ordre.

Merci, Vasily, une fois de plus, pour avoir réussi à m'égarer. Je me suis presque précipité pour réparer les codes... Et merci encore de m'avoir remis sur le droit chemin :-)

Pour être honnête, je ne comprends pas la logique.
Par exemple, nous avons placé un ordre pour 0.000001 lot. Le serveur, bien sûr, nous gifle pour ça.
Au lieu de changer le lot (en dehors de la fonction), nous faisons une pause.
En raison de cette rupture, nous pouvons perdre le signal pour placer un ordre, mais nous devrions changer le lot au lieu d'attendre.
C'est pourquoi je ne suis pas d'accord avec la pause. Nous devrions simplement laisser cette fonction et passer le code d'erreur vers le haut et le traiter là.
Si nous allons dans mon sens, nous ne manquerons peut-être pas une transaction profitable ! Et nous pourrions même obtenir une perte :)

PS : Je vous détournerai du chemin de la vérité :)

 
Je pensais que la fonction de calcul du lot devait être appelée immédiatement (plutôt que d'aller en haut), en allant en haut seulement après le dépassement du compteur d'erreurs.
 
Prival писал (а) >>
et j'ai pensé qu'il fallait appeler la fonction de calcul du lot en une seule fois (et ne pas aller au sommet), en allant au sommet seulement après le dépassement du compteur d'erreurs.

Oui, bien sûr, vous devez appeler cette fonction immédiatement, mais si une erreur se produit !!!
Sortie vers le haut J'appelle une situation où vous devez sortir de la fonction SetOrder.
Je le vois approximativement comme suit


int ticket = SetOrder(.....) ;

if (ticket > 0) {

// tout est ok

} else {

// corriger l'erreur logique

}


int SetOrder(....) // renvoie soit un ticket, soit un numéro d'erreur, uniquement avec un signe négatif.
{

int ticket = OrderSend(....)

if (ticket < 0) {

// corriger les erreurs d'ordre de jeu

}

}


Je pense donc que nous devons faire la distinction entre les erreurs de logique et les erreurs de mise en ordre. J'espère pouvoir donner un exemple de mise en œuvre aujourd'hui.
 
ShestkoFF писал (а) >>
Pour être honnête, je ne comprends pas la logique.

J'ai construit la fonction de calcul de la taille du lot de telle sorte qu'elle ne renvoie un lot incorrect (zéro) que s'il n'y a pas assez d'argent. Dans d'autres cas, le lot est normalisé et est conduit dans les limites entre les tailles minimale et maximale. S'il n'y a pas assez d'argent, nous devons attendre qu'une position soit fermée.

ShestkoFF a écrit (a) >>
Si vous avez commandé un lot de 0,000001. Notre serveur nous a sûrement donné une tape sur les doigts.

Pourquoi avons-nous fait ça ? Pourquoi avons-nous délibérément adopté la mauvaise taille de lot ? Comment pouvons-nous justifier ce comportement ?

ShestkoFF a écrit(a) >>.

Nous devrions simplement laisser cette fonction et passer le code d'erreur vers le haut et le traiter là.

Qu'est-ce que ça va nous apporter ? La taille du terrain sera-t-elle différente ? Pourquoi n'avons-nous pas eu la bonne taille de terrain tout de suite ? Donnez des raisons. Analysons...
 

Je pense simplement que votre fonction est une fonction de bibliothèque, c'est-à-dire universelle, et que vous devriez donc diviser toutes les erreurs en 2 catégories :

  • les erreurs qui doivent être traitées dans la fonction SetOrder (erreurs de connexion, requêtes...).
  • les erreurs qui doivent être traitées en dehors de la fonction SetOrder (taille de lot erronée, arrêts erronés...).

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

C'est la logique de vos experts, d'autres personnes peuvent avoir une logique différente. C'est pourquoi je mettrais l'erreur avec les mauvais lots dans le site externe
.

bloc de vérification des erreurs.

C'est ma vision de cette affaire :) Comme je l'ai écrit plus haut, j'espère pouvoir donner un exemple de mise en œuvre aujourd'hui.

 

Ma version de la mode :



int ModeInt(int array[])
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid parameter in function ModeInt(int array[]). It should be at least one element.");
      return(0);
   }
   
   int buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   int maxValue = 0;
   
   int startIndex = 0;
   int startValue = buffer[0];
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] > startValue)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = buffer[startIndex];
         }
         
         startIndex = i;
         startValue = buffer[i];
      }
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = buffer[startIndex];
   }
   
   return (maxValue);
}
 
double ModeDouble(double array[], double interval)
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid first parameter in function ModeDouble(double array[], double interval). It should be at least one element.");
      return(0);
   }
   
   if (interval <= 0) 
   {
      Print("Invalid second parameter in function ModeDouble(double array[], double interval). It should be > 0 .");
      return(0);
   }
   
   double buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   double maxValue = 0;
   
   int startIndex = 0;
   double startValue = buffer[0];
   
   double sum = startValue;
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] >= startValue + interval)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = (sum)/max;
         }
         
         startIndex = i;
         startValue = buffer[i];
         sum = 0;
      }
      sum += buffer[i];
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = (sum)/max;
   }
 
   return (maxValue);
}
 
TheXpert писал (а) >>

Ma version du mod :


Cher TheXpert, votre code semble très compact. Ce qui, bien sûr, est un gros plus ! >> Merci.

 
Comme promis, je publie ma version de la fonction.
Vous trouverez ci-joint un conseiller expert qui utilise cette fonction. J'ai utilisé AI Expert Advisor comme base.
Je n'ai pas eu le temps de vérifier la fonction par temps. En d'autres termes, je pense que le signal doit être vérifié à nouveau après 8 minutes.
Ajout de la génération d'erreurs du serveur commercial qui permettra d'examiner le fonctionnement de la fonction en détail et de détecter les erreurs.
int errTest[] = {0, 128, 0, 142, 0, 143, 0, 4, 132};
errTest - séquence d'erreurs générées, aucune erreur 0. Il s'agit d'une séquence aléatoire et il n'y a pas de piège à y trouver.


J'attends des critiques :)

Dossiers :
 
ShestkoFF писал (а) >>
Comme promis, j'affiche ma version de la fonction.
Le fichier joint contient l'EA où cette fonction est utilisée. J'ai utilisé AI Expert Advisor comme base.
Je n'ai pas eu le temps de vérifier le fonctionnement de la fonction par temps. C'est-à-dire que je pense que le signal doit être vérifié à nouveau au bout de 8 minutes.
Ajout de la génération d'erreurs du serveur commercial qui permettra d'étudier en profondeur le fonctionnement de la fonction et de détecter les erreurs.
errTest - séquence d'erreurs générées, aucune erreur 0. Il s'agit d'une séquence aléatoire et il n'y a pas de piège à trouver dans cette séquence.


J'attends les critiques :)

Je ne me soucie pas vraiment de la fonction, je peux dire une chose :), je ne vais pas être original et dire comme toujours :). -- trop surchargé.

En conséquence, le conseiller expert est devenu un code clair et net de 32KB dans lequel je n'ai pas envie de m'embrouiller.


Il y a des questions sur le code.

1. Si vous désactivez le conseiller expert, il ne fonctionnera plus jusqu'à ce qu'il soit redémarré. Pourquoi ne pas le faire attendre pendant une période relativement longue ?

2. Le réseau neuronal - tout d'abord, il ne produit jamais le signal d'un plat. Deuxièmement, comment voulez-vous qu'il optimise quelque chose, s'il n'a pas de seuil ? En manquant le seuil, vous détruisez 80% de son efficacité déjà faible (linéaire, cependant).



SZZH : Sans vouloir vous offenser, je fais office de critique au noir dans ce fil de discussion :) .