Dividir as posições em aberto em grupos - página 9

 
Sergey Voytsekhovsky:

Se entendi bem, este é o caminho certo a seguir. Como um camarada mais experiente, por favor aconselhe, com o propósito de pegar posições de recém-nascidos, tal filtro funcionará ???? Ou talvez haja uma opção melhor ????

Isto é para Alexey - eu não trabalho com a OnTradeTransaction() por alguma razão.

 
Alexey Viktorov:

Você está assim sugerindo que os outros postos sejam empurrados para trás? Deixá-los ir sem mencionar? Isso não está certo.

Na minha opinião, é melhor definir uma seção separada do fórum na qual cada problema seria um tópico separado. O número de tópicos é muito menor do que o número de postos por tópico. Assim, apesar do número considerável de tópicos, eles não serão empurrados para trás, na medida em que questões individuais e relatórios de bugs são empurrados para trás agora.

Bem, você destacou em vermelho que você não sabe. Qual foi o problema? Como ela se manifestou? E qual era o novo método?

Quanto a reportar bugs: "certo ou errado", mas se você quiser reportar, você o fará. E se você não quer, você não quer. E fechar-se como "deixar as pessoas falarem de si mesmas" é uma desculpa.

 
Sergey Voytsekhovsky:

Se entendi bem, este é o caminho certo a seguir. Como um camarada mais experiente, por favor aconselhe, com o propósito de pegar posições de recém-nascidos, tal filtro funcionará ???? Ou talvez haja uma opção mais correta ????

Na minha opinião, esta linha

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

desnecessária. E, em geral, estou atualmente reconsiderando a operação da OnTradeTransaction para a seguinte variante

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

No momento de adicionar um acordo, não temos um ticket da ordem que gerou o acordo. Mas se precisamos de um bilhete para o pedido e suas propriedades, como agora eu preciso do preço de abertura do pedido para não desativar a etapa de grade por causa do escorregamento, então é a melhor variante. imho.

Em geral, sou um adepto da escrita para uma tarefa específica. Em contraste, a SB tem uma grande dose de universalidade que requer variáveis adicionais que às vezes são absolutamente desnecessárias.

 
Artyom Trishkin:

Bem, você destacou em vermelho que você não sabia. Qual foi o problema? Como ela se manifestava? E qual era o novo método?

E sobre as mensagens de erro: "certo ou errado", mas se você quiser informar, você informará. E se você não quer, você não quer. E fechar-se como "deixar as pessoas falarem sobre o que é delas" é uma desculpa.

Em algum lugar em meus discos antigos, ainda tenho os terminais antigos. Se eu conseguir encontrá-los, mostrarei a biblioteca antiga e a nova. Então, teremos uma conversa substantiva. Caso contrário, eu me lembro que você não se lembra, então sobre o que há para falar? Como explicar, para mostrar o que não está lá agora.
 
Alexey Viktorov:

Na minha opinião, esta linha

desnecessária. Em geral, estou atualmente reconsiderando a operação da OnTradeTransaction para a seguinte variante

No momento de adicionar uma troca, não há nenhum bilhete da ordem que gerou a troca. Mas se precisamos de um bilhete de um pedido e suas propriedades, como agora preciso do preço de abertura do pedido, para que a etapa da grade não seja derrubada por deslizamento, então esta é a melhor opção. imho.

Geralmente, sou um defensor do desenvolvimento para uma tarefa específica. E a UB tem se amontoado na universalidade, o que requer variáveis adicionais, às vezes absolutamente desnecessárias.

Extremamente grato por apontar na direção certa. Fez desta forma (abaixo, parece funcionar):

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

Agora estou intrigado com a forma de apanhar os carrapatos das posições que fecharam na Take Profit ou por uma ordem direta. Só precisamos de carrapatos deles para remover essas posições do conjunto principal de posições.

 
Sergey Voytsekhovsky:

Extremamente grato pela orientação na direção certa. Eu o fiz (abaixo, parece funcionar):

Agora estou intrigado como apanhar carrapatos de posições que fecharam em takeprofit ou por ordem direta. Só precisamos de carrapatos deles para remover essas posições da matriz de posições principal.

Eu acrescentaria um cheque para o símbolo e o mágico.

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

Aqui está um fragmento do meu código onde é detectado o fechamento de posição.

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

Também podemos dividir por motivos de fechamento da enumeração ENUM_DEAL_REASON

Em outro Expert Advisor

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

No primeiro caso eu preciso de uma ordem, no segundo caso um acordo é suficiente. Em geral, quando eu precisar de alguma coisa, eu a escreverei.

 
Alexey Viktorov:

Eu também acrescentaria um cheque por símbolo e magik

Aqui está um fragmento do meu código onde é detectado o fechamento de posição.

Também podemos dividir por motivos de fechamento da enumeração ENUM_DEAL_REASON

Aqui em outro Expert Advisor

No primeiro caso eu preciso de ordem, no segundo caso o comércio é suficiente. Em geral, eu o escreverei quando precisar.

Boa noite. Sua capacidade de resposta e consideração me fazem muita honra. Muito obrigado. Como dizem os jovens - respeito e respeito.

Obrigado por seus bons conselhos. Para um, eles não são muito necessários no momento, meu consultor especializado não tem e provavelmente não terá nenhum concorrente porque é de alta freqüência, muitas posições pequenas. Ele está sufocando sozinho, onde mais ele pode competir com os outros? Naturalmente, se chegar a isso, terá um no terminal e na conta. A segunda provavelmente é rebuscada, só não sei muito ainda, mas talvez poupe um pouco de recursos.

Seus exemplos são bons, definitivamente os salvarei, mas não tenho bilhete, nem ordem, nem acordo. Mais precisamente, eu tenho centenas delas e não sei qual delas fechará agora. Você me sugeriu pensar que o fato de fechar uma posição pode ser tirado dos meus cálculos e eu tentarei fazê-lo agora.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)

Tentarei imprimir tudo o que imprimir no fluxo. Meu Conselheiro Especialista será um gerador de posições e sabe como abrir posições ativamente e fechá-las ao mesmo tempo. A única coisa é encontrar esta posição (o bilhete de posição) na matriz/estrutura e removê-la. Portanto, é assim.

E como máquina de escrever, tentarei usar um código de exemplo da referência, na seção sobre esta função, ela é chamada ali:

//|OnTradeTransaction_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//|https://wwww.mql5.com |||||mql5.com
//+------------------------------------------------------------------+
#direitos autorais"Copyright 2018, MetaQuotes Software Corp."
#link da propriedade"https://www.mql5.com"
#propriedade versão"1.00"
#descrição do imóvel"TradeTransaction event listenener example"

 
Sergey Voytsekhovsky:

Boa noite. Sua receptividade e atenção me honram. Muito obrigado. Como dizem os jovens, elogios e respeito.

Obrigado por seu sábio conselho. Eu não ligo a Magik e o símbolo quase conscientemente, em primeiro lugar, porque eles não são muito necessários no momento, meu consultor especializado não tem e provavelmente não terá nenhum concorrente, porque tem uma alta freqüência, um número enorme de posições mínimas. Ele está sufocando sozinho, onde mais ele pode competir com os outros? Naturalmente, se chegar a isso, terá um no terminal e na conta. A segunda provavelmente é rebuscada, só não sei muito ainda, mas talvez poupe um pouco de recursos.

Seus exemplos são bons, definitivamente os salvarei, mas não tenho bilhete, nem ordem, nem acordo. Mais precisamente, eu tenho centenas delas e não sei qual delas fechará agora. Você me sugeriu pensar que o fato de fechar uma posição pode ser tirado dos meus cálculos e estou tentando fazê-lo agora.

Tentarei imprimir tudo o que imprimir no fluxo. Meu Conselheiro Especialista será um gerador de posições e sabe como abrir posições ativamente e fechá-las ao mesmo tempo. A única coisa é encontrar esta posição (o bilhete de posição) na matriz/estrutura e removê-la. Portanto, é assim.

E como máquina de escrever, vou tentar usar o código de exemplo da referência, na seção sobre esta função, que é chamada lá:

É sempre bom compartilhar meus pequenos conhecimentos com alguém que está descobrindo algo por conta própria a partir da documentação, com base nestas dicas. © I.A. Krylov. O Cuckoo elogia o Cock por elogiar o Cuckoo. )))

Se você está escrevendo um EA somente para si mesmo, é claro que você pode tomar algumas liberdades. Se você não acha necessário verificar o símbolo e o mágico, então não o faça.

Sobre o destacado:

Há de tudo, o bilhete de posição, o bilhete de pedido e o bilhete de transação. E não é nem mesmo difícil puxar uma posição de abertura comercial e/ou de ordem. Está tudo na estrutura da MqlTradeTransaction


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

Alexey, tudo isso se refere apenas ao tratamento de eventos da OnTradeTransaction

Ocorreu um evento, um comércio que encerra uma posição foi executado. A posição já se foi neste momento. Isto pode ser confirmado selecionando a lista de pedidos e ofertas (não presentes no código) e lendo

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
E note que estamos falando de uma conta de hadge onde a posição geralmente tem apenas duas ordens e dois negócios.
Razão: