Développeurs ! Est-ce que vous testez au moins ce que vous créez ? - page 6

 
Mikalas:

Pourriez-vous me dire comment contrôler si une commande est modifiée (sans réponse du serveur) ?

La modification d'un ordre déclenche plusieurs événements et je contrôle tous ces événements ainsi que le temps pendant lequel la tâche en attente reste dans la liste en attente.

J'ai un robot fort qui effectue 500-600 transactions par session et aucune perte d'événements jusqu'à présent, c'est-à-dire que toutes les tâches de la liste d'attente sont exécutées et n'atteignent pas le contrôle du minuteur.

 
Yurich:

Par définition, un modèle d'événement ne peut être totalement fiable ; si un événement n'a pas été atteint, cela ne signifie pas qu'il ne s'est pas produit.

Si certains événements sont atteints et d'autres non, il faut alors dupliquer des blocs de code pour garantir le traitement des résultats des commandes, qui vérifieraient l'état en le comparant au précédent, etc. La question est alors la suivante : si le code de duplication fonctionne de manière absolument fiable, pourquoi utiliser un code construit sur des événements ? Pourquoi utiliser deux codes au lieu d'un seul qui ne soit pas événementiel ? Pour favoriser la redondance ?
 
Yurich:

La modification d'une commande déclenche plusieurs événements. Je contrôle tous ces événements et je contrôle également le temps pendant lequel la tâche de la liste d'attente reste sur la liste d'attente.

Mon robot forts effectue 500-600 transactions par session et il n'y a pas eu d'événements de perte jusqu'à présent, c'est-à-dire que toutes les tâches de la liste d'attente sont exécutées et n'atteignent pas le contrôle du minuteur.

Voilà qui est plus intéressant... Il n'y a donc jamais eu de cas où l'événement attendu ne s'est pas produit ?
 
C-4:
Voilà qui est plus intéressant... Il n'y a donc jamais eu de cas où un événement attendu ne s'est pas produit ?
Lorsque j'ai dit qu'il n'y avait pas de perte d'événements, je voulais dire que les tâches qui étaient placées sur la liste d'attente, attendaient leur événement (au moins un de la chaîne d'événements significatifs). Peut-être qu'il y a des pertes d'événements que Michael dit, je ne garde pas un journal des événements, mais ils n'affectent pas le fonctionnement global de mon modèle d'événement.
 

à : Michael.

En général, tant que la situation n'est pas résolue d'une manière ou d'une autre, il est plus facile pour vous d'effectuer un contrôle supplémentaire :

int dealsCount = 0;
///
/// С заданной периодичностью синхронизируем количество обработанных и поступивших трейдов.
///
void OnTimer(void)
{
   if(dealsCount != HistoryDealsTotal())
   {
      //Пришли новые трейды. их нужно обработать
      for(int i = dealsCount; i < HistoryDealsTotal(); i++)
      {
          ulong ticket = HistoryDealGetTicket(i);
          DealChecking(ticket);
      } 
   }
}

///
/// Поступило новое событие о поступлении трейда.
///
void  OnTradeTransaction(
      const MqlTradeTransaction&    trans,
      const MqlTradeRequest&        request,
      const MqlTradeResult&         result
   )
{
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     DealChecking(trans.deal);
   ...
}

///
/// Обработчик трейдов.
/// \param ticket - Уникальный идентификатор трейда, который надо обработать.
void DealChecking(int ticket)
{
   
   // Далее идет нужная обработка.
   ...
   //Трейд обработан - увеличиваем количество обработанных трейдов.
   dealsCount++;
}

Il n'y a pas de redondance dans cette implémentation car il n'y a qu'un seul gestionnaire de l'événement "nouvelle transaction". Mais il est appelé de deux manières différentes : via le timer et via l'événement OnTradeTransaction. Si la nouvelle transaction n'a pas appelé l'événement OnTradeTransaction pour une raison quelconque, une désynchronisation du montant total et du montant des transactions traitées se produira. Dans ce cas, toutes les transactions non traitées parviennent toujours au gestionnaire DealChecking via la boucle for.

Ce schéma peut être restreint pour tout événement, pas seulement pour TRADE_TRANSACTION_DEAL_ADD.
 
Mikalas:

...

P/S Et il n'y a pas besoin de "déchirer le texte" et la phrase entière commence comme ça :

En connaissant le type de transaction, vous pouvez décider d'analyser l'état actuel des ordres, des positions et des transactions dans votre compte de trading.

Vous pouvez toujours trouver plus de détails dans l'aide.

Je suis d'accord avecYurich sur tout le reste. Vous devriez probablement reconsidérer votre plan également.

 

Chers collègues !

Merci beaucoup à tous pour vos avis !

Seul un ver me ronge : à quoi sert donc la PLATE-FORME ?

 

Mikalas:

Pourquoi avez-vous besoin d'une PLATE-FORME alors ?

C'était probablement une question rhétorique :) Sinon, la réponse a déjà été donnée dans ce fil :

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

Développeurs ! Est-ce que vous testez au moins ce que vous créez ?

C-4, 2013.12.10 12:08

Je ne le recommande pas. Il est beaucoup plus facile de corriger ce bogue avec MQ que de construire un nouveau terminal pour le plaza tout seul. Vous vous enliserez dans des corrections de bogues sans fin et dans l'écriture de "fonctionnalités standard". Je parle de ma propre expérience. J'ai partiellement développé l'un de ces complexes autodidactes basés sur Stock# - le résultat est un autre "vélo" pour des tâches spécifiques. Vous feriez mieux de vous battre avec le service d'assistance, ce sera plus facile et moins cher.
Je ne suis pas non plus satisfait de tout ce qui se passe dans le terminal, par exemple l'attitude "dernier prix". Mais j'espère que lorsqu'une masse critique d'agents de change se rassemblera, MQ commencera à écouter leurs besoins.
 
ok. quelle est la véritable alternative à MT5 ?
 
Armen:
ok. quelle est la véritable alternative à MT5 ?

C'est exactement la question que vous devez vous poser avant de créer de tels fils. Avant l'arrivée de MT5, pour trader sur FORTS, vous deviez au moins écrire votre propre terminal de trading. Si vous voulez trader sur FORTS, il n'y a pas de solutions toutes faites dans ce domaine, à part Quick qui est pratiquement inutile pour l'algotrading (ceux qui ont déjà écrit des programmes sur QPile de plus de 1000 lignes comprendront de quoi je parle). Il existe un ensemble auxiliaire de bibliothèques Stock#, mais il ne s'agit pas d'un terminal de négociation à part entière "prêt à l'emploi" (exécuter et négocier). En fait, il faudra jusqu'à 6 mois à un programmeur de niveau moyen ou élevé pour créer une plateforme de trading utilisant Stock#. Le programmeur débutant sera dépassé par ce produit. Il y a aussi des terminaux comme Kofite, TSLab, WealthLab. Mais vous devez bien comprendre qu'ils ne sont pas directement pris en charge par les courtiers, et que vous devez donc vous débrouiller avec Quick + votre super plateforme de trading (avec tous les problèmes associés au transfert de données par DDE). Et si vous souhaitez travailler via le protocole PlazaII - pour 3 000 roubles par mois, le courtier vous offrira cette possibilité.

Dans le segment bourgeois, les choses ne sont pas meilleures. Tous les courtiers américains ne fournissent pas une plateforme de négociation avec possibilité d'algotrader. Il n'est pas possible de travailler avec tous les courtiers américains depuis la Russie. C'est bien s'ils vous donnent une API. Et encore une fois, nous devons écrire notre propre vélo pour cette API. En outre, les plates-formes proposées sont beaucoup trop différentes et s'adressent à des segments de marché différents. Il suffit de comparer Wealth-Lab avec ThinkOrSwim. Pas de normes, pas d'interface unifiée.

En général, si votre devise est "Je ne rêve que de paix" ou "Je fais du commerce pour tester de nouveaux logiciels et écrire le prochain vélo" - alors vous devriez vraiment chercher une autre plateforme que MetaTrader5.