Ajuste para coeficiente de EA

 

Boa noite amigos,


Encontrei esse EA na CodeBase e estou fazendo estudos em cima dele, mudando alguns parâmetros para aprender algumas coisa, porém estou "travado" em um problema e não encontro solução.

O EA funciona da seguinte forma:

- Ele monitora todas as ordens abertas e se um determinado numero de pips vai contra a ordem (negativo) ele abre uma posição oposta multiplicando o último volume negociado pelo coeficiente, até ai tudo bem.


O que estou tentando fazer é que a multiplicação seja feita não pelo último volume negociado, mas sim pelo volume total aberto, por exemplo:

- Eu abri uma ordem de venda com lote 0,02

- O preço sobe e o EA ativa uma ordem de compra com 0,04

- O preço desce e o EA ative uma ordem de venda de 0,08 (é aqui que quero mudar)


No caso, a ordem de venda de 0,08 deveria ser de 0,06, porque já existe uma ordem de venda de 0,02, que somando seria 0,08


A linha de comando que faz essa função é a seguinte

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
        {
         long id=m_position.Identifier();
         if(FingId(id))
            continue;
         string symbol        = m_position.Symbol();
         ulong magic          = m_position.Magic();
         double freeze_level  = 0.0,stop_level=0.0;
         if(!RefreshRates(symbol,magic,freeze_level,stop_level))
            continue;
         int digits_adjust=1;
         if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
            digits_adjust=10;
         double m_adjusted_point=m_symbol.Point()*digits_adjust;

         if(m_position.PositionType()==POSITION_TYPE_BUY)
            if(m_position.PriceOpen()-m_position.PriceCurrent()>=InpLosing*m_adjusted_point)
              {
               double lot=LotCheck((m_position.Volume()*InpLotCoefficient));
               if(lot==0.0)
                  continue;
               if(OpenSell(lot,0.0,0.0))
                  AddId(id);
              }

         if(m_position.PositionType()==POSITION_TYPE_SELL)
            if(m_position.PriceCurrent()-m_position.PriceOpen()>=InpLosing*m_adjusted_point)
              {
               double lot=LotCheck((m_position.Volume()*InpLotCoefficient));
               if(lot==0.0)
                  continue;
               if(OpenBuy(lot,0.0,0.0))
                  AddId(id);
              }
        }

A mudança que eu fiz foi...

   double buys_volume=0.0,sells_volume=0.0,positions_volume=0.0; // crio 3 variaveis

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
        {
         positions_volume=m_position.Volume(); // defino a variavel volume
         long id=m_position.Identifier();
         if(FingId(id))
            continue;
         string symbol        = m_position.Symbol();
         ulong magic          = m_position.Magic();
         double freeze_level  = 0.0,stop_level=0.0;
         if(!RefreshRates(symbol,magic,freeze_level,stop_level))
            continue;
         int digits_adjust=1;
         if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
            digits_adjust=10;
         double m_adjusted_point=m_symbol.Point()*digits_adjust;

         if(m_position.PositionType()==POSITION_TYPE_BUY)
            buys_volume+=positions_volume; // somo a variavel buy a cada posição buy
            if(m_position.PriceOpen()-m_position.PriceCurrent()>=InpLosing*m_adjusted_point)
              {
               double lot=LotCheck((m_position.Volume()*InpLotCoefficient)-sells_volume); // multiplico o lote buy e diminuo o volume buy
               if(lot==0.0)
                  continue;
               if(OpenSell(lot,0.0,0.0))
                  AddId(id);
              }

          if(m_position.PositionType()==POSITION_TYPE_SELL)
            sells_volume+=positions_volume; // somo a variável sell a cada posição sell
            if(m_position.PriceCurrent()-m_position.PriceOpen()>=InpLosing*m_adjusted_point)
              {
               double lot=LotCheck((m_position.Volume()*InpLotCoefficient)-buys_volume); // multiplico o lote sell e diminuo o volume buy
               if(lot==0.0)
                  continue;
               if(OpenBuy(lot,0.0,0.0))
                  AddId(id);
              }
        }


O problema é que, quando eu abro ordens manualmente ele consegue identificar os volumes sell e buy, porém, quando o EA abre as ordens os volumes não são contabilizados.

Alguém poderia me ajudar?

 
rmca:

Boa noite amigos,


Encontrei esse EA na CodeBase e estou fazendo estudos em cima dele, mudando alguns parâmetros para aprender algumas coisa, porém estou "travado" em um problema e não encontro solução.

O EA funciona da seguinte forma:

- Ele monitora todas as ordens abertas e se um determinado numero de pips vai contra a ordem (negativo) ele abre uma posição oposta multiplicando o último volume negociado pelo coeficiente, até ai tudo bem.


O que estou tentando fazer é que a multiplicação seja feita não pelo último volume negociado, mas sim pelo volume total aberto, por exemplo:

- Eu abri uma ordem de venda com lote 0,02

- O preço sobe e o EA ativa uma ordem de compra com 0,04

- O preço desce e o EA ative uma ordem de venda de 0,08 (é aqui que quero mudar)


No caso, a ordem de venda de 0,08 deveria ser de 0,06, porque já existe uma ordem de venda de 0,02, que somando seria 0,08


A linha de comando que faz essa função é a seguinte

A mudança que eu fiz foi...


O problema é que, quando eu abro ordens manualmente ele consegue identificar os volumes sell e buy, porém, quando o EA abre as ordens os volumes não são contabilizados.

Alguém poderia me ajudar?

Se você não sabe programar eu recomendo o serviço de Freelance...

Aplicativos de negociação para o MetaTrader 5 por encomenda
Aplicativos de negociação para o MetaTrader 5 por encomenda
  • www.mql5.com
Eu preciso de um robot simples para o METATRADER 5. Ele compraria a mercado uma lista de ações pré definidas e venderia a uma porcentagem definida. Exemplo: Eu cadastraria a lista de ações que desejo trabalhar ordenando as de 1 a 100 ações por exemplo. Escolho qual valor máximo por ação ele vai trabalhar e qual o valor máximo quero estar...
Razão: