Discussão do artigo "DoEasy. Controles (Parte 31): Rolando o conteúdo do controle "ScrollBar"" - página 3

 
#include <DoEasy\Engine.mqh>

CEngine        engine;

....

   int h=37,w=100;
   string name=prefix+"EDIT_BUY_LIMIT";
   x=309;
   y=124;
   if(!EditCreate(name,x,y,w-16,h,"",clrBlack,clrWhite))
     {
      Alert(TextByLanguage("Falha ao criar o elemento Edit \""","Could not create Edit element \""),prefix+"EDIT_BUY_LIMIT"+", error: "+(string)GetLastError());
      return false;
     }


//+------------------------------------------------------------------+
//| Cria o Edit|
//+------------------------------------------------------------------+
bool EditCreate(const string name,
                const int x,
                const int y,
                const int w,
                const int h,
                const string text,
                const color clr_txt,
                const color clr_bg,
                const string font="Calibri",
                const int font_size=11)
  {
   if(!engine.CreateEditField(0,name,0,false,x,y,w,h,font_size,CORNER_LEFT_LOWER,ALIGN_CENTER,false))
     {
      Print(DFUN,TextByLanguage("Falha ao criar o elemento Editar! Código de erro="","Could not Edit element! Error code="),GetLastError()); 
      return false;   // --- retorna falso aqui
     }
 }
 
E, na verdade, como você cria um Edit vinculando-o a um painel?
 
Uau, eu desenhei o painel, gastei muito tempo. E acontece que não é possível criar um elemento Edit...
 
leonerd #:
Uau, eu desenhei o painel, gastei muito tempo. E acontece que não é possível criar um elemento Edit...
Mostre-me seu exemplo totalmente compilável.
 
Artyom Trishkin #:
Mostre-me seu exemplo totalmente compilável, por favor.

Bem, o que há para compilar se esse objeto não existe.

GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON está lá e muitos outros, mas não há um simples Edit. Por meio do método do mecanismo CreateEditField(), acabo criando um campo, mas me diga como vinculá-lo ao painel?

CPanel *pnl=engine.CreateWFPanel("WFPanel",50,50,280,240,array_clr,200,true,true,false,-1,FRAME_STYLE_BEVEL,true,false);
if(pnl!=NULL)
  {
   if(!pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON,InpRbnShiftX+dist_rbtn_x*i,InpRbnShiftY,50,20,clrNONE,255,true,false))
     ..
  }

 
leonerd #:

portanto, o que há para compilar se esse objeto não existe.

Há GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON e muitos outros, mas não há um simples Edit. Por meio do método do mecanismo CreateEditField(), acabo criando um campo, mas me diga como vinculá-lo ao painel?

A biblioteca ainda está em desenvolvimento. Os elementos gráficos estão menos da metade prontos. Ainda não há um campo de entrada. Há apenas um campo padrão, que você está tentando criar.

Quando o objeto "Input field" estiver disponível, tudo funcionará. Não é prático vincular um objeto padrão ao formulário agora - ele não participará do modelo de evento do objeto de formulário.

 

Certo.

Além disso, esse método não está funcionando corretamente

CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket);

Ele só me retorna o último pedido. Por algum motivo, ao filtrar os pedidos, ele os trata como pedidos pendentes excluídos.

Vou lhe dar algumas informações. A primeira ordem na posição foi aberta com um limitador (SELL STOP), houve várias atualizações da posição alterando o SL/TP. Em seguida, vi um evento de fechamento no SL. Estou tentando encontrar a primeira ordem da posição fechada, mas o método acima não está funcionando corretamente.

CEngine engine

....

    if(event.TypeEvent()==TRADE_EVENT_POSITION_CLOSED_BY_SL)
        {
         
         ulong prev_pos_ticket=event.TicketPositionPrevious();  // aqui está a posição correta do tíquete 
         CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket); // aqui na matriz recebida apenas a última ordem de posição (sl)
        }
  
 
leonerd posição fechada, mas o método acima não está funcionando corretamente.

O ticket da posição e o ID da posição são coisas completamente diferentes. Você precisa pesquisar pelo ID da posição, não pelo tíquete, que muda constantemente e se torna igual ao tíquete da ordem que gerou a negociação que alterou a posição.

Você deve ler os artigos ou a ajuda sobre o sistema de ordens no MetaTrader 5....

 

Em ClosePosition(), você nem sequer preenche o preenchimento

Em Trading.mqh trade_obj.ClosePosition(ticket,comment,deviation)
trade_obj tem o preenchimento necessário e, ao entrar no método this.m_request.type_filling, torna-se padrão FOK

 
leonerd ,comment,deviation)
trade_obj tem o preenchimento necessário e, ao entrar no método this.m_request.type_filling, torna-se padrão FOK
Vou dar uma olhada nisso. Obrigado.