Auto-apprentissage du langage MQL5 à partir de zéro - page 58

 
MrBrooklin:

J'ai créé un modèle standard. C'est là que j'ai commencé à écrire le code, et c'est ici que j'ai commencé à poster les fragments qui ont déjà été écrits. Je n'avais pas pensé au cadre algorithmique avec mes propres fonctions, merci pour l'astuce ! Merci également pour l'astuce concernant le compte de compensation !


Il existe une telle technique d'alphabétisation - elle permet d'écrire très rapidement et de manière intelligible.

En général, dans un style littéraire, écrivez dans les commentaires ce que vous allez faire (juste la séquence principale directe)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

En gros, tout. Ensuite, après chaque commentaire, vous écrivez un code de 3-5 lignes (un peu en général). L'ensemble de votre fonction, du début à la fin, doit tenir dans l'écran que vous voyez. Si vous en obtenez davantage, cela signifie que les fragments doivent être séparés en fonctions/méthodes distinctes.

Quand une chose aussi élémentaire commence à fonctionner dans le testeur, on peut généraliser, ajouter des conditions de la vie réelle, changement de pas ou de fréquence par exemple, prendre en compte les conditions du marché, il n'y a pas de limite à la perfection...

 
Maxim Kuznetsov:

abstrait, il existe une technique d'alphabétisation qui vous permet d'écrire très rapidement et clairement.

En général, dans un style littéraire, écrivez dans les commentaires ce que vous allez faire (uniquement la séquence principale directe)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

En gros, tout. Ensuite, après chaque commentaire, vous écrivez un code de 3-5 lignes (un peu en général). L'ensemble de votre fonction, du début à la fin, doit tenir dans l'écran que vous voyez. Si vous en obtenez davantage, cela signifie que les fragments doivent être séparés en fonctions/méthodes distinctes.

Quand une chose aussi élémentaire commence à fonctionner dans le testeur, on peut généraliser, ajouter des conditions de la vie réelle, changement de pas ou de fréquence par exemple, prendre en compte les conditions du marché, il n'y a pas de limite à la perfection...

Bonjour Maxim ! Vous êtes très utile avec votre conseil ! Je suis assis ici et je me demande comment remplir un modèle standard d'EE.

Salutations, Vladimir.

 
MrBrooklin:

Chers experts en programmation !

Veuillez expliquer deux questions :

  1. Première question sur le Magic Number - est-il créé dans les paramètres d'entrée seulement pour les ordres en attente et les positions ouvertes (ou seulement pour les positions ouvertes ?), ou peut-il être créé aussi pour l'EA lui-même ? Si la réponse est "oui", dans quel but cela doit-il être fait ? Cette question me laisse vraiment perplexe et je n'ai pas de bonne réponse.
  2. La deuxième question sur le numéro magique - s'il y a plus d'une position ouverte dans le graphique actuel, il est possible d'appliquer un tel paramètre d'entrée pour déterminer chaque position :

Peut-être ai-je une mauvaise compréhension de l'application du nombre magique dans la programmation tout court.

Sincèrement, Vladimir.

Lorsqu'un ordre est accepté pour être exécuté, toutes ses caractéristiques (symbole, heure, type d'ordre, ticket) sont attribuées par le terminal (demandé par l'utilisateur et attribué par le terminal) et non par l'utilisateur ; il en va de même pour la position, qui stocke des informations sur ses ordres, mais il peut y en avoir beaucoup. Et le chiffre magique est un identifiant d'utilisateur. Citation :

Lorsque nous créons une nouvelle demande en attente, nous devons la marquer d'une manière ou d'une autre - afin que le programme puisse savoir que cet ordre particulier a été placé par NAMI sur cette demande en attente particulière - c'est-à-dire que nous devons identifier et associer de manière unique un ordre ou une position à une demande en attente particulière.

NAMI est absent dans la signification. Et puis Artem met la classification des commandes dans le numéro de Magik. Pourquoi pas, les 2 premiers chiffres indiquent quelque chose, par exemple le type de commande, les 4 chiffres suivants indiquent la date de la commande.

Concernant l'algorithme de quelque chose. Définir initialement les conditions initiales. Il y a des commandes sur notre symbole et nous ne les prenons pas en compte ou nous les prenons en compte. Sans conditions initiales, il faut retravailler lors de la création de l'algorithme, et encore plus le code peut être éternel)

 
Maxim Kuznetsov:

abstrait, il existe une technique d'alphabétisation qui vous permet d'écrire très rapidement et clairement.

En général, dans le style alphabétisation-programmation, écrivez dans les commentaires ce que vous allez faire (juste la séquence principale directe) ...

... En gros, tout. Ensuite, après chaque commentaire, vous écrivez un code de 3 à 5 lignes (pas beaucoup en général). L'ensemble de la fonction, du début à la fin, doit tenir dans l'écran que vous voyez. Si vous en obtenez davantage, cela signifie que vous devez séparer les fragments en fonctions/méthodes distinctes.

Maxim, vérifiez si j'ai bien compris votre conseil ou s'il y a quelque chose que je dois ajouter ? Je veux dire la partie test, parce que je n'ai pas encore écrit les codes.

Salutations, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Maxim, voyez si j'ai bien compris votre conseil ou si je dois ajouter quelque chose ? Je veux dire la partie test, à part les codes.

Sincèrement, Vladimir.

Conditions initiales. Nous calculons qu'il y a une position sur notre symbole et nous la voyons sur le graphique.

Si nous avons une position, il n'y en a qu'une, soit acheter, soit vendre. Nous commençons donc par rechercher des positions sur notre symbole. Demander / obtenir des caractéristiques. Détermination du type de position - achat ou vente. Et ainsi de suite dans le texte.

 
Valeriy Yastremskiy:

Lorsqu'un ordre est accepté pour être exécuté, toutes ses caractéristiques (symbole, heure d'émission, type d'ordre, ticket) sont attribuées par le terminal (demandées par l'utilisateur et attribuées par le terminal), et non par l'utilisateur. Il en va de même pour la position, celle-ci stocke des informations sur ses ordres, mais il peut y en avoir plusieurs. Et le chiffre magique est un identifiant d'utilisateur. Citation :

Lorsque nous créons une nouvelle demande en attente, nous devons la marquer d'une manière ou d'une autre - afin que le programme puisse savoir que cet ordre particulier a été placé par NAMI sur cette demande en attente particulière - c'est-à-dire que nous devons identifier et associer de manière unique un ordre ou une position à une demande en attente particulière.

NAMI est absent dans la signification. Et puis Artem met la classification des commandes dans le numéro de Magik. Pourquoi pas, les 2 premiers chiffres indiquent quelque chose, par exemple le type de commande, les 4 chiffres suivants indiquent la date de la commande.

Concernant l'algorithme de quelque chose. Définir initialement les conditions initiales. Il y a des commandes sur notre symbole et nous ne les prenons pas en compte ou nous les prenons en compte. Sans les conditions initiales, il faut retravailler lors de la création de l'algorithme, et encore plus, le code peut prendre une éternité)

Merci, Valeriy, pour cette réponse détaillée. Beaucoup de choses sont devenues plus claires. Je pense la même chose de l'algorithme, mais Vassily a déjà expliqué pourquoi nous n'avons pas besoin de Magic Number dans cet EA.

Salutations, Vladimir

 
MrBrooklin:

Merci, Valery, pour cette réponse détaillée. Ça s'est beaucoup éclairci. J'ai la même opinion sur l'algorithme, mais Vasiliy a déjà expliqué pourquoi nous n'avons pas besoin de Magic Number dans cet EA.

Sincèrement, Vladimir.

Nous avons ouvert un graphique et il y a une position sur le symbole graphique, nous ne savons pas ce que c'est et nous voulons l'ouvrir au seuil de rentabilité et ensuite trawler le SL pour réduire les pertes au cas où le prix s'inverse.

 

Avec les corrections de Valery, le modèle d'EE avec commentaires a pris un nouveau look.

Salutations, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

Vladimir, tu n'as pas besoin de l'exploiter longtemps. Passons à l'action. J'ai rédigé pour vous un modèle du suivi souhaité :

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

Il suffit de remplir les fonctions avec la logique correspondant à leur nom. Comme vous pouvez le constater, le modèle est élémentaire. Et structurellement similaire au TDR.

Notez que ce code compile, c'est-à-dire que du point de vue du compilateur, il est correct. Il faut toujours tendre vers cet état : c'est-à-dire apporter de petites modifications pendant le développement, de sorte qu'après les avoir effectuées, le code puisse compiler. Essayez également de faire en sorte que le compilateur signale "0 erreur, o avertissements". Il est clair que vous ne pouvez pas exécuter le programme avec des erreurs, mais les avertissements du compilateur doivent être perçus comme la prière de notre Père : s'il y a un avertissement, il faut le corriger. Ce modèle est réalisé avec "0 erreur, o avertissements" - conservez ce statut jusqu'à la fin du développement.

Une fois que nous avons compris la logique et que nous avons compris le compilateur, tout ce qu'il nous reste à faire est d'équiper les fonctions de la logique dont nous avons besoin.

Le deuxième paramètre, la valeur de la piste, sera pour l'instant déplacé dans la prochaine version. Cela nécessitera des calculs supplémentaires. C'est pourquoi il n'est pas présent dans ce modèle. Le chalut sera ajusté à chaque tic.

 
Vasiliy Sokolov:

Vladimir, tu n'as pas besoin de l'exploiter longtemps. Passons à l'action. J'ai rédigé pour vous un modèle du suivi souhaité :

Il suffit de remplir les fonctions avec la logique correspondant à leur nom. Comme vous le voyez, le modèle est élémentaire. Et structurellement similaire au TDR.

Notez que ce code compile, c'est-à-dire que du point de vue du compilateur, il est correct. Il faut toujours tendre vers cet état : c'est-à-dire apporter de petites modifications pendant le développement, de sorte qu'après les avoir effectuées, le code puisse compiler. Essayez également de faire en sorte que le compilateur signale "0 erreur, o avertissements". Il est clair que vous ne pouvez pas exécuter le programme avec des erreurs, mais les avertissements du compilateur doivent être perçus comme la prière de notre Père : s'il y a un avertissement, il faut le corriger. Ce modèle est réalisé avec "0 erreur, o avertissements" - conservez ce statut jusqu'à la fin du développement.

Une fois que nous avons compris la logique et que nous avons compris le compilateur, il ne nous reste plus qu'à doter les fonctions de la logique nécessaire.

Le deuxième paramètre, la valeur de la piste, sera pour l'instant déplacé dans la prochaine version. Cela nécessitera des calculs supplémentaires. C'est pourquoi il n'est pas présent dans ce modèle. Le chalut sera mis à jour à chaque tic-tac.

Vasiliy, je tiens bien sûr à vous remercier pour tout le travail que vous avez accompli, mais cela ne m'aide pas à comprendre d'où viennent ces fonctions et opérateurs et, surtout, pourquoi ils sont là. Il aurait été plus correct d'aller jusqu'à l'écriture de ce code, ce que vous m'avez suggéré. Je voulais vraiment arriver à ce point moi-même et maintenant je le veux.

Je comprends que vous, comme beaucoup d'autres, en ayez assez que j'épelle constamment toutes les lignes de code et que je piétine sur place, mais le problème est que je ne comprends toujours pas comment tout est construit, de l'algorithme à l'écriture du code. Je dois ajouter la méconnaissance de l'anglais au problème, car je dois copier et coller presque tous les messages d'erreur et d'avertissement du compilateur, ainsi que d'autres mots anglais dans Google Translator. D'ailleurs, si quelqu'un a essayé d'exécuter les micro, voire nano-codes que j'ai postés dans ce fil, ils ont tous passé la compilation avec "0 erreur, 0 avertissement".

Maintenant, j'ai besoin d'un peu de temps pour réaliser, ou plutôt pour comprendre pourquoi ces fonctions et opérateurs sont apparus. Donc, en résumé, c'est une horreur silencieuse. Et je suis un mauvais élève quand je ne comprends pas les choses élémentaires.

Merci à vous et à tous les autres programmeurs de tolérer ma lenteur d'esprit. Bien que je réalise que votre patience n'est pas illimitée.

Sincèrement, Vladimir.

Raison: