Questions des débutants MQL5 MT5 MetaTrader 5 - page 1220

 
HistorySelect(xxx,TimeCurrent()+1)

Une seconde, c'est souvent la perte de la dernière transaction/commande sur le réel. Par exemple, sur de nombreuses brèches, un ordre est exécuté pendant le temps TTL, qui peut être de cinq secondes. S'il n'est pas exécuté dans les cinq secondes, l'ordre est une redirection. Ou bien elle est exécutée, mais en trois secondes.

Dans ce cas, s'il n'y a pas eu de ticks entre l'acceptation et l'exécution, un tel appel HistorySelect ne recevra pas d'informations à ce sujet.


Peut-être que le TimeCurrent devrait être égal à MathMax(LastOrder_time, MarketWatch_Time). Alors l'HistorySelect sera correct. Mais TimeCurrent est peut-être trop cher.


À propos, un tel schéma de fonctionnement de HistorySelect permet de sauter une partie de l'historique des transactions.

void OnStart()
{
  static MqlTick PrevTick = {0};
  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    if (HistorySelect(PrevTick.time, INT_MAX))
      // Учитываем новые ордера/сделки в Истории торгов

    PrevTick = Tick;  
  }
}

Bien que, à première vue, tout soit clair.


Écrire un DealsTotal() bon marché n'est pas facile dans MT5. Ce n'est pas la fonction élémentaire (et gratuite) OrdersHistoryTotal() dans MT4.

 

des pensées à voix haute, sans prétention à la pertinence ou à la compétence :


fxsaber:

S'il n'y a pas eu de ticks entre l'acceptation et l'exécution, un tel appel à HistorySelect n'obtiendra pas d'informations à ce sujet.

Vous ne résoudrez pas ce problème, le modèle d'interaction serveur - terminal - MQL a été initialement conçu

Je n'ai pas atteint le point de vérifier dans MT5, mais dans MT4 je sais avec certitude qu'il y a des situations, quand dans la fenêtre de surveillance du marché il y a des changements de prix sur notre symbole, mais il peut n'y avoir aucun ticks ou moins qu'il y en a dans ЕА.


ok, pas grave, donc ça marche, il faut juste choisir dans la décision TS, ce qu'il advient de l'ordre en l'absence d'information du serveur à partir du moment où vous envoyez l'ordre - c'est à dire, l'ordre sera fixé ou rejeté a priori, et reçu la réponse pour confirmer cette décision préliminaire ou annuler - c'est à dire, travailler avec des informations non confirmées ou encore attendre la réponse du serveur - cette offre MQ et vous n'allez probablement pas convenir.


fxsaber:

Il n'est pas facile d'utiliser DealsTotal() bon marché dans MT5. Il ne s'agit pas de la fonction élémentaire (et gratuite) OrdersHistoryTotal() de MT4.

pas écrire ;)

ou plutôt, très probablement, vous le ferez, et vous dépenserez des ressources EA pour maintenir l'algorithme, je pense que vous devez découvrir comment fonctionne SQLite, les tests de performance MQ déclarés, le travail avec de grandes tables et des échantillons est juste le but de la base de données - le code EA sera minimaliste, tout le travail que la base de données fera, tout le travail se résume à remplir les données lors de la commande et à mettre à jour lorsque le serveur répond (synchronisation, bien sûr, lorsque vous exécutez EA, la base de données en mémoire)

 
Igor Makanu:

mais vous ne le ferez pas ;)

ou plutôt, très probablement vous écrirez et dépenserez des ressources EA pour maintenir l'algorithme, je pense que vous avez besoin de comprendre comment SQLite fonctionne, les tests de performance MQ a déclaré, le travail avec de grandes tables et des échantillons est exactement le but de la base de données - EA code sera minimaliste, tout le travail de la base de données vous fera, tout le travail sera réduit à remplir les données lors de la passation d'une commande et de mise à jour lors de la réponse du serveur (synchronisation, bien sûr au démarrage EA, la base de données en mémoire)

Il a été écrit et posté à l'origine. Il est peu probable que cela aille plus vite.

 
fxsaber:

Il a été écrit et posté à l'origine. Il est peu probable que cela aille plus vite.

Je dois avoir mal vu la tâche.

Je pensais que je devais mettre à jour la liste des ordres à partir de deux pointsOnTradeTransaction() et OnTick() , c'est pourquoi j'ai suggéré de le faire dans la base de données.

 
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(!HistoryDealSelect(trans.deal))
         return;
      bool time_to_sum_up=false;
      if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
         time_to_sum_up=true;
        }
      if(!time_to_sum_up)
         return;
      HistorySelect(0,TimeCurrent());
      int deals=HistoryDealsTotal();
      for(int i=deals-1; i>=0; i--)
        {
         if(HistoryDealGetTicket(i)==trans.deal)
           {
            Print("Found!");
            return;
           }
        }
      Print("Not Found!");
     }
   return;
  
Ce code est un extrait simplifié de mon EA.
Supposons que, dans quelques cas, le résultat de l'exécution de ce code soit de retourner "Non trouvé".
Je ne comprends pas bien pourquoi.
Pourquoi ne peut-elle pas se retrouver dans les événements qu'elle déclenche ?
L'événement de transaction envoyé par le serveur au terminal est arrivé, mais le serveur ne peut pas synchroniser simultanément l'heure correcte au terminal ?
Je crois savoir qu'une augmentation d'une seconde de la valeur de TimeCurrent() est plus que suffisante.
Je dois manquer quelque chose d'important, non ?
Je vous serais très reconnaissant de bien vouloir me signaler toute erreur de compréhension.
Объем импорта г/г - экономический индекс Японии
Объем импорта г/г - экономический индекс Японии
  • www.mql5.com
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
 
Pouvez-vous créer une méthode pour ouvrir le marché profond d'un symbole dans mql5, s'il vous plaît ? C'est important lorsque l'on travaille avec plusieurs symboles.
 
Dmitri Custurov:

Voici mon code. Dans l'initialisation, il crée un enregistrement dans la table. Dans le corps du OnTick, il devrait immédiatement renvoyer une erreur, car j'essaie d'ajouter un enregistrement avec la même PRIMARY KEY, et après cela, la base se ferme immédiatement. Mais en même temps, je devrais voir au moins le premier enregistrement lorsque je l'ouvre, mais lorsque je l'exécute dans le testeur, il n'y est pas. Et même la table n'est pas créée. Si je l'ouvre simplement dans le terminal, tout est normal. Le premier disque est là.

Avec l'emplacement de la base de données, vous ne vous êtes pas trompé, j'espère ?

 
Aleksey Mavrin:

Vous ne vous trompez pas sur l'emplacement de la base, n'est-ce pas ?

Non, bien sûr que non. Tout est dans Files. Je pense qu'en mode testeur, la base de données est créée en mémoire et détruite après le test.

 
Igor Makanu:

des pensées à voix haute, sans prétention à la pertinence ou à la compétence :

...

ou plutôt, très probablement vous écrirez et dépenserez des ressources EA pour maintenir l'algorithme, je pense que vous devez découvrir comment SQLite fonctionne, les tests de performance MQ ont déclaré, le travail avec de grandes tables et des échantillons est précisément le but de la base de données - le code EA sera minimaliste, tout le travail de la base de données vous fera, tout le travail est réduit à remplir les données lors de la passation d'une commande et la mise à jour lors de la réponse du serveur (synchronisation, bien sûr, lors de l'exécution EA, la base de données en mémoire)

Et quelle base de données fera tout votre travail ? Tu peux me le dire ?

 

Sur un terminal, on passe uniquement des ordres, sur l'autre (avec le même courtier et le même compte), on contrôle l'exécution. La communication se fait soit par la base de données, soit par PUB/SUB ZMQ. Bien sûr, la base de données n'est pas SQLite. La plus appropriée à ces fins est Redis, bien sûr mon avis personnel.

Bonne chance

Raison: