Mon approche. Le noyau est le moteur. - page 128

 
Vasiliy Sokolov:

Merde, mec, tu ne comprends vraiment pas ce qui se passe ou tu essaies de faire des économies de cette manière ?

Dans tout panneau, la chose fondamentale et la plus compliquée est l'affichage de la cohérence. Si un ordre est ouvert - il doit être affiché, s'il n'est pas dans l'onglet de transaction, il ne doit pas être dans le panneau non plus. C'est élémentaire et "très simple" sur le plan conceptuel. Mais pour que cela soit "très simple", le panel doit être basé sur un modèle d'état. Vous n'avez rien de tel, mais une base de données locale de courbes non cohérentes sur des chaînes de caractères insérées dans des objets utilisateur :

Et maintenant, vous essayez de nous prouver qu'il n'y a pas de problème, que tout est parti de rien. Les commandes non affichables dans votre tableau sont correctes.. Que les commandes qui se trouvent sur votre table, mais qui sont en fait clôturées depuis longtemps - c'est aussi normal. Et en général, tout est si normal et bon, sauf que le nombre de postes est limité à 20.

Vous comprenez que le problème est la mise en œuvre de la fixation de l'ouverture/fermeture de la commande par des moyens internes. Cela ne fait pas partie du mécanisme de la table elle-même. C'est un mécanisme de l'UTILISATEUR !

Au lieu de critiquer le moteur et l'implémentation de la table, vous feriez mieux d'écrire un mécanisme approprié pour réparer l'ouverture et la fermeture de l'ordre.

Et tout fonctionnera bien !

 
Реter Konow:

  1. Pour ce faire, l'utilisateur doit écrire une boucle par lui-même sur les ordres sur ticks ou timers, et vérifier leurs ticks par rapport aux ticks écrits dans le tableau. S'il n'y a pas de ticket dans le tableau, cela signifie que la commande vient d'être ouverte, et qu'il faut alors appeler le E_Main_form_1__PnL(OrderTicket(),OrderProfit());

4. Si vous écrivez correctement ces cycles de commande, le tableau fonctionnera correctement.....

J'ai juste oublié....

Mais cela ne signifie pas que le tableau dynamique lui-même ne fonctionne pas.

L'utilisateur doit être familier avec la documentation. Sait-il quoi mettre dans quel tableau et comment mettre tout cela à jour ? Je vous ai demandé d'écrire une démonstration entièrement fonctionnelle, qui serait à partir de votre code pour comprendre comment et ce qui est fait et où et ce qui est inséré, mais vous avez effacé mon TOR et me l'avez rendu sous la forme d'une table tordue !

 
Vasiliy Sokolov:

Je ressens juste un gros tas de négligence en vous, dans votre code et toutes les choses que vous faites, en quelque sorte pour les gens, mais quand on en vient aux détails, les conneries commencent. Faites une chose qui est petite mais bonne et de haute qualité. Vous dites que tout est simple à résoudre, élémentaire. Mais pour une raison quelconque, vous avez trouvé une solution, dans laquelle il n'y a rien. Qu'est-ce qui vous a empêché de faire tous ces simples jetons en quinze jours ?

Désolé pour la négativité. C'est juste que tu m'as déçu. J'espérais voir plus et mieux. Veuillez corriger votre démo. Faites en sorte qu'il soit bon, de haute qualité, conforme à la demande et sans ces mots : "Oui, c'est élémentaire, mais il faut l'ajuster ici". Proposez une solution originale, qui pourrait être contestée.

Vasiliy, ne sois pas émotif. Je n'ai jamais eu de manque de respect. Je n'ai tout simplement pas travaillé avec des commandes pendant longtemps et j'ai oublié comment le faire. Mais c'est une tâche d'utilisateur.

Mais je le ferai quand même. Puisque vous trouvez ça si difficile...

 
Реter Konow:

Vasily, il n'y a pas besoin d'émotion. Je n'ai eu aucun manque de respect. Je n'ai pas travaillé avec des commandes pendant longtemps et j'ai oublié comment le faire. Mais c'est une tâche d'utilisateur.

Mais je le ferai quand même. Si vous pensez que c'est si compliqué...

Alors, faites-le. Je ne trouve pas cela si compliqué, mais je le répète, il n'y a pas de documentation pour votre moteur, et je ne sais pas quel tableau mettre à jour avec quels paramètres. Ce dont j'ai besoin, c'est d'une démonstration sous la forme d'une solution complète. C'est le seul moyen de comprendre ce que vous faites et comment cela fonctionne. C'est exactement ce que j'attendais de toi. Lorsque vous le créerez, nous discuterons des solutions techniques. Et en général, prenez les critiques externes, même celles des experts, comme des critiques positives, car les retours négatifs ont généralement plus de valeur que les retours positifs.

 

Je vais vous expliquer comment fonctionne un tableau dynamique :

1. Lorsque l'on clique sur les boutons d'achat ou de vente, le signal est envoyé au fichier de connexion externe dans le bloc de cas du bouton lui-même.

case BUTTON3___BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:  
                               
                              int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-30*Point,Ask+50*Point,NULL,16384,0,Green);  
                              //--------------------------------------------------------------------------------------- 
                              if(ticket>0)
                                {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                   {
                                    Alert("BUY order opened");
                                    //----------------------------------------------------
                                    E_Main_form_1__Order(ticket,ticket);
                                    E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
                                    E_Main_form_1__Type(ticket, "BUY");
                                    E_Main_form_1__Volume(ticket,OrderLots());
                                    E_Main_form_1__Symbol(ticket, OrderSymbol());
                                    E_Main_form_1__Price(ticket, OrderOpenPrice());
                                    E_Main_form_1__Comission(ticket, OrderCommission());
                                    E_Main_form_1__Swap(ticket, OrderSwap());
                                    E_Main_form_1__PnL(ticket, OrderProfit()); 
                                    //----------------------------------------------------
                                   }
                                 //--------------------------------------  
                                 ArrayResize(Orders,OrdersTotal());
                                 Orders[OrdersTotal() - 1] = ticket;   
                                 //--------------------------------------                                    
                                }
                              else Print("Error opening BUY order : ",GetLastError());
                              //---------------------------------------------------------------------------------------
                break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;

Vous devez savoir qu'une nouvelle ligne est ouverte automatiquement si un nouveau ticket est envoyé à la fonctionE_Main_form_1__Price(ticket, OrderOpenPrice()) ;.

Si le ticket existe déjà, la ligne souhaitée est sélectionnée AUTOMATIQUEMENT et la nouvelle valeur y est définie.

Pour fermer une ligne dans la table , appelez la fonction E_Main_form_1_CLOSE_ROW___Orders_table(ticket) ;

Le ticket signifie le ticket de la rangée.

 
Реter Konow:

Je vais vous expliquer comment fonctionne un tableau dynamique :

1. Lorsque l'on clique sur les boutons d'achat ou de vente, le signal est envoyé au fichier de connexion externe dans le bloc de cas du bouton lui-même.

Vous devez savoir qu'une nouvelle ligne est ouverte automatiquement si un nouveau ticket est envoyé à la fonctionE_Main_form_1__Price(ticket, OrderOpenPrice()) ;.

Si le ticket existe déjà, la ligne souhaitée est sélectionnée AUTOMATIQUEMENT et la nouvelle valeur y est définie.

Pour fermer une ligne dans la table , appelez la fonction E_Main_form_1_CLOSE_ROW___Orders_table(ticket) ;

Billet signifie billet de rangée.

Peter, faites une boucle for dans le timer qui passerait par les ordres ouverts et enverrait les changements dans la liste des ordres à votre table. Veillez également à ce que le bénéfice de l'ordre dans votre tableau change également de manière dynamique.

 
Реter Konow:

Je vais vous expliquer comment fonctionne un tableau dynamique :

1. Lorsque l'on clique sur les boutons d'achat ou de vente, le signal est envoyé au fichier de connexion externe dans le bloc de cas du bouton lui-même.

Vous devez savoir qu'une nouvelle ligne est ouverte automatiquement si un nouveau ticket est envoyé à la fonctionE_Main_form_1__Price(ticket, OrderOpenPrice()) ;.

Si le ticket existe déjà, la ligne souhaitée est sélectionnée AUTOMATIQUEMENT et la nouvelle valeur y est définie.

Pour fermer une ligne dans la table , appelez la fonction E_Main_form_1_CLOSE_ROW___Orders_table(ticket) ;

Billet signifie billet de rangée.

C'est une mise en œuvre tordue, et voici la réponse :

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

Mon approche. Core - Moteur.

Vasiliy Sokolov, 2019.01.09 13:33

Peter, désolé, mais votre travail n'est pas accepté, car ce que vous avez envoyé est un rare travail de pirate. Désolé mais il semble que je sois le seul à avoir analysé ce que vous avez envoyé, et personne d'autre que moi ne fera l'expertise.

Donc, dans l'ordre, la mission était la suivante :

Ce que je vois à la place :

Tout d'abord, les transactions ne peuvent être ouvertes dans votre panel qu'en cliquant sur le bouton acheter/vendre. Si la position est ouverte par la fenêtre standard, la transaction n'apparaît pas.

....

Jusqu'à présent, un gros non. J'attends vos raffinements. Et pas de rendu 3D jusqu'à ce que vous ayez trouvé la solution !

 

Supposons que nous ayons plusieurs tables dynamiques.

Le fichier des propriétés de connexion imprimera automatiquement des fonctions wrapper pour travailler avec ces tables.

Voici un exemple illustratif. Nous avons dessiné une table dynamiqueOrders_table.

Ce sont les fonctions enveloppantes que nous avons :

void E_Main_form_1__Order(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Opening_Time(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Type(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Volume(long Magic, string Value)
//---------------------------------------------------------------------------------------------------------
void E_Main_form_1__Symbol(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Price(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Comission(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Swap(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__PnL(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Close(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)
//----------------------------------------------------------------------------------------------------------------

Remarque : chaque wrapper a un nom de colonne dyn.table à la fin de son nom.

L'élément spécifique n'est pas spécifié, seulementla ligne magique.

En d'autres termes, pour définir une nouvelle valeur dans une cellule d'une ligne existante, vous devez envoyer son Magic et sa valeur.

Pour définir une nouvelle valeur dans une cellule d'une ligne inexistante, vous devez envoyer son magik et sa valeur. La ligne sera automatiquement créée.

Pour détruire une ligne dans la table, vous devez appeler le wrapper avec les motsCLOSE_ROW

Par exemple :

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

Et passez-y le majik de la ligne que vous voulez fermer.

C'est tout.

 
Vasiliy Sokolov:

Peter, créez une boucle for dans le timer, qui passerait par les ordres ouverts et enverrait les changements dans la liste des ordres à votre table. Assurez-vous également que le bénéfice de l'ordre dans votre tableau change également de manière dynamique.

Ok, j'écrirai les cycles et le code pour travailler avec les commandes, mais je vous laisse le soin de le mettre vous-même, car j'ai déjà converti le moteur pour lier les ressources et je le teste. Pour l'instant, je ne peux pas récupérer l'ancien lien, et je n'ai pas encore terminé le nouveau.

 
Реter Konow:

OK, j'écrirai les boucles et le code pour travailler avec les commandes, mais je vous laisse le soin de le mettre en place vous-même, car j'ai déjà redessiné le moteur pour qu'il communique par le biais de ressources et je suis en train de le tester. Pour l'instant, je ne peux pas récupérer l'ancien lien, et je n'ai pas encore terminé le nouveau.

Travaillez avec la version du moteur que vous avez jointe à titre de démonstration.

Tag Konow:

En d'autres termes, pour définir une nouvelle valeur dans une cellule d'une ligne existante, vous devez envoyer sa majuscule et sa valeur.

Ça me semble simple. Si votre approche fonctionne comme je le pense, alors je ne vois aucun problème à utiliser une table dynamique ou à mettre à jour les valeurs de position via une minuterie. Peter, pourquoi fallait-il faire une bosse au début ?)