Discussão do artigo "Implementando Take Profit na forma de ordens limitadas sem alterar o código original do EA" - página 6

 
ele me dá o erro <Stack Overflow>! E o problema está no arquivo da biblioteca:
<LimitTakeProfit.mqh>
Alguém descobriu o que deu errado?
 

Olá leitores!

Alguém mais se deparou com o erro"stack overflow"?

Acho que o problema está na biblioteca "LimitTakeProfit.mqh"!!!

 

Olá, Dmitry,


Obrigado por seu interessante artigo!


Por favor, você poderia explicar o erro "paramter passed as reference, variable expected" relacionado a cada uma das linhas a seguir (linhas 54, 55, 56)?


CSymbolInfo CLimitTakeProfit::c_Symbol = new CSymbolInfo();

CArrayLong CLimitTakeProfit::i_TakeProfit = new CArrayLong();

CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


Obrigado!

 
Mario Marconi CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


Obrigado!

Olá, você usa?

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>
 
Dmitriy Gizlyk #:

Olá, você usa?

Olá, Dmitry,

As linhas a seguir estão escritas exatamente em seu "LimitTakeProfit.mqh":

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>

Mais precisamente, esse erro "paramter passed as reference, variable expected" vem da compilação de seu EA " MACD Sample LImitTP.mq5".


Obrigado por responder!

 
Mario Marconi #:

Oi Dmitry,

As linhas a seguir estão escritas exatamente em seu "LimitTakeProfit.mqh":

Mais precisamente, esse erro "paramter passed as reference, variable expected" vem da compilação de seu EA " MACD Sample LImitTP.mq5".


Obrigado por responder!

Olá, você deve adicionar * antes de paprameter

CSymbolInfo    * CLimitTakeProfit::c_Symbol       =  new CSymbolInfo();
CArrayLong     * CLimitTakeProfit::i_TakeProfit   =  new CArrayLong();
CArrayDouble   * CLimitTakeProfit::d_TakeProfit   =  new CArrayDouble();
 
Dmitriy Gizlyk #:

Olá, você deve adicionar * antes de paprameter

Olá, Dmitry,


Algo ainda não está funcionando, as mesmas três linhas apresentam os seguintes erros:

- parâmetro passado como referência, variável esperada LimitTakeProfit.mqh 54 57

- redefinição; modificadores de tipo diferentes LimitTakeProfit.mqh 54 35


Obrigado por responder!

 

Oi Dmitry,

Sei que este artigo foi publicado há algum tempo, mas gostaria de agradecer por ele! Ele é muito útil, sua explicação é muito clara e a classe funciona muito bem. Obrigado!

Acredito que encontrei um pequeno erro no código publicado. Na metade da função SetTakeProfits, encontramos esta linha:

switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))

Isso está dentro de um loop que percorre todos os TP. O problema é que, mais adiante no loop, a função CheckLimitOrder é chamada, que, por sua vez, chama a função CheckOrderInHistory, e aí outra posição pode ser selecionada. Isso significa que, na próxima iteração do loop, o "switch" no código acima pode ser diferente.

Para resolver isso, acredito que position_type de va ser armazenado em uma variável, antes do início do loop. Assim:

bool CLimitTakeProfit::SetTakeProfits(ulong position_ticket, double new_tp=0)

// (...)

   double position_volume=PositionGetDouble(POSITION_VOLUME);

//********** ADICIONAR A PRÓXIMA LINHA
   ENUM_POSITION_TYPE position_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//****************************

   double closed=0;
   double closed_perc=0;
   double fix_closed_per=0;
//---
   for(int i=0;i<total;i++)
     {
      tp_request.comment="TP"+IntegerToString(i)+"_"+IntegerToString(position_ticket);
      if(i_TakeProfit.At(i)<tp_int && d_TakeProfit.At(i)>0)
        {
         if(closed>=100 || fix_closed_per>=100)
            break;
//---
         double lot=position_volume*MathMin(d_TakeProfit.At(i),100-closed_perc)/(100-fix_closed_per);
         lot=MathMin(position_volume-closed,lot);
         lot=c_Symbol.LotsMin()+MathMax(0,NormalizeDouble((lot-c_Symbol.LotsMin())/c_Symbol.LotsStep(),0)*c_Symbol.LotsStep());
         lot=NormalizeDouble(lot,2);
         tp_request.volume=lot;

//********** MODIFIQUE A PRÓXIMA LINHA
         //switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
         switch(position_type)
//*******************************
           {
            case POSITION_TYPE_BUY:
              tp_request.type=ORDER_TYPE_SELL_LIMIT;
              tp_request.price=c_Symbol.NormalizePrice(open_price+i_TakeProfit.At(i)*c_Symbol.Point());

// (...)

Espero que isso faça sentido. Mais uma vez, obrigado pelo excelente trabalho!

 

Olá a todos!

Estou tendo um problema de [Invalid expiration]. Alguém sabe como resolver isso?

 

Olá.

Ao testar o EA com LimitTakeProfit, ele retorna a seguinte mensagem de erro: “Expiração inválida”.

Tentei adicionar expiração junto com a estrutura de solicitação de negociação, mas sem sucesso.

Alguém me ajude, por favor.

Tradução automática aplicada pelo moderador