Que faut-il ajouter pour une prise en charge supplémentaire des calculs mathématiques universels dans MQL5 et MQL5 Cloud Network ? - page 6

 
Renat:

Voilà le problème, Renat.

MT5 comprend clairement quand un stop loss est activé et quand un take profit est activé. // Cela peut être vu dans les commentaires des commandes et est clair dans la gestion de la plateforme elle-même.

C'est pourquoi nous avons la demande (constante). - Nous aimerions que le drapeau approprié apparaisse dans OnTradeTransaction lors de l'activation d'un SL ou TP.


Mais si cela est impossible (même théoriquement) en raison de l'absence d'une architecture de liaison appropriée, nous ferions mieux de dire simplement que l'architecture de la plate-forme ne nous permet pas de mettre un drapeau dans l'ordre envoyé à cette action pour confirmer s'il s'agit d'un SL ou d'un TP.

Bien que pour vous, il n'existe pas de mot tel que "rien n'est impossible". Vous êtes des méta-citations :)

 

En d'autres termes, en regardant la structure de la transaction https://www.mql5.com/ru/docs/constants/structures/mqltradetransaction

J'ajouterais un champ TRADE_ACTION

struct MqlTradeTransaction
  {
   ulong                         deal;             // Тикет сделки
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Тип торговой транзакции
   ENUM_TRADE_ACTION               action,            // Тип события, по какой причине выставлен ордер
   ENUM_ORDER_TYPE               order_type;       // Тип ордера
   ENUM_ORDER_STATE              order_state;      // Состояние ордера
   ENUM_DEAL_TYPE                deal_type;        // Тип сделки
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      time_expiration;  // Срок истечения ордера
   double                        price;            // Цена 
   double                        price_trigger;    // Цена срабатывания стоп-лимитного ордера
   double                        price_sl;         // Уровень Stop Loss
   double                        price_tp;         // Уровень Take Profit
   double                        volume;           // Объем в лотах
  };
les raisons pour lesquelles la commande a été passée, respectivement
SL a déclenché
TP déclenché
Sortie d'une position par Stop Out

et d'autres, s'il y en a // bien que cela puisse être tout ce dont nous avons besoin.
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции - Документация по MQL5
 
sergeev:

Il y a un point ici, Renat.

MT5 comprend clairement quand le Stop Loss est activé et quand le Take Profit est activé. // Cela peut être vu dans les commentaires de la commande et dans la plateforme elle-même.

C'est ça le problème : il ne comprend pas et ne devrait pas comprendre.

Tout passe par des files d'attente d'exécution, les ordres sont divisés en simples BUY/SELL, avec des passerelles vers les fournisseurs de liquidités et les bourses. Il est impossible de dire comment il sera exécuté (y compris partiellement) dans la réalité. Et si nous proclamons soudainement que nous garantissons l'arrêt des drapeaux, papaklass nous accusera demain dans une juste colère que "ça n'a pas marché pour moi !".

 
Renat:

C'est le problème : en réalité, ce n'est pas le cas et ça ne devrait pas l'être.

Tout fonctionne en files d'attente d'exécution, les ordres sont divisés en simples BUY/SELL, et passent par les passerelles vers les fournisseurs de liquidités et les bourses.

Oui, il se divise.

Mais cette action de fractionnement nécessite une action bien spécifique - l'activation du Stop Loss/StackProfit. Et ces actions sont traitées par le serveur de MT , et non par le terminal client.

Même si l'activation des stops n'a pas lieu dans MT, le résultat est toujours la création d'un ordre ou d'un événement réel pour MT5.

Je sais que je ne peux pas entrer dans les entrailles du serveur MT5, mais assurez-vous-en une fois de plus. Est-il possible de notifier l'action sur la base de laquelle la commande est passée ?

Lorsque le serveur (ou la passerelle) active un stoploop/stackprofit/stopout, etc., la réponse est de toute façon un ordre. // Rien ne se passe sans ordre !

Et ici, sur cette commande et mettre le drapeau approprié - la raison de placer cette commande ou l'événement.

 
Peut-être aurait-il fallu introduire une nouvelle structure, spécifiquement pour la TradeTransaction ?
 
pronych:
Peut-être aurait-il fallu introduire une nouvelle structure, uniquement pour la TradeTransaction ?

Ce n'est pas si nouveau :) c'est très complet.

Il ne manque que deux champs

- identifiant de la position
- motif de la commande

 
sergeev:

Oui, il se divise.

Mais l'action pour ce fractionnement est très spécifique - activer stoploop/stackprofit. Et cette action est traitée par le serveur MT , et non par le terminal client.

La réponse est simple : il n'y a pas de garantie de signalement à 100%.

Parce qu'il existe de nombreuses sources et initiateurs de déclenchement, et qu'il n'est pas le seul serveur de négociation.

 
Renat:

La réponse est simple : il n'y a pas de garantie de signalement à 100%.

Car il y a tellement de sources et de déclencheurs, et ce n'est en aucun cas le seul serveur commercial.

L'activation d'un stop loss est-elle vraiment gérée par plusieurs serveurs commerciaux ?

Il me semble qu'un seul serveur de négociation suffit à cet effet.

Pour l'activation, un ordre est créé et la plateforme est notifiée de sa création. // par une passerelle externe
puis elle est versée. et les métiers apparaissent.
Il est compréhensible que la commande ne soit pas remplie, et que le reste soit retiré.
Mais au moment de la création de cet ordre, nous pouvons ajouter à la transaction un drapeau indiquant qu'il s'agit d'un ordre stop loss.
Le plus important est l'événement lui-même, à savoir qu'il s'agit d'un ordre pour un stop loss.

Ou dans MT, il peut y avoir des transactions sans ordre si le stop loss est géré par la passerelle ?

Mais vous le savez bien, je ne discuterai pas. C'est un point très subtil.
 

papaklass:

Et qui fait toute la conversation ?

Définitivement toi.

Vous essayez de troller. À quoi bon ?

Tenez-vous bien.

 
Renat:

Pour notre part, nous réfléchissons à une communication indépendante entre agents sans terminal. Par exemple, l'un des agents peut générer des données initiales et les envoyer aux autres par fordcast.

Sans l'intervention du terminal, c'est bien.

Qui va générer les données pour cet "un des agents" ? Un script ou un indicateur pourra-t-il le faire ?

A quoi sert la communication entre les agents, éclairez les non-initiés si vous le pouvez.

J'ai déjà écrit un script pour tester les capacités de calculs mathématiques, mais certaines fonctions sont manquantes).

// все данные расчетов агентов складываются в массив структур
struct MqlCloud
  {
   enum STATUS {wait,ready,error,free};
   STATUS status; // статус выполнения задачи - выполнена, выполняется, ошибка выполнения
   double input_data[]; // массив входных данных
   double out_data[];   // массив выходных данных
  };
  
long id=AccountInfoInteger(ACCOUNT_LOGIN);  

double in_data[100];
MqlCloud result[10000];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CloudInit(id,"myprog.ex5");  // id - это кто будет платить за Cloud, myprog.ex5 - программа которая будет выполнять расчеты
   CloudData("file.dat");       // file.dat - файл с неизменными данными для расчета
   for(uint i=0; i<10000; i++)
      {
       //
       // формируем массив входных данных для расчета
          for(int n=0; n<ArraySize(in_data); n++) in_data[n]=MathRand()/SHORT_MAX; 
       //
       CloudCalculat(i,in_data); // здесь i - номер задачи, input_data - массив переменных входных данных
      }
   // выводим максимальный результат
   double max_result=0.0; 
   for(uint i=0; i<10000; i++)
      {
       if(result[i].status!=ready)
         {
          i--;
          Sleep(1000);
          continue;
         }
       max_result=MathMax(max_result,result[i].out_data[0]);
      }
   Print("Max result = ",ArrayMaximum(result[0].out_data));
  }
  
//+------------------------------------------------------------------+
void OnCloudPass(uint num_mission)
  {
   // анализируем результат выполнения задачи по ее номеру, если нужно
   double s=result[num_mission].out_data[0];
  }
//+------------------------------------------------------------------+

void CloudInit(long ID, string programm_name) {}
void CloudData(string file_dat) {}
void CloudCalculat(uint num_mission, double & idata[]) {}