La grande et terrible MT4 pour toujours (ou comment organiser une transition) - page 24

 
Artyom Trishkin:
En russe ? En espagnol ? En anglais ? Laquelle ?

naturellement dans toutes les langues que le terminal supporte

le format n'a pas d'importance - il peut s'agir d'un SB sous la forme d'une classe dont le constructeur reçoit la langue en tant que paramètre.

ou il peut s'agir d'un groupe de fonctions personnalisées dont le langage se termine par GetTxtErrDescription_RU()

ou même une fonction régulière comme GetLastError()

si vous le souhaitez


OK, oubliez ça, j'ai tout, et mon rang ne me permet pas de m'occuper du bien-être universel, laissez des personnes spécialement formées s'occuper de la convivialité et de l'ergonomie.

 

J'ai deviné pourquoi votre position est double.)))) Parce que vous avez placé deux bibliothèques dans CodeBase))))


 

Pourquoi n'aimez-vous pas GetTickCount() ; cela ne ralentit pas tout le code, contrairement à Sleep, vous pouvez au moins ajouter 500ms si le ping est élevé,

Dans mon multisymbole, pour chaque paire, un compteur séparé est activé après OrderSend, le reste de la logique continue de fonctionner.

void OnStart()
  {
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
//---
   while(1 && !IsStopped())
     {
      static uint LastOnCalculate = GetTickCount();
      if(GetTickCount() - LastOnCalculate > 5)
         //---
        {
         BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         OrderSend(BuyRequest, result);
         LastOnCalculate = GetTickCount();
         continue;
        }
      if(PositionGetTicket(0) > 0 && PositionsTotal() >= 10)
        {
         Sleep(100);
         Print(PositionsTotal());
         return;
        }
     }
  }
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
  {
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
  }
//+------------------------------------------------------------------+
 
Fast235:

Pourquoi n'aimez-vous pas GetTickCount() ; il ne ralentit pas tout le code contrairement à Sleep, vous pouvez utiliser au moins 500ms si le ping est élevé,

C'est une boucle active et ça bouffe le processeur. Que faire s'il y a 50 Expert Advisors de ce type dans le terminal ? Il y en a 8 sur un symbole où tous les 8 enverront des ordres sur l'épingle à cheveux.

 
traveller00:

C'est un cycle actif et ça mange le CPU. Que se passe-t-il s'il y a 50 Expert Advisors de ce type dans le terminal ? Il y en a 8 sur une paire où sur l'épingle à cheveux tous les 8 enverront des ordres.

Il est activé pendant une demi-seconde et seulement après l'envoi de l'ordre, il n'y a pas de commande pour lui, puis il vérifie d'abord la présence des positions ouvertes.

J'ai optimisé mon code, il est devenu plus rapide et a commencé à ouvrir 2 positions à la fois) au début Sleep a aidé, mais cela ralentissait les choses, j'ai 7 caractères
 
fxsaber:

Je n'ai pas encore essayé le style MT4 moi-même. Théoriquement, cela devrait fonctionner. Je n'ai pas encore eu l'occasion de le regarder.

Ça marche. Il était intéressant de comparer deux versions (avec et sans attente de position).


Avec une position en attente après OrderSend.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Sans attendre la position, le résultat est immédiat.

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


J'étais sûr que la deuxième variante était plus rapide. Il s'est avéré que le temps d'exécution était égal.


En attendant la position ByPass.Is(), le code a retourné false une fois, alors que sans attendre il a retourné 740 fois. Dans l'ensemble, la béquille semble fonctionner.

 
Il semble que ce soit la seule solution fonctionnelle présentée.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Le grand et le terrible MT4 pour toujours (ou comment construire votre stratégie de migration)

Igor Makanu, 2021.05.10 10:28

cela semble fonctionner :

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 30)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 30) return;
   }
}

Mais très lente, et la solution est médiocre.

Sa vitesse est correcte. Manque de synchronisation à 37 reprises.

 
fxsaber:

Sa vitesse est normale. Manque de synchronisation à 37 reprises.

J'ai vérifié sur fx : ce script a ouvert 10 ordres 5 fois rapidement, et la dernière fois, lorsque j'ai ouvert 10 ordres pendant 10 secondes sur la démo, la fermeture des ordres n'était pas rapide non plus.

Voici une égratignure sur le journal pour la commande 11143290 :

LL 0 11:19:31.444 Trades '20615687' : ordre #11143290 acheter 0.1 / 0.1 EURUSD au marché fait en 1580.643 ms

PO 0 11:19:33.621 Trades '20615687' : deal #1865643 buy 0.1 EURUSD at 1.21460 done (based on order #11143290)

CL 0 11:19:33.622 Trades '20615687' : achat sur le marché 0.1 EURUSD

JF 0 11:19:33.679 Trades '20615687' : accepté l'achat sur le marché de 0.1 EURUSD

QO 0 11:19:33.679 Trades '20615687' : achat sur le marché 0.1 EURUSD placé pour exécution.

KM 0 11:22:41.224 Trades '20615687' : marché vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460

DR 0 11:22:41.280 Trades '20615687' : marché accepté vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 Trades '20615687' : marché vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460 placé pour exécution

ON 0 11:22:43.824 Trades '20615687' : marché vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460

DO 2 11:22:43.880 Trades '20615687' : marché vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460 [L'ordre de fermer cette position existe déjà].

JN 0 11:22:46.280 Trades '20615687' : marché vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460

OL 2 11:22:46.336 Trades '20615687' : marché vendre 0.1 EURUSD, fermer #11143290 acheter 0.1 EURUSD 1.21460 [L'ordre de fermer cette position existe déjà].

 
Igor Makanu:

Je viens de vérifier sur le fx...n.

Je vais devoir jeter un coup d'oeil à ce serveur. Il serait bon de vérifier la béquille proposée ici, pour qui cela semble important.

Revenir sur ce sujet après un certain temps serait très réticent. Il est préférable de signaler les bogues dès le départ, s'il y en a.

 
fxsaber:

Je vais devoir jeter un coup d'oeil à ce serveur. Il serait bon de vérifier la béquille proposée ici, pour qui cela semble important.

Je ne voudrais pas revenir sur ce sujet après un certain temps. Il vaut mieux signaler immédiatement les bogues, le cas échéant.

Dans le PM a jeté le serveur