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

 
Je vais mettre mes cinq cents. Je n'ai pas le temps pour ça en ce moment. Mais il existe une idée pour mettre en place un panneau similaire à la maison. Donc je pense qu'il ne faut pas seulement faire une croix pour fermer une position (bien que ce soit nécessaire), mais aussi faire une marque, spécifier le lot et le faire en gros en fermant. Cela permettra une plus grande flexibilité dans le travail avec les postes, ainsi que leur fermeture partielle.
 
Vasiliy Sokolov:

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

C'est assez 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 as-tu fait un gâchis dès le début ?)

Vasiliy, l'essentiel est de ne pas tirer de conclusions hâtives. Ni pour vous ni pour moi)).

 
Konstantin Nikitin:
Je vais mettre mes cinq cents. Je n'ai pas le temps pour ça en ce moment. Mais il existe une idée pour mettre en place un panneau similaire à la maison. Donc je pense qu'il ne faut pas seulement faire un cross pour fermer la position (bien que ce soit nécessaire), mais aussi faire une marque, spécifier le lot et faire cette fermeture en gros. Cela permettra une plus grande flexibilité dans le travail avec les postes, ainsi que leur fermeture partielle.

Je peux le faire.

 
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. De même, faites en sorte que le bénéfice de l'ordre dans votre tableau change également de manière dynamique.

Vasily, veuillez coller ce code dans le fichier EA de test (les fonctions tick et timer à la place des anciennes)

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //---------------------------------------------
   //Количество ордеров не менялось.
   //---------------------------------------------      
   if(ArraySize(Orders) == OrdersTotal())
     {
      for(int a1 = 0; a1 < OrdersTotal(); a1++)
        {
         if(OrderSelect(a1,SELECT_BY_POS))
           {
            E_Main_form_1__PnL(OrderTicket(),OrderProfit()); 
           }
        }
     }        
  }
//--------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  { 
   //---------------------------------------------
   //Ордер открылся.
   //---------------------------------------------     
   if(ArraySize(Orders) < OrdersTotal())
     {Alert("Ордер открылся!");
      ArrayResize(Orders,OrdersTotal());
      
      //---------------------------------------
      if(OrderSelect(OrdersTotal() - 1,SELECT_BY_POS))
        {
         if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES))
           {
            //----------------------------------------------------
            E_Main_form_1__Order(OrderTicket(),OrderTicket());
            E_Main_form_1__Opening_Time(OrderTicket(),TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
            E_Main_form_1__Volume(OrderTicket(),OrderLots());
            E_Main_form_1__Symbol(OrderTicket(), OrderSymbol());
            E_Main_form_1__Price(OrderTicket(), OrderOpenPrice());
            E_Main_form_1__Comission(OrderTicket(), OrderCommission());
            E_Main_form_1__Swap(OrderTicket(), OrderSwap());
            E_Main_form_1__PnL(OrderTicket(), OrderProfit());
            E_Main_form_1__Type(OrderTicket(),OrderType()); 
            //----------------------------------------------------
           }
          //--------------------------------------  
          ArrayResize(Orders,OrdersTotal());
          Orders[OrdersTotal() - 1] = OrderTicket();   
          //--------------------------------------
        }
      //---------------------------------------  
     }
   //---------------------------------------------
   //Ордер закрылся.
   //---------------------------------------------  
   if(ArraySize(Orders) > OrdersTotal())
     {
      for(int a1 = 0; a1 < 100; a1++)
        {
         if(OrderSelect(Orders[a1],SELECT_BY_TICKET) && OrderCloseTime())
           {Alert("Ордер закрылся!");
            //--------------------------------------------------
            for(int a3 = 0; a3 < 100; a3++)
              { 
               if(Orders[a3] == OrderTicket())
                 {
                  E_Main_form_1_CLOSE_ROW___Orders_table(OrderTicket());
                  Orders[a3] = 0;
                  //--------------------------------------------------
                  int deleted = 0,q = 0;
                  //--------------------
                  for(int a2 = 0; a2 < ArraySize(Orders); a2++)
                    {
                     if(deleted)Orders[q] = Orders[q+deleted];
                     if(!Orders[q]){deleted++; q--;}
                     q++;
                    }
                  //--------------------------------------------------  
                  ArrayResize(Orders,q);
                  //--------------------------------------------------                      
                 } 
              } 
          }
      }         
 }

}
      
//---------------------------------------------

Et aussi, vous devez remplacer la ligne 68 et la ligne 114 dans le fichier de connexion externe.

E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));

C'est un peu mélangé. Au lieu deOrderOpenTime(), mettezOrderOpenPrice().


Cela devrait fonctionner correctement. Vérifiez-le.

 
Notez que j'ai légèrement modifié le code ci-dessus (si vous l'avez déjà mis).
 

Eh, ce n'est pas la chose canonique à faire - séparer les données (modèle) des vues et utiliser le modèle observateur pour abonner des vues spécifiques aux changements de modèle ou à des champs de modèle spécifiques.

Mais cela exigerait de l'utilisateur d'une telle bibliothèque qu'il pense de manière orientée objet et qu'il fasse entrer ses données d'AE dans la structure objet proposée (oui, oui, vous devez apprendre les méthodes de cette bibliothèque/ce cadre pour construire une interface). Et beaucoup de gens ne savent rien de la POO.

Mais Pierre dit que vous n'avez rien à apprendre ! Il vous suffit de placer vos variables globales dans le flux de gestionnaires générés et l'interface fonctionnera. Ce n'est pas "fabrique des planches pour une étagère, relie-les selon les instructions et dispose les livres", mais "dessine ton étagère et dispose tes livres dessus". Code Less Do More ((c)/JQuery si vous êtes)


Il est clair qu'il y a un problème de positionnement du produit. Et si c'est le cas ? Hé, le programmeur ! Vous voulez gagner de l'argent ? Vous pouvez vendre ce qui vous semble bon ! Prenez une centaine d'Expert Advisors sans interface et vendez-les avec interface. hahaha ;))


Il y a un inconvénient du fichier d'interface, dans lequel les gestionnaires des contrôles "ressortent" - c'est statique. Je vais devoir me creuser les méninges et créer un nouveau type de gestionnaire qui agirait comme un modèle et accepterait les données de l'utilisateur/du programme via des paramètres d'entrée.

 
Igor Volodin:

Eh, pour ne pas faire le canon...

C'est bon, Rehtag fera Konowam. )))

 
Igor Volodin:

Eh, ce n'est pas la chose canonique à faire - séparer les données (modèle) des vues et utiliser le modèle d'observateur pour abonner des vues spécifiques aux changements de modèle ou aux champs de modèle spécifiques.

Mais cela exigerait de l'utilisateur d'une telle bibliothèque qu'il pense en termes d'objet et qu'il fasse entrer ses données d'AE dans la structure d'objet proposée (oui, oui, vous devez apprendre les méthodes de cette bibliothèque/ce cadre pour construire l'interface). Et beaucoup de gens ne savent rien de la POO.

Mais Pierre dit que vous n'avez rien à apprendre ! Il vous suffit de placer vos variables globales dans le flux de gestionnaires générés et l'interface fonctionnera. Ce n'est pas "fabrique des planches pour une étagère, relie-les selon les instructions et dispose les livres", mais "dessine ton étagère et dispose tes livres dessus". Code Less Do More ((c)/JQuery si vous êtes)


Il est clair qu'il y a un problème de positionnement du produit. Et si c'est le cas ? Hé, le programmeur ! Vous voulez gagner de l'argent ? Vous pouvez vendre ce qui vous semble bon ! Prenez une centaine d'Expert Advisors sans interface et vendez-les avec interface. hahaha ;))


Il y a un inconvénient du fichier d'interface, dans lequel les gestionnaires des contrôles "ressortent" - c'est statique. Je vais devoir me creuser les méninges et créer un nouveau type de gestionnaire qui agirait comme un modèle et accepterait les données de l'utilisateur/du programme via des paramètres d'entrée.

Au début, j'ai pensé que c'était un autre lot de négativité, mais ensuite je l'ai mieux lu et il s'est avéré que non. Juste des émotions.

Ce constructeur est destiné aux personnes qui sont vraiment passionnées par le trading algorithmique. Il est logique qu'ils ne perdent pas leur temps à étudier les bibliothèques de graphes mais qu'ils créent simplement un tel code :

//====================================================================================================================
NEW_WINDOW,  W_NAME, "Main form 1",  W_ICON, 12,  W_TYPE, SETTINGS, ALWAYS_ON_TOP,    OOI,
//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
GROUP, A,

__, BUTTON,"BUY",text,N_COLOR,(int)clrBlue, GAP,50,  BUTTON,"SELL", text,N_COLOR,(int)clrRed,

END_GROUP,
//-------------------------- 
i, AT, _X2X, "MF", 10, _Y2Y,"MF", 10,

i,BUTTONS, PARAM_TYPE,_BOOL, TEXT_FONT,"Times New Roman",  W,100, H,34, FONT_SIZE,11,   END,

//----------------------------------------------------------------------------------
GROUP, A,

__,V_BOX,"V1",W,860,  _,H,248,_,N_FRAME,1,_,NP_FRAME,1,

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y,"MF", 50,
//----------------------------------------------------------------------------------

//----------------------------------------------------------------------------------
//Объявляем таблицу:
//----------------------------------------------------------------------------------
GROUP,"Orders table", IS_TABLE,  

__,     T_HEADER, "#",W,20,_,H,30, C_HEADER, "Order",     C_HEADER, "Opening Time",W,90, C_HEADER, "Type", W,90,  C_HEADER, "Volume", W,90,  C_HEADER, "Symbol", W,90, 
                               C_HEADER, "Price",       W,90,    
                               C_HEADER, "Comission",   W,90, C_HEADER, "Swap", W,90,  C_HEADER, "PnL",    W,90,  C_HEADER, "Close",  W,40,

__,     R_HEADER,"1", CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A,     
__,     R_HEADER,"2",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"3",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"4",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"5",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"6",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"7",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"8",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"9",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"10",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"11",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"12",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"13",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"14",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"15",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"16",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"17",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"18",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"19",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"20",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"21",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
 
END_GROUP,
//------------------------------------
i,AT, LEFT_TOP, 0,0,
i, IN, "V1",
//-----------
i, Y_GAP,-1,
i, X_GAP,-1,
//-----------
i, IS_ZEBRA_STYLE,
i, DnD_RECIEVER,
i, R_HEADERS,   W,20, N_COLOR,(int)C'0,235,0', END,
i, C_HEADERS,   H,30,                          END,
i, CELLS,       H,25,                          END,
i, C_HEADERS,   DnD_ON, DnD_FUNCTION, ROTATE_COLOMNS, END,
i, I_BUTTONS, C_FUNCTION, DELETES_ROW,   text,HIDE,1, N_FRAME,1,A_FRAME,1, NP_FRAME,1, AP_FRAME,1, N_LABEL,745, END,
i, IS_DINAMIC,
//----------------------------------------------------------------------------------
"Order", H,30,
//----------------------------------------------------------------------------------
END_WINDOW,
//====================================================================================================================

Et prends une fenêtre avec une table à manger.


Dans le fichier d'interface, l'utilisateur obtiendra ce code :

//=====================================================================================================================
//WINDOW:   Main form 1 | element: BUTTON  | name: BUY  |  Location: Window's Main Frame
//=====================================================================================================================
case BUTTON3____BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Main form 1 | element: BUTTON  | name: SELL  |  Location: Window's Main Frame
//=====================================================================================================================
case BUTTON4____SELL:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Main form 1 | element: I_BUTTON  | name: 1_Close  |  Location: Window's Main Frame   | Table: 300000007
//=====================================================================================================================
case I_BUTTON14___Close:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
   }
}
//=================================================================================================================

Et il déterminera ce qu'il faut faire et comment le faire sur les événements de clic de bouton.

 
 

Le prochain tableau dynamique sera encore plus intéressant. Les cellules comporteront des champs de saisie, des listes déroulantes, des cases à cocher, des boutons, des boutons radio, des barres de progression et des champs de saisie avec des boutons +/-.

La partie la plus délicate est le dynamisme d'une telle table. Après tout, l'accès aux éléments et l'obtention de leurs valeurs ne sont pas liés à des paramètres spécifiques, mais dépendent de la disposition des lignes.