Il mio approccio. Il nucleo è il motore. - pagina 129

 
Metterò i miei cinque centesimi. Non ho tempo per questo al momento. Ma c'è un'idea per implementare un pannello simile a casa. Quindi penso che non solo fare una croce per chiudere una posizione (anche se è necessario), ma anche fare un segno, specificare il lotto e farlo chiusura all'ingrosso. Questo darà un lavoro più flessibile con le posizioni, così come la loro chiusura parziale.
 
Vasiliy Sokolov:

Lavorate con la versione del motore che avete allegato come dimostrazione.

È abbastanza semplice. Se il tuo approccio funziona come penso, allora non vedo alcun problema né con una tabella dinamica né con l'aggiornamento dei valori di posizione tramite un timer. Peter, perché hai fatto un casino fin dall'inizio).

Vasiliy, la cosa principale è non trarre conclusioni affrettate. Né per te né per me)).

 
Konstantin Nikitin:
Metterò i miei cinque centesimi. Non ho tempo per questo al momento. Ma c'è un'idea per implementare un pannello simile a casa. Quindi penso che non solo fare una croce per chiudere la posizione (anche se è necessario), ma anche fare un segno, specificare il lotto e fare questa chiusura all'ingrosso. Questo darà un lavoro più flessibile con le posizioni, così come la loro chiusura parziale.

Posso farlo.

 
Vasiliy Sokolov:

Peter, fai un ciclo for nel timer, che passerebbe attraverso gli ordini aperti e invierebbe i cambiamenti nella lista degli ordini alla tua tabella. Inoltre, fate che il profitto dell'ordine nella vostra tabella cambi anche dinamicamente.

Vasily, incolla questo codice nel file EA di prova (le funzioni tick e timer al posto di quelle vecchie)

//+------------------------------------------------------------------+
//| 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);
                  //--------------------------------------------------                      
                 } 
              } 
          }
      }         
 }

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

E inoltre, dovete sostituire la linea 68 e la linea 114 nel file External Connection.

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));

Un po' di confusione lì. Invece diOrderOpenTime() mettiOrderOpenPrice().


Dovrebbe funzionare bene. Controlla.

 
Nota, ho modificato leggermente il codice qui sopra (se l'hai già messo).
 

Eh, non è la cosa canonica da fare - separa i dati (modello) dalle viste e usa il modello dell'osservatore per sottoscrivere viste specifiche ai cambiamenti del modello o ai campi specifici del modello.

Ma questo richiederebbe all'utente di una tale libreria, di pensare orientato agli oggetti e spingere i propri dati EA nella struttura ad oggetti proposta (sì, sì, è necessario imparare i metodi di quella libreria/quadro per costruire un'interfaccia). E molte persone non sanno nulla di OOP.

Ma Pietro dice che non devi imparare niente! Andate avanti e infilate le vostre variabili globali nella bobina pronta di gestori generati e l'interfaccia funzionerà. Sì, è una manna dal cielo, ragazzi! Non è "fai delle tavole per uno scaffale, collegale secondo le istruzioni e disponi i libri", ma "disegna il tuo scaffale e disponi i tuoi libri su di esso". Code Less Do More ((c)/JQuery se lo sei)


Chiaramente, ci sono problemi con il posizionamento del prodotto. E se fosse così? Ehi, programmatore! Vuoi fare un po' di soldi? Si può vendere ciò che sembra buono! Prendi un centinaio di Expert Advisors senza interfaccia e vendili con interfaccia. hahaha ))


Beh, c'è uno svantaggio del file di interfaccia, in cui i gestori dei controlli "sporgono" - è statico. Dovrò scervellarmi e creare un nuovo tipo di gestore che funga da modello e accetti i dati dell'utente/programma tramite parametri di input.

 
Igor Volodin:

Eh, non per fare il canone...

Va bene, Rehtag farà Konowam. )))

 
Igor Volodin:

Eh, non è la cosa canonica da fare - separa i dati (modello) dalle viste e usa il modello dell'osservatore per sottoscrivere viste specifiche ai cambiamenti del modello o ai campi specifici del modello.

Ma questo richiederebbe all'utente di una tale libreria, di pensare orientato agli oggetti e spingere i loro dati EA nella struttura ad oggetti proposta (sì, sì, è necessario imparare i metodi di quella libreria/quadro per costruire l'interfaccia). E molte persone non sanno nulla di OOP.

Ma Pietro dice che non devi imparare niente! Andate avanti e infilate le vostre variabili globali nella bobina pronta di gestori generati e l'interfaccia funzionerà. Sì, è una manna dal cielo, ragazzi! Non è "fai delle tavole per uno scaffale, collegale secondo le istruzioni e disponi i libri", ma "disegna il tuo scaffale e disponi i tuoi libri su di esso". Code Less Do More ((c)/JQuery se lo sei)


Chiaramente, ci sono problemi con il posizionamento del prodotto. E se fosse così? Ehi, programmatore! Vuoi fare un po' di soldi? Si può vendere ciò che sembra buono! Prendi un centinaio di Expert Advisors senza interfaccia e vendili con interfaccia. hahaha ))


Beh, c'è uno svantaggio del file di interfaccia, in cui i gestori dei controlli "sporgono" - è statico. Dovrò scervellarmi e creare un nuovo tipo di gestore che funga da modello e accetti i dati dell'utente/programma tramite parametri di input.

All'inizio ho pensato che fosse un'altra partita di negatività, ma poi l'ho letto meglio e si è rivelato il contrario. Solo emozioni.

Questo costruttore è destinato alle persone che sono veramente appassionate di trading algoritmico. Ha senso per loro non perdere tempo a studiare le librerie di grafici, ma semplicemente creare un codice del genere:

//====================================================================================================================
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,
//====================================================================================================================

E prendi una finestra con un tavolo da pranzo.


Nel file di interfaccia l'utente otterrà questo codice:

//=====================================================================================================================
//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;
  
   }
}
//=================================================================================================================

E determinerà cosa fare e come farlo sugli eventi di click dei pulsanti.

 

La prossima tabella dinamica sarà ancora più interessante. Le celle avranno campi di input, liste a comparsa, caselle di controllo, pulsanti, pulsanti radio, barre di progresso e campi di input con pulsanti +/-.

La parte difficile è il dinamismo di un tale tavolo. Dopo tutto, accedere agli elementi e ottenere i loro valori non è legato a parametri specifici, ma dipende dal layout della riga.

Motivazione: