Minha abordagem. O núcleo é o motor. - página 129

 
Vou colocar meus cinco centavos. No momento, não tenho tempo para isso. Mas existe essa idéia de implementar um painel semelhante em casa. Portanto, acho que não apenas fazer uma cruz para fechar uma posição (embora seja necessário), mas também deixar uma marca, especificar o lote e fazer o fechamento por atacado. Isso proporcionará um trabalho mais flexível com as posições, bem como seu fechamento parcial.
 
Vasiliy Sokolov:

Trabalhe com a versão do motor que você anexou como uma demonstração.

É bastante simples. Se sua abordagem funciona como eu penso que funciona, então não vejo nenhum problema com uma tabela dinâmica ou com a atualização dos valores de posição através de um temporizador. Peter, por que você fez uma bagunça desde o início?)

Vasiliy, o principal é não apressar as conclusões. Nem para você nem para mim)).

 
Konstantin Nikitin:
Vou colocar meus cinco centavos. No momento, não tenho tempo para isso. Mas existe essa idéia de implementar um painel semelhante em casa. Portanto, acho que não só fazer uma cruz para fechar a posição (embora seja necessário), mas também deixar uma marca, especificar o lote e fazer este fechamento por atacado. Isso proporcionará um trabalho mais flexível com as posições, bem como seu fechamento parcial.

Eu posso fazer isso.

 
Vasiliy Sokolov:

Peter, faça um loop no temporizador, que passaria pelas ordens abertas e enviaria as mudanças na lista de ordens para sua mesa. Além disso, faça com que o lucro do pedido em sua mesa também mude de forma dinâmica.

Vasily, por favor, cole este código no arquivo EA de teste (as funções tick e temporizador em vez das antigas)

//+------------------------------------------------------------------+
//| 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 também, é necessário substituir a linha 68 e a linha 114 no arquivo de Conexão Externa.

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

Um pouco confuso por lá. Ao invés deOrderOpenTime() coloqueOrderOpenPrice().


Deve funcionar bem. Verifique.

 
Nota, eu ajustei o código ligeiramente acima (se você já o colocou).
 

Eh, não é a coisa canônica a fazer - separar dados (modelo) das vistas e usar o padrão do observador para subscrever vistas específicas para mudanças de modelo ou campos de modelo específicos.

Mas isso exigiria que o usuário de tal biblioteca pensasse orientado ao objeto e enfiasse seus dados EA na estrutura de objeto proposta (sim, sim, você precisa aprender os métodos dessa biblioteca/estrutura para construir uma interface). E muitas pessoas não sabem nada sobre o OOP.

Mas Peter diz que você não tem que aprender nada! Basta ir em frente e colar suas variáveis globais na bobina pronta dos manipuladores gerados e a interface irá funcionar. Sim, é um presente de Deus! Não é "fazer tábuas para uma prateleira, conectá-las de acordo com as instruções e arrumar livros", mas "desenhar sua prateleira e arrumar seus livros nela". Código Menos Fazer Mais ((c)/JQuery se você for)


Claramente, há um problema com o posicionamento do produto. E se for? Ei, programador! Você quer ganhar algum dinheiro? Você pode vender o que parece bom! Pegue uma centena de Expert Advisors sem interface e venda-os com interface. hahaha ))


Bem, há uma desvantagem do arquivo de interface, no qual os manipuladores dos controles "se destacam" - é estático. Terei que rachar meus miolos e criar um novo tipo de manipulador que atuaria como modelo e aceitaria dados de usuário/programa através de parâmetros de entrada.

 
Igor Volodin:

Eh, não fazer o cânone...

Está tudo bem, a Rehtag fará a Konowam. )))

 
Igor Volodin:

Eh, não é a coisa canônica a fazer - separar dados (modelo) das vistas e usar o padrão do observador para subscrever vistas específicas para mudanças de modelo ou campos de modelo específicos.

Mas isso exigiria que o usuário de tal biblioteca, pensasse orientado ao objeto e enfiasse seus dados EA na estrutura de objeto proposta (sim, sim, você precisa aprender os métodos dessa biblioteca/estrutura para construir a interface). E muitas pessoas não sabem nada sobre o OOP.

Mas Peter diz que você não tem que aprender nada! Basta ir em frente e colar suas variáveis globais na bobina pronta dos manipuladores gerados e a interface irá funcionar. Sim, é um presente de Deus! Não é "fazer tábuas para uma prateleira, conectá-las de acordo com as instruções e arrumar livros", mas "desenhar sua prateleira e arrumar seus livros nela". Código Menos Fazer Mais ((c)/JQuery se você for)


Claramente, há problemas com o posicionamento do produto. E se for? Ei, programador! Você quer ganhar algum dinheiro? Você pode vender o que parece bom! Pegue uma centena de Expert Advisors sem interface e venda-os com interface. hahaha ))


Bem, há uma desvantagem do arquivo de interface, no qual os manipuladores dos controles "se destacam" - é estático. Terei que rachar meus miolos e criar um novo tipo de manipulador que atuaria como modelo e aceitaria dados de usuário/programa através de parâmetros de entrada.

No início eu pensava que era outro lote de negatividade, mas depois li melhor e acabou não sendo. Apenas emoções.

Este construtor é destinado a pessoas que estão realmente interessadas no comércio algorítmico. Faz sentido para eles não perder tempo estudando bibliotecas gráficas, mas apenas para criar tal código:

//====================================================================================================================
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 arranje uma janela com uma mesa de jantar.


No arquivo de interface, o usuário receberá este código:

//=====================================================================================================================
//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 determinará o que fazer e como fazê-lo em eventos de clique de botão.

 
 

A próxima tabela dinâmica será ainda mais interessante. As células terão campos de entrada, listas pop-up, caixas de seleção, botões, botões de rádio, barras de progresso, e campos de entrada com botões +/-.

A parte complicada é o dinamismo de tal mesa. Afinal, acessar elementos e obter seus valores não está vinculado a parâmetros específicos, mas depende do layout da linha.