Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1662

 
Taras Slobodyanik #:

por que você precisa de 3 métodos?
é suficiente fazer tudo em um

  • verificou o pedido

- modificado
- não modificado

Isto é interessante!

Taras, digamos que temos três pedidos de compra com TP e SL, então em um pedido modificamos SL.

Pergunta: Como posso encontrar a ordem que foi modificada?

 
Taras Slobodyanik #:

por que você precisa de 3 métodos?
é suficiente fazer tudo em um

  • verificou o pedido

- modificado
- não modificado

Já existem dois, um controla o tamanho da matriz via OrdersTotal() onde os bilhetes de ordens modificadas são armazenados, e o outro procura por bilhetes nesta matriz. Mas agora mudei o código em outro lugar, não relacionado a tudo isso, e por alguma razão estou pegando um erro (overrun array).
 
MakarFX #:

Interessante!

Taras, digamos que há três pedidos de compra com TP e SL, então em um pedido SL foi alterado.

Pergunta: Como posso encontrar a ordem que foi alterada?

Obviamente, o SL (ou TP) foi alterado por uma razão, certo?
Devemos verificá-lo com base em algumas condições.

Então na próxima verificação esta condição será definida como "cumprida" - o pedido já foi modificado.


Se estamos falando de modificação manual, alguém vai mudar algo sem o conhecimento da EA, então é claro que precisamos coletar uma estrutura de matriz e compará-la constantemente com as ordens do mercado.

 
Taras Slobodyanik #:

por que você precisa de 3 métodos?
é suficiente fazer tudo em um

  • verificou o pedido

- modificado
- não modificado

A ordem não é 1, digamos que são 10. Eu escrevo o bilhete de cada um modificado para uma matriz. Mas, até agora, isto é um problema.
 
MakarFX #:

Removido

MakarFX, obrigado! Agora não há primeira ordem extra sem sinal, mas agora por alguma razão a primeira ordem de sinal (normal) está entrando 2 velas mais cedo)))) Anexei um screenshot do testador à minha mensagem, mas mesmo apesar desta primeira encomenda - o mais importante está feito, muito obrigado mais uma vez) Com os mágicos pegaram-no, então farei uma variável externa e quando anexar o espert a um determinado par de moedas, mudarei o número para cada par individualmente.

Arquivos anexados:
 
Nerd Trader #:
O pedido não é 1, há 10 pedidos. Escreverei o bilhete de cada um modificado para a matriz. Mas até agora, isto é um problema.

não importa quantos pedidos existam - desde que o TP/SL não precise ser alterado, de acordo com as condições = o pedido já foi modificado.

 
SanAlex #:

que é bom para diversão no testador.

e este é para você, como um presente - para ganhar dinheiro.

\\\\\\\\\\\\\\\\\\\\\\\\\\

Fiz o teste - veremos como funciona hoje à noite.

\\\\\\\\\\\\\\\\\\\\\\\\\\\

verificou como o padrão muda em todos os gráficos - tudo funcionou! -como o lucro geral atingiu o objetivo.


SanAlex, muito interessante, com certeza vou analisar esta EA em detalhes, obrigado!

 

Rapazes, bom dia no código aconselham, aqui está um gráfico à direita dos dois negócios menos compra - é coberto por uma venda, venda compra, de acordo com o algoritmo deve entrar na compra, mas porque - então estes dois fi-ções, que parecem e produzem um negócio menos o mais recente da história - mostram ambos no mais! Como escrever e onde o erro - esta inversão TS, na média - estes mesmos f-i funcionam corretamente, em resumo, após a venda - tem que abrir a compra, mas não abre, porque Em outras palavras, deve abrir a compra se meu pedido estiver perdendo, mas a compra não abre, porque o f-i pensa que se o negócio estiver perdendo mais vantagem, este f-iia informa VERDADEIRO, caso contrário é falso, mas ambos informam VERDADEIRO. Por favor, ajude-me a decidir.



// проверка предыдущего минусового селл
bool Calc_Loss_SELL()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) ==  DEAL_TYPE_BUY)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в селл разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В БАЙ разрешен ",TotalLot);
            break;
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


// проверка предыдущего минусового бай
bool Calc_Loss_BUY()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в бай разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В СЕЛЛ разрешен ", TotalLot);
            break;          
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


    //----------------------------------------------
      // проверка условий ПЕРЕВОРОТА В СЕЛЛ
      // нет поз рыночных и предыдущая сделка В БАЙ была минусовая и не было минусового селла
       Print(" Calc_Loss_BUY(): ",Calc_Loss_BUY(), " Calc_Loss_SELL(): ",Calc_Loss_SELL());
      
      if(!PositionSelect(Symbol()) && Calc_Loss_BUY() && !Calc_Loss_SELL())
        {
         m_trade.Sell(CalcLot(),_Symbol,LastTick.bid,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point - _Spread*_Point);
         Print(" ПЕРЕВОРОТ БАЯ В СЕЛЛ, Calc_Loss_BUY(): ",Calc_Loss_BUY());
        }

 
      // проверка условий ПЕРЕВОРОТА в SELL
      // нет поз рыночных и предыдущий селл был минусовой И НЕ БЫЛО МИНУСОВОГО БАЙ
      
      if(!PositionSelect(Symbol()) && Calc_Loss_SELL() && !Calc_Loss_BUY())
        {
         m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point + _Spread*_Point);
         Print(" ПЕРЕВОРОТ СЕЛЛА В БАЙ, Calc_Loss_SELL(): ",Calc_Loss_SELL());
        }

Não consigo abrir a compra, mas ela deve abrir depois de uma venda ubutical!!!!!!!!!


Em essência, o problema se resume a determinar o lucro ou perda foi fechado Posição Marginal, que se tornou um comércio de compra ou venda e olhar mais além em seu tipo!

AJUDA! MAIS!

 

Bom dia!

Há duas funções: uma função para calcular toda a grade de ordens e uma função para fechar ordens

//+------------------------------------------------------------------+
double CalculiteProfit()
{
    double oProfit = 0;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
          if (OrderType() == OP_BUY || OrderType() == OP_SELL)
          {
            oProfit += OrderProfit();
          }
        }
      }
    }
    return(oProfit);
}
//+------------------------------------------------------------------+
 double FindLastBuyPrice()
{
   int oldticket, ticket = 0;
   double oldopenprice = 0;
   
   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)
   {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
     {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
          oldticket = OrderTicket();
          if (oldticket > ticket)
          {
            ticket = oldticket;
            oldopenprice = OrderOpenPrice();
          } 
        }
     }
   }
   return(oldopenprice);
 }
//+------------------------------------------------------------------+

Há também condições para o fechamento de pedidos

 double op = CalculiteProfit(); 
     if (op >= Profit)
     {
       ClosseAll();
     }

Lucro - nos ajustes em moeda depo

A idéia de tudo isso: após o cálculo da grade de ordem é igual a zero maisLucro em moeda de depósito, toda a grade de ordem é fechada

Por favor, ajude-me a mudar o código para que haja pontos em vez de lucro. Obrigado.

 
Taras Slobodyanik #:

Obviamente, o sl (ou tp) foi mudado por alguma razão, não foi?
Mas de acordo com algumas condições.

Portanto, na próxima verificação, esta condição será definida como "cumprida" - a ordem foi modificada.


Se estamos falando de mudanças manuais, alguém vai mudar algo sem o conhecimento da EA, então é claro que precisamos coletar uma estrutura de matriz e compará-la constantemente com as ordens do mercado.

Eu já havia esquecido... e no início eu o fiz (ainda bem que eu me comprometi), mas o modo de funcionamento não me parecia confiável, eu queria algo mais óbvio para indicar uma ordem que havia sido alterada.

Razão: