[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 563

 

abeiks:

Há algum tempo, , tenho tentado retrabalhar o bloco de compra próxima para fechar apenas as duas últimas posições de compra, mas falhou. Você pode dizer a como refazer o bloco ?

É mais fácil e mais conveniente fazer uma função (bloco) para fechar uma última posição. E execute-o duas vezes. Em laço, ou apenas em fila.
 
abeiks:

Há algum tempo, , tenho tentado retrabalhar o bloco de compra próxima para fechar apenas as duas últimas posições de compra, mas falhou. Você pode dizer a como refazer o bloco ?

Há algum tempo atrás eu dei a vocês um algoritmo de solução para encontrar as últimas posições. E então o que fazer com eles é IMPORTANTE: contar, apagar, modificar os STOPs. Se você não for capaz de escrever código pelo menos "na imagem e semelhança", não é seu (programação)...
 
rigonich:



Obrigado!

 
peshihod:
É mais fácil, e mais conveniente, fazer uma função (bloco) para fechar uma última posição. E execute-o duas vezes. Em laço, ou apenas em fila.

Obrigado, é uma boa opção que vou tentar também.

 
delf:

Devo ter escrito mal :(

Há um algoritmo para a abertura de pedidos.

Eu preciso, que em qualquer variante de fechamento da última ordem, o seguinte tenha sido aberto em outra direção (quando as condições forem adequadas).

Todos os trabalhos, mas se eu tiver fechado por um stop loss, por exemplo, para vender, e as condições para abrir uma venda nessa direção, a abertura continua. O que precisamos é esperar por condições para comprar.

Ou seja, precisamos verificar o último pedido fechado, para que não coincida com o de abertura (alternância compra-venda-compra-venda). Apenas um pedido ou à espera de um sinal está em operação.

Entendo que provavelmente deveríamos usar o OrderHistoryTotal(), mas como seria em uma EA funcional?

Obrigado.


Este é provavelmente o caso em algum lugar. Mas se há muitos pedidos na história, é melhor usar seu próprio livro de pedidos. https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

Uma opção mais rígida

Muito obrigado a todos que responderam, resultado alcançado, exatamente o que eu precisava.
 
delf:

Devo ter escrito mal :(

Há um algoritmo para a abertura de pedidos.

Eu preciso, que em qualquer variante de fechamento da última ordem, o seguinte tenha sido aberto em outra direção (quando as condições forem adequadas).

Todos os trabalhos, mas se eu tiver fechado por um stop loss, por exemplo, para vender, e as condições para abrir uma venda nessa direção, a abertura continua. O que precisamos é esperar por condições para comprar.

Ou seja, precisamos verificar o último pedido fechado, para que não coincida com o de abertura (alternância compra-venda-compra-venda). Apenas um pedido ou à espera de um sinal está em operação.

Entendo que provavelmente deveríamos usar o OrderHistoryTotal(), mas como seria em uma EA funcional?

Obrigado.

Se você quiser aprender a programar, você pode olhar através do código dos outros (é para isso que serve CodaBase), ou proceder a partir do algoritmo da solução do problema. Pedir para escrever código para você é a maneira mais desesperada de aprender. Na maioria das vezes, você terá uma solução mal codificada para seu problema, algo como (alegoricamente) seu vizinho chamando-o à porta a cada minuto e perguntando "qual é seu nome" - trata-se de cálculos desnecessários (supérfluos).

O algoritmo para resolver seu problema pode ser o seguinte. Primeiro, você precisa ter certeza de que não tem "suas" ordens. Este problema, se não for para o testador (onde podemos limitar a solução à condição se (OrderTotal() == 0), é resolvido através de buscas de pedidos usando filtros para combinar OrderMagicNumber() e Symbol(). Em seguida, você verifica a condição (de acordo com sua estratégia) para abrir o pedido. Se houver um sinal, então usando a busca de OrderHistoryTotal() (geralmente é o último da lista), calcule o OrderType() da última ordem fechada. Se o sinal para abrir a ordem e o tipo da última ordem fechada não coincidirem, abra a ordem com base no sinal.

Esta abordagem envolve cálculos mínimos e reduz muito o tempo de otimização do Expert Advisor no testador.

 
TarasBY:
Há algum tempo atrás eu lhe dei o algoritmo para resolver a busca das últimas posições. E então o que fazer com eles não importa: contar, apagar, modificar STOP. Se você não for capaz de escrever código pelo menos "na imagem e semelhança", não é seu (programação)...


Sim, concordo, programação não é o meu forte, então estou aprendendo e fazendo perguntas aqui. Tentei adicionar fechamento de posição ao seu algoritmo mas falhou (todas as posições de compra estavam fechando) então decidi abordar o problema de outro ângulo e ver a solução de fechar as duas últimas posições de compra em um bloco de fechamento pronto que foi fornecido e oferecido a mim.

Eu ficaria muito grato se você pudesse me mostrar como fechar as duas últimas posições de compra. Vou entender onde cometi um erro.

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}

 
TarasBY:

Se você quiser aprender a programar, ou analisar o código de outras pessoas (é para isso que serve CodaBase) ou seguir o algoritmo para a tarefa em questão. Pedir para escrever código para você é a maneira mais desesperada de aprender. Na maioria das vezes você não receberá o melhor código para sua tarefa, algo como (alegoricamente) quando seu vizinho toca a cada minuto sua campainha e pergunta "qual é seu nome" - trata-se de cálculos desnecessários (supérfluos).

Concordo plenamente com você. Você está 100% certo. Este é o caminho certo e eu tentei segui-lo. Entretanto, estudar a MQL4 sem os livros didáticos e ler sem motivo levou a nada. Eu tinha que analisar o código de outra pessoa de qualquer maneira, já que eu não podia colocar minhas próprias idéias malucas no programa na maior parte do tempo. Comecei a construir a estratégia em ....excel (está mais perto de mim e é mais compreensível). Quanto aos princípios básicos da estratégia, ela tem sido muito bem sucedida e clara (sobre a história, é claro). Mas além disso, devo levar em conta as peculiaridades do comércio: spread flutuante, swap, peculiaridades da corretora, é difícil encaixar tudo isso em fórmulas exelentes. Assim, decidi analisar a diferença entre lucro em excel e MQL. Francamente falando, a diferença é muito grande, não a meu favor. Ainda não sei, vou analisar cada posição, talvez o Conselheiro Especialista tenha cometido um erro, mas isso depende de mim.

De qualquer forma, boas pessoas neste fórum me ajudaram a resolver um problema específico, que grande agradecimento humano.

 
Ekburg:

não, o problema de alterar o número de ordem de uma posição quando uma delas é fechada foi resolvido, eu verifiquei mais de uma vez pensando que pode haver um erro lá, mas tudo está bem lá, a ordem requerida é selecionada e o prejuízo é calculado corretamente para ela, mas a ordem não quer ser modificada...

O erro 1 é gerado somente se todos os parâmetros passados para a funçãoOrderModify( ) forem iguais a todos os parâmetros da ordem sendo modificada, que você( por número de bilhete) ou a funçãoOrderSelect() selecionada para modificação. Exemplo de uso do cheque:

Somente "Funções úteis da KimIV".

Função ModifyOrder()https://www.mql5.com/ru/forum/131859

Razão: