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

 
Chiripaha:

Des valeurs vides peuvent indiquer que le résultat de l'optimisation de certains paramètres n'est pas rentable - c'est-à-dire une perte. Essayez d'exécuter l'un des paramètres avec Visualisation et vous verrez peut-être ce résultat.

En ce qui concerne la normalisation, je ne pense pas qu'il y aura un tel effet non plus, car puisque les valeurs sont les mêmes, les chiffres mathématiques seront exactement les mêmes - donc pas de changement.

Quant à la question de savoir "comment réfléchir", il est parfois préférable de ne pas réfléchir et de repousser la question - l'idée et les pensées viendront plus tard. Vous devez donner à votre cerveau la possibilité de manœuvrer, de se reposer et de réfléchir sans se fatiguer.


1. le conseiller est rentable.

2. j'ai déjà vérifié à la main - c'est rentable sur toute la plage du paramètre. je voulais juste élargir un peu la plage et rendre le pas plus petit.

 
tara:


Le testeur ne fournit pas de résultats reproductibles avec des données inchangées, car la propagation change à son insu pendant le test.

Le remède: https://www.mql5.com/ru/forum/119830



Le spread est flottant, n'est-ce pas ?

une autre chose est qu'il doit être cimenté dans l'histoire...

en général, le résultat flotte légèrement et le nombre de transactions ne change pas... donc ce problème ne m'effraie pas trop...

L'autre chose est que l'optimiseur ne fonctionne pas du tout ! C'est ennuyeux...

voici ce que dit le testeur dans le journal.. :



2013.05.29 12:20:10 Il y a eu 8 passages effectués pendant l'optimisation, 8 résultats ont été écartés car non significatifs.

 
tara:


Le testeur ne fournit pas de résultats reproductibles avec des données inchangées, car la propagation change à son insu pendant le test.

Le remède: https://www.mql5.com/ru/forum/119830

C'est peut-être possible, mais la taille de mon écart est indiquée dans Info - et lorsque vous la modifiez, elle apparaît. Sur le testeur, je n'ai pas remarqué que l'écart flottait. Il reprend les données des paramètres standard de MarketInfo du compte courant et ne les modifie plus.

Cette cure modifie l'écart p-r afin que vous puissiez voir différents résultats d'optimisation avec différents écarts. D'après ce que j'ai compris, c'est la seule raison pour laquelle le logiciel indiqué sur le lien est nécessaire.

 
lottamer:


2013.05.29 12:20:10 Il y a eu 8 passages effectués pendant l'optimisation, 8 résultats ont été écartés car non significatifs.

Eh bien, c'est vrai - Ces résultats ont été écartés comme étant non significatifs. - C'est pourquoi il n'apparaît pas dans les résultats ou dans le graphique.
 
Chiripaha:
Eh bien, c'est vrai - ces résultats ont été marqués comme non significatifs. - C'est pourquoi il n'apparaît pas dans les résultats ou dans le graphique.



Je pense que le problème est plus profond que ça.

Ma première question hier était de savoir comment optimiser les paramètres d'une fonction utilisateur.

On m'a dit : déplacez-les vers le double externe

Je l'ai fait.

et maintenant l'optimiseur jette le résultat... je dois les avoir mal mis.

Voici le code. C'est un modificateur commun de "stop and take".

Au lieu de STOP et TAKE, il y avait les numéros 100 et 200.

J'ai changé les chiffres en STOP et TAKE

et au début du code j'ai ajouté

extern double STOP = 100 ;
extern double TAKE = 200 ;

Y a-t-il une erreur quelque part ?

(le modificateur lui-même fonctionne à 100%)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

Je regarde le code pour l'instant, mais je me permettrai quelques commentaires en cours de route.

Cette ligne n'a aucun sens :

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

Elle ne sera nécessaire que si vous avez une stratégie multi-devises, mais alors, au lieu d'une stratégie multi-devises, vous devez utiliser

Symbol()

Vous devrez utiliser d'autres valeurs prédéfinies, mais pas cette fonction normale.

Cette variable est également inutile.

total=OrdersTotal();

Parce qu'à l'intérieur de votre fonction, il n'est appliqué qu'une seule fois, dans l'énumération, qui est commentée pour une raison quelconque, et il ne fait qu'encombrer le code. - D'où la question : pourquoi avez-vous commenté l'énumération par ordre ?

Ceci :

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

mieux regroupés en général - la condition est la même. D'ailleurs, vous les avez écrits différemment par structure. - C'est la question de la perte de structure. Le style d'écriture doit être uniforme - vous pourrez alors voir la structure et les erreurs éventuelles ressortiront comme des bosses après la chute de neige.

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

D'après ce que vous avez présenté, je n'ai pas trouvé de points de principe qui pourraient affecter le résultat. Mais... Vous n'avez présenté qu'une seule fonction ici (plutôt mal écrite, sauf si vous comptez l'énumération commentée - cela se reflète dans la question). Pour dire le verdict - vous n'avez pas besoin de la fonction, vous avez besoin du code du programme, parce que vous ne savez pas où et comment se trouve la cause et vous devez la chercher. Pour ce faire, vous devez exécuter le programme dans le testeur et voir de vos propres yeux les erreurs qui peuvent se produire. Ensuite, parcourez déjà le code (ou dans l'ordre inverse) et cherchez la cause.

D'une manière générale, je peux dire que vous, Oleg, avez pas mal de laisser-aller (d'indifférence, je dirais). Cela peut conduire à 1. A l'abandon du système en cours d'utilisation. 2. Perte de structure en raison de ces déchets et difficulté à identifier et à détecter la punaise. Voici donc mon conseil. - Si possible, jetez toutes les "ordures" (excès) du code - l'erreur sera plus facile à trouver. - C'est l'erreur classique de la plupart des personnes qui demandent de l'aide : l'imprudence.

 
lottamer:


C'est probablement plus profond que ça.

Ma première question hier était de savoir comment optimiser les paramètres d'une fonction personnalisée.

On m'a dit : mettez-les dans extern double.

Je l'ai fait.

Et maintenant l'optimiseur jette le résultat... apparemment, je les ai enlevés d'une façon ou d'une autre de manière incorrecte.

Non, je pense que vous avez tort. Le testeur rejette le résultat non pas à cause des paramètres que nous avons indiqués, mais parce que les résultats ne passent pas le critère de signification.

Mais il est possible que le programme lui-même contienne une erreur. De plus, les résultats instables en sont une indication indirecte. - Cela signifie que quelque chose ne va pas. Dans ma pratique, je ne permets pas à de tels programmes d'arriver dans le monde réel. Car si quelque chose ne va pas, cela signifie que la situation est incontrôlable. Et tout peut sortir.

Les paramètres Stop-Loss et Take-Profit, par définition, sont des variables externes dans tout programme, et pas seulement parce qu'ils doivent être optimisés. Ce n'est pas comme si vous alliez entrer dans votre code chaque fois que vous voulez les modifier. Donc, peu importe que ce soit des variables externes ou internes. - Ça, c'est sûr.

 
Chiripaha:

Je regarde le code pour l'instant, mais je me permettrai quelques commentaires en cours de route.

Cette ligne n'a aucun sens :

Vous n'en aurez besoin que si vous avez une stratégie multi-devises, mais alors au lieu de

Vous devrez substituer d'autres valeurs prédéfinies, mais pas cette fonction de base.

Cette variable est également inutile.

Il n'est utilisé qu'une seule fois à l'intérieur de la fonction dans l'énumération, qui est commentée pour une raison quelconque et ne fait qu'encombrer le code. - D'où la question : pourquoi avez-vous commenté l'énumération par ordre ?

C'est ici.

En général, il serait préférable de les regrouper - la condition est la même.

Eh bien, je n'ai pas trouvé de points principaux dans ce que vous avez présenté qui pourraient affecter le résultat. Mais ... Vous n'avez présenté qu'une seule fonction ici (plutôt mal écrite, à moins que vous ne comptiez le dépassement commenté - cela se reflète dans la question). Pour dire le verdict - vous n'avez pas besoin de la fonction, vous avez besoin du code du programme, parce que vous ne savez pas où et comment se trouve la cause et vous devez la chercher. Pour ce faire, vous devez exécuter le programme dans le testeur et voir de vos propres yeux les erreurs qui peuvent se produire. Ensuite, parcourez déjà le code (ou dans l'ordre inverse) et recherchez cette cause.

De manière générale, je peux dire que vous, Oleg, faites preuve de beaucoup d'insouciance (d'indifférence, je dirais). Cela peut conduire à 1. à la mise au rebut du système en cours d'utilisation. 2. Perte de structure en raison de ces déchets et difficulté à identifier et à détecter la punaise. Voici donc mon conseil. - Si possible, jetez toutes les "ordures" (inutiles) du code - l'erreur sera plus facile à trouver. - C'est l'erreur classique de la plupart des personnes qui demandent de l'aide - l'imprudence.


Je n'ai pas écrit ce modificateur.

Je l'ai fait préparer par les bibliothèques.

L'essentiel est qu'il fonctionne à 100%.

Mais pourquoi le paramètre qu'il contient n'est pas optimisé - c'est la question......

Il n'y a pas d'erreurs de base !

Le reste du code fonctionne.

Mettez des conditions sur l'algorithme.

- acheter

-modifier

- proche

---------------------------

et essayer de prooptimiser le paramètre à l'intérieur de mon MODIFICATEUR d'ordre - c'est-à-dire stop et take.

 
Chiripaha:

Non, je pense que vous avez tort. Le testeur n'est pas mis à la porte à cause des paramètres que vous avez introduits, mais parce que les résultats ne passent pas les critères de signification.

Mais il est possible que le logiciel lui-même contienne une erreur. De plus, les résultats instables en sont une indication indirecte. - Cela signifie que quelque chose ne va pas. Dans ma pratique, je ne permets pas à de tels programmes d'arriver dans le monde réel. Car si quelque chose ne va pas, cela signifie que la situation est incontrôlable. Et tout peut sortir.

Les paramètres Stop-Loss et Take-Profit, par définition, sont des variables externes dans tout programme, et pas seulement parce qu'ils doivent être optimisés. Ce n'est pas comme si vous alliez entrer dans le code chaque fois que vous voulez les modifier. Ainsi, peu importe que les variables soient externes ou internes. - Ça, c'est sûr.

Eh bien, écoutez,

Si je ramène tout maintenant, c'est-à-dire que je supprime les paramètres externes STOP et TAKE et que j'écris des chiffres à l'intérieur de la fonction à leur place, alors l'EA a été exécuté semaine après semaine pendant 10 semaines et montre des résultats clairs.

Et si je modifie manuellement les paramètres d'arrêt et de prise - tout fonctionnera et donnera des résultats légèrement différents (c'est naturel).

Mais maintenant, pourquoi, lorsque je déplace ces paramètres en dehors du modificateur - l'optimiseur les considère comme insignifiants ?

 
lottamer:


ce modificateur n'a pas été écrit par moi.

Je l'ai fait préparer par les bibliothèques.

C'est pourquoi je ne peux pas non plus le nettoyer. L'essentiel est qu'il fonctionne à 100%.

Mais pourquoi le paramètre qu'il contient n'est pas optimisé - c'est la question......

Il n'y a pas d'erreurs de base !

Le reste du code fonctionne.

Mettez des conditions sur l'algorithme.

- acheter

-modifier

- proche

---------------------------

et essayer d'optimiser le paramètre à l'intérieur de la MODIFICATION de l'ordre - c'est-à-dire stop et take

Tant que cela fonctionne, et encore plus si c'est à 100%, il n'y a aucun problème. Pourquoi devrions-nous y chercher des erreurs ? - Cela signifie que ce n'est pas le problème ! - Et si vous cherchez une erreur, cela signifie que vous n'êtes pas sûr à 100%. Le problème n'est donc pas dans le code mais dans vos critères d'évaluation, car ils vous embrouillent aussi. (Tu as commencé : ))) Je ne fais qu'y ajouter de l'huile...)

Ce qui est présenté ici - je ne sais même pas comment l'appeler ... Probablement - une action unique gonflée à la taille d'une fonction. Dans la plupart des programmes, ce type d'application n'est pas optimal - la modification d'un bloc va avec autre chose. - Bien que. les conditions d'application puissent être différentes. Mais ce que je veux dire, c'est qu'il n'y a rien à optimiser ici... Comme il ne s'agit que d'une action.

Raison: