Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 196

 
Alexey Viktorov:

Eh bien, je vais essayer de faire ma part pour vous éduquer davantage.

Je vous appellerai "vous" quand je l'enverrai. J'ai un instantané du pointeur...

Dites-moi, n'est-ce pas une erreur d'appeler la même fonction 5 fois sur le même tick ? Mais c'est la moitié du problème. Cette fonction passe en revue tous les ordres. Et tout ça 5 fois en une seule fois... Et je compte 4 fonctions de ce type. Nous ne savons pas comment intégrer 3 fonctions supplémentaires dans la boucle pour rechercher tous les ordres en un seul cycle.

En voici deux.

C'est...

Il est loin d'être à la traîne.

Pour comprendre cela, il faut bien comprendre la définition du terme "traînage". Je ne me souviens pas du mot exact, mais il s'agit approximativement de "Déplacer le niveau de StopLoss en suivant le prix afin de diminuer les pertes éventuelles ou d'augmenter le profit "garanti".

Et ceci

à quoi cela ressemble-t-il lorsque vous exécutez le conseiller expert ? Probablement quatre lignes... sont-ils nécessaires ?

Et la dernière chose pour aujourd'hui : vous n'êtes pas obligé d'avoir une bibliothèque dans votre tête. Il suffit de disposer d'une documentation et de savoir comment l'utiliser. Je ne me souviens toujours pas de tous les paramètres de iMA(_Symbol, _Period, ,,,,,) et je ne peux pas aller plus loin sans étudier la documentation. Et donc presque toutes les fonctions. Heureusement, il n'y a pas si longtemps, ils ont créé des infobulles qui ne sont pas d'une grande aide. Je n'essaie pas de mémoriser la façon d'écrire ces enums. Vous devez donc consulter la documentation à chaque fois.


Alexey, merci pour ces informations. Oui, j'admets que le code n'est pas optimal, je ne suis tout simplement pas un programmeur et je ne connais pas les subtilités que vous avez décrites. Je ne comprends tout simplement pas ces nuances, je ne sais pas comment optimiser tout cela, je le ferai peut-être plus tard, si je vais de l'avant. Maintenant je sais exactement que si je commence à optimiser, je ne ferai que tout casser. J'ai vu des codes d'autres EA sur mon site web - il y a tellement de choses là-dedans ! - Bien sûr, si vous êtes un codeur pro, peut-être que son code est moins exigeant pour le terminal que le mien, mais pour l'instant je ne peux pas prendre en compte vos commentaires car je ne comprends vraiment pas ces nuances d'optimisation de la programmation. Et si vous supprimez certains appels aux fonctions dans le code, il est certain que le conseiller expert commencera à s'y perdre et ouvrira des ordres alors que ce n'est pas nécessaire. J'y ai codé, testé - rien ne s'est mal passé ou n'a mal tourné, j'ai corrigé et en conséquence le code final a donné ce résultat, je n'ai pas eu le temps d'optimiser, comme vous le comprenez avec mon bagage de connaissances.

En ce qui concerne le suivi - le plus important est qu'il suive les bénéfices, à ce stade de développement, j'en suis satisfait)))). Bien sûr, j'en ai conclu que le trailing a fonctionné, mais comment le faire correctement dans cet environnement où le trailing fonctionne, aucun d'entre nous ne le mentionne, et je n'ai aucune idée à ce sujet - tout mon code est un constructeur Lego, c'est-à-dire que je l'ai assemblé à partir de matériaux de tutoriels vidéo. Bien sûr, il y a un peu de moi - il s'agit en fait de l'algorithme du conseiller expert lui-même, tandis que l'ensemble du code et des fonctions ne sont pas de ma propre invention, mais proviennent des tutoriels vidéo de TradeLikeaPro et j'ai "édité" le code exactement par analogie et pour mes propres besoins - pour mon algorithme. Au final, j'ai eu ce que j'avais.

 
geratdc:   Tout mon code est un constructeur Lego - c'est-à-dire que je l'ai assemblé à partir des matériaux des tutoriels vidéo de TradeLikeaPro, de plus, j'ai "édité" le code exactement par analogie et pour mes besoins - pour mon propre algorithme. Au final, j'ai ce que j'ai.

J'ai regardé le graphique de dépôt - j'ai été intéressé et j'ai téléchargé la première version. Je l'ai copié dans MetaEdit. J'ai deux avertissements. La première, je l'ai éliminée en remplaçant int timeprev=0 ; par datetime timeprev=0 ; car cette variable contient la date. Le second indique sur

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

J'ai enlevé les trois dernières cordes. Il se traduit proprement. Allons plus loin...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

a changé (pour plus de clarté, j'ai joint le script - exécutez-le, il vous expliquera) donc

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
Voici le résultat


Cette fonction est supprimée - elle n'est plus appelée et son corps est vide.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

J'ai essayé de l'exécuter et j'ai vu :

C'était

Je ne l'ai modifié que lorsque j'ai exécuté l'EA sur deux graphiques avec le même outil et le même slippage - pourquoi changer ce paramètre ? Puis j'y ai réfléchi et j'ai multiplié les paramètres par 10. Et j'ai supprimé la fonction OnInit. Après tout, je n'utilise que le code à cinq chiffres. Pourquoi ? Parce que l'écart à quatre chiffres est de 3 points, donc c'est 30. Et l'écart à cinq chiffres n'est que de 12.

c'est devenu plus clair.

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

J'ai coupé le haut de l'en-tête. C'est ce que j'ai laissé :

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

cette ligne juste ici.

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

l'a déplacé vers la revendication. C'est comme ça.

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

Puis j'ai jeté la description de la variable op au début et l'ai remplacée par ceci

   if (CalculateProfit()>=tp) CloseAll();

Au début de la fonction OnTick, il y a quelques lignes. Cela permet de s'assurer que le traitement n'est effectué qu'une fois par barre au lieu de chaque tick.

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

Ensuite, le MA est calculé. Cela doit être étudié en détail. A cette fin, j'ai créé un script et affiché le résultat.

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

Nous pouvons voir que le quatrième paramètre MaShift et le dernier sont additionnés, c'est-à-dire que le numéro de la barre = leur somme. Nous prenons le MA de la mesure 2, le troisième de la fin.

Je vais examiner la question de plus près. Intéressé ?

 
STARIJ:
...

Je vais continuer à chercher. Intéressé ?

Tu continues à en parler ?

C'est déjà assez - les gens suivent le sujet pour ceux qui sont intéressés et c'est du gaspillage.

Si vous voulez qu'une personne vous réponde, appelez-la dans le fil. Comme ça : @STARIJ. Mais vous n'êtes pas obligé de continuer à évoquer le sujet en modifiant votre dernier message.


 
Victor Nikolaev:

Cela signifie que quelqu'un n'a pas de chance. Encore une fois. Il s'agit d'un script, et non d'un conseiller expert ou d'un indicateur.

J'ai trouvé la solution - apparemment le terminal n'avait pas assez de mémoire - j'ai fermé quelques graphiques et ça a marché.

Merci - en effet, les calculs ont lieu.

Et si les variables ne sont pas de type int, mais bool, que faire ?

 

Bonjour, pourriez-vous me dire, s'il vous plaît :

1 - l'enregistrement se fait-il uniquement en tant que personne physique ou peut-il également se faire en tant que personne morale et y a-t-il des restrictions et des conditions ?

2 - Y a-t-il une synchronisation avec les réseaux sociaux, pour avoir un seul compte (nom d'utilisateur et mot de passe) ?

3 - J'ai également vu une fonction "mettre un widget sur votre page, partager le signal" - s'agit-il du site ou d'autre chose ?


 
Bonjour, je n'ai que récemment commencé à apprendre Mql4. Si je vous ai posé une question au mauvais endroit, veuillez me diriger vers le bon sujet. Ma question est la suivante : comment travailler avec des indicateurs qui construisent diverses zones, rectangles, etc. Je peux programmer un croisement de lignes ou un prix plus haut ou plus bas, par exemple MA.) J'ai attaché un indicateur en bas, le tampon est de quatre et il y a huit types de zones. Donc je n'arrive pas à trouver comment coder une rupture ou une sortie de ces zones.
 
STARIJ:

J'ai regardé le graphique des dépôts - j'ai été intéressé et j'ai téléchargé la première version. Je l'ai copié dans MetaEdit. J'ai deux avertissements. La première, je l'ai éliminée en remplaçant int timeprev=0 ; par datetime timeprev=0 ; car cette variable contient la date. Le second indique

*

Réponse

Peut-être est-ce dû au fait que le TP était de type int dans la leçon vidéo, mais je l'ai converti en double et donc int timeprev reste tel quel. OK, je vais le corriger, mais en quoi cela affecte-t-il le fonctionnement de l'EA ? En fait, ces barres et cette heure étaient pertinentes pour la fonction TrailingStop du tutoriel vidéo, mais comme j'ai remplacé cette fonction par la mienne, elle reste simplement une relique du code source et mon trailing stop n'est pas réellement basé sur l'heure de la barre.


J'ai supprimé les trois dernières lignes. Il se traduit proprement. Je suis allé plus loin...

Je l'ai modifié (pour plus de clarté, j'ai joint un script - exécutez-le, il vous expliquera) comme suit

Voici le résultat

*Réponse.

Où est passé ce bout de code ?

   return(INIT_SUCCEEDED);
  }

Peut-être que ça devrait être comme ça ?


void OnInit()

{

if(Chiffres == 3 || Chiffres == 5)

{

Étape *= 10 ;

TrailingStep *= 10 ;

TrailingStop *= 10 ;

Dérapage *= 10 ;

}

return(INIT_SUCCEED) ;

}

Cela signifie qu'il s'agira d'un profit en points, alors que la fonction CalculateProfit() est de type double, donc j'ai fait TakeProfit du même type pour les rendre cohérents.


J'ai supprimé cette fonction - elle n'est plus appelée et son corps est vide.

*

Réponse

Dans le code, il y a la fonction void CloseAll(). Je pensais que c'était lié d'une manière ou d'une autre à cette fonction

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

Réponse

Ok, on va l'enlever.


J'ai essayé de l'exécuter et j'ai vu :

C'était

au prix de modifications - j'ai juste ajouté des commentaires et supprimé extern de Magic

*

Réponse

Oui, peut-être que extern est redondant parce que je ne l'ai jamais modifié et Slippage non plus - tout provient du code source du tutoriel vidéo.

- nous ne le changeons que lorsque nous exécutons l'EA sur deux graphiques avec le même outil et le même slippage - pourquoi changer ce paramètre ? Puis j'y ai réfléchi et j'ai multiplié les paramètres par 10. Et j'ai supprimé la fonction OnInit. Après tout, je n'utilise que le code à cinq chiffres. Pourquoi ? Parce que l'écart à quatre chiffres est de 3 points, donc c'est 30. Sur un écart à cinq chiffres, c'est seulement 12.

*

La réponse est .

C'est le paramètre par défaut pour que l'EA fonctionne sur toutes les devises. Je vais garder Oninit ().

c'est devenu plus clair.

J'ai coupé l'en-tête en haut. Voici ce que j'ai laissé :

*

Réponse

Cet en-tête est réalisé par l'éditeur par défaut. Je vais laisser les choses en l'état, au cas où quelque chose ne passerait pas chez le courtier ou dans le terminal à cause de l'absence de ces lignes.

J'ai déplacé cette ligne

s'est déplacé vers la revendication. C'était comme ça

J'ai ensuite supprimé la description de la variable op au début et l'ai remplacée par

*

Réponse

C'est assez logique.



Au début de la fonction OnTick, il y a quelques lignes. Cela permet de s'assurer que le traitement n'est effectué qu'une fois par barre au lieu de chaque tick.

Ensuite, le MA est calculé. Cela doit être étudié en détail. Pour cela, j'ai créé un script et j'ai sorti le résultat.


Vous pouvez voir que le quatrième paramètre MaShift et le dernier paramètre sont additionnés, c'est-à-dire que le numéro de la mesure = leur somme. Nous prenons le MA de la mesure 2, le troisième de la fin.

*

Réponse

En raison du fait que j'ai changé le trailing - date-heure, la moyenne mobile n'est pas pertinente, je pense. C'est une relique du code source, j'avais l'habitude d'essayer de traîner par le dernier des 3 (trois) ordres ouverts. Le fait est que si le marché va dans une mauvaise direction par la valeur de STep, l'EA ouvre un contre-ordre et ensuite si le marché continue à aller dans la direction opposée, un troisième ordre du type de la deuxième position est ajouté, Dans ce cas, le suivi est effectué sur trois ordres à l'aide de la fonction CalculateProfit() ; toutefois, si le premier ordre s'ouvre avec succès et que le prix évolue comme il le devrait, dans cette situation, le suivi sur la barre sera effectué à l'aide de datetime comme dans le tutoriel vidéo - je répète, même sur le suivi d'un ordre à l'aide de la fonction Calculateprofit().

Je vais chercher plus loin. Intéressé ?

*

Réponse

Ouais, j'ai quelques problèmes avec le chalutage. Il semble que ce soit une traînée mais je ne veux pas que quelqu'un comprenne ce que j'ai fait avec. La fonction Trailing() fonctionne sans barres et datetime - elle fonctionne avec Trailing().

La période MA est d'environ 200, mais le fait est qu'il s'agit d'une valeur ajustable. Et le paramètre clé Valeur semble manquer - j'ai expliqué sa signification dans la description du fichier README.



Merci d'avoir pris la peine de le faire. En fait, le conseiller expert n'est pas vraiment si bon que ça, mécanique je dirais. Mais en gros, si vous le mettez en place et surveillez occasionnellement son travail, il peut être très bon. Le temps nous le dira. Probablement, ils peuvent gagner quelque chose, mais ils vont faire faillite sans même cligner des yeux et n'enverront pas de SMS. Je ne m'en suis même pas occupé, bien que mon idée était d'envoyer un SMS si le drawdown est supérieur à 30% du dépôt est arrivé - cela signifie que 3 ordres ont déjà été ouverts et que le marché a commencé le contre-mouvement, dans cette situation, ça sent la paraffine. Tous les autres cas sont résolus par le conseiller expert, s'il est ajusté en fonction de l'historique du comportement du graphique de l'instrument commercial.


J'ai effectué les changements recommandés (mais pas tous) dans le code dans le Bloc-notes pour le moment. Veuillez vérifier si j'ai corrigé le code ?

Je suis pour l'optimisation, seulement je n'ai pas envisagé les moments où vous avez supprimé oninit - j'en ai besoin pour pouvoir tester et travailler sur toutes les devises))))

Dossiers :
 
Aleksandr Verkhozin:
Bonjour, je n'ai que récemment commencé à apprendre Mql4. Si je vous ai posé une question au mauvais endroit, veuillez me diriger vers le bon sujet. Ma question est la suivante : comment travailler avec des indicateurs qui construisent diverses zones, rectangles, etc. Je peux programmer un croisement de lignes ou un prix plus haut ou plus bas, par exemple MA.) J'ai attaché un indicateur en bas, le tampon est de quatre et il y a huit types de zones. Je n'arrive donc pas à trouver comment coder une rupture ou une sortie de ces zones.

Si vous voulez savoir comment faire, vous devez consulter les exemples de programmation, mais vous ne savez pas comment faire. Vous pouvez vous demander : comment faire pour passer beaucoup de temps avec le programmeur mql4, mais vous ne savez pas comment faire). Peut-être que vous progresserez.
 

geratdc:

...
Oui, j'ai quelques questions sur le chalut. Il semble traîner, mais personne ne veut savoir ce que j'en ai fait.

...

Si vous savez, juste dans ce fil, j'ai posté un modèle pour le chalut qui utilise la valeur de l'indicateur qui lui est envoyé dans ses calculs. Cherchez, ne soyez pas paresseux.
 
geratdc:

Vous devrez peut-être télécharger les didacticiels vidéo de programmation mql4 de TradeLikeApro sur RuTracker. Je pense que le principe de base de mql4 est que vous ne devez rien faire de compliqué et que vous ne devez rien faire du tout). Peut-être que vous progresserez.


J'ai regardé la vidéo sur le travail avec l'indicateur externe, j'ai écrit un petit code pour voir les valeurs des tampons dans le testeur :

void OnTick()

{

double Buf1=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",0,1) ;

double Buf2=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",1,1) ;

double Buf3=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",2,1) ;

double Buf4=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",3,1) ;

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

Les zones apparaissent et disparaissent en mode visualisation. Mais la valeur des tampons est toujours nulle de toute façon. N'y a-t-il pas moyen de formaliser ces zones dans le code ?

Peut-être existe-t-il une fonction, autre que iCustom, qui conviendrait à de tels indicateurs ? Peut-être que quelqu'un a écrit des hiboux avec de tels indicateurs ?