Discussão do artigo "Expert Advisor Multiplataforma: As classes CExpertAdvisor e CExpertAdvisors" - página 2

 


52959000 undeleted objects left

6619875 objects of type CExpertAdvisor left

6619875 objects of type CAccountInfo left

6619875 objects of type CSymbolManager left

6619875 objects of type COrderManager left

13239750 objects of type COrders left

6619875 objects of type CTradeManager left

6619875 objects of type CCandleManager left

1689399848 bytes of leaked memory


Como faço para corrigir esses erros? O programa foi desenvolvido com base em sua amostra.

Na função OnDeinit(), tenho apenas experts.OnDeinit().

Em OnInit(), apenas experts.OnTick();

E na função de sinal, eu apenas crio objetos de indicadores personalizados da mesma forma que em suas amostras.

 
mbjen:


52959000 undeleted objects left

6619875 objects of type CExpertAdvisor left

6619875 objects of type CAccountInfo left

6619875 objects of type CSymbolManager left

6619875 objects of type COrderManager left

13239750 objects of type COrders left

6619875 objects of type CTradeManager left

6619875 objects of type CCandleManager left

1689399848 bytes of leaked memory


Como faço para corrigir esses erros? O programa foi desenvolvido com base em sua amostra.

Na função OnDeinit(), tenho apenas experts.OnDeinit().

Em OnInit(), apenas experts.OnTick();

E na função de sinal, eu apenas crio objetos de indicadores personalizados da mesma forma que em suas amostras.


Tudo bem, a culpa é minha

 

Deixe-me relatar outro possível bug, se você não se importar.

Ele não retornou o número de ordens abertas. Comecei a verificar e descobri que o problema está relacionado ao OrdersBase e ao modo de classificação.

Tive de adicionar o seguinte código:

COrder *COrdersBase::NewOrder(const ulong ticket,const string symbol,const int magic,const ENUM_ORDER_TYPE type,const double volume,const double price)
  {
   COrder *order=new COrder(ticket,symbol,type,volume,price);
   if(CheckPointer(order)==POINTER_DYNAMIC)
     {
      order.SetContainer(GetPointer(this));
      if(SortMode()==-1)
         Sort(0);
      if(InsertSort(GetPointer(order)))
        {
         order.Magic(magic);
         if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_SELL)
            order.Init(GetPointer(this),m_stops);
         else order.Initialized(false);
         return order;
        }
     }
   return NULL;
  }


Não sei por que ele não é inicializado com o modo de classificação adequado ou tenho que inicializá-lo adicionalmente... não faço ideia.

 
mbjen:

Deixe-me relatar outro possível erro, se você não se importar.

Ele não retornou o número de ordens abertas. Comecei a verificar e descobri que o problema está relacionado ao OrdersBase e ao modo de classificação.

Tive de adicionar o seguinte código:


Não sei por que ele não é inicializado com o modo de classificação adequado ou tenho que inicializá-lo adicionalmente... não faço ideia.

O construtor COrdersBase tem o seguinte código:

COrdersBase::COrdersBase(void)
  {
   if(!IsSorted())
      Sort();
  }

No início, ele classifica sua matriz interna de objetos se ela ainda não estiver classificada, mas tenho certeza de que você já sabe disso.

Ele pode se tornar não classificado se outros itens forem adicionados a ele sem usar NewOrder() (por exemplo, Add()).

Não consigo reproduzir o problema que você tem. Meus resultados sempre retornam ordenados durante todo o teste. Tente encontrar o momento em que a matriz é desordenada pela primeira vez em seu teste. Isso pode lhe dar uma pista sobre a origem do problema.

 

Olá,

Eu o informarei se eu enfrentar o problema novamente.

Tenho outra pergunta. Como faço para obter a instância do especialista atual que está chamando o módulo de sinal?

Digamos que eu tenha uma classe de sinal que tem uma função para verificar os resultados de ordens anteriores. Tenho várias instâncias de especialista. Então, como obtenho as ordens de especialista atuais que estão chamando as funções de verificação de sinal?

Ou talvez haja outra solução adequada. Você poderia compartilhar alguma ideia ou trecho de código para isso?

Meu objetivo é criar um sinal que funcione de forma diferente dependendo do resultado da ordem/posição anterior.

 

Há muitas maneiras de fazer isso, que podem variar de um programador para outro. Por padrão, as instâncias de especialistas agem independentemente umas das outras. Você pode implementá-lo de modo que as instâncias possam compartilhar as mesmas informações.

Se quiser diferenciar as negociações abertas por cada um dos especialistas, você pode começar atribuindo um número mágico exclusivo para cada instância. Não posso ajudá-lo mais a menos que você mostre seu código.

 

Enrico,

Meu código é totalmente baseado em seus últimos exemplos.

Tenho apenas uma definição global CExpertAdvisors experts;

Em OnInit(), inicializo o módulo money/stops/signal e, em seguida, adiciono-os a cada instância de especialista.

Em OnTick(), tenho apenas experts.OnTick()

E tenho minha classe de sinal personalizada com Calculate(), LongCondition(), ShortCondition() e outras. Esse sinal é adicionado a cada instância de especialista.

Agora, só quero que a lógica do sinal dependa do resultado da última ordem/posição de cada instância de especialista específica. Isso não está relacionado ao número mágico (aliás, todas as minhas instâncias de especialista têm mágicas diferentes). Nas funções chamadas de sinal Calculate(), LongCondition(), ShortCondition(), não tenho mágica ou qualquer outro detalhe que possa me ajudar a identificar a instância de especialista e, em seguida, encontrar suas ordens.

Quanto ao código, que seja a função Calculate() assim:

bool SignalClass::Calculate()

{ //--- some code to find out if the expert last order was profitable or not return true;

}

Espero que você tenha entendido. Há alguma maneira de implementar isso sem modificar o código de sua biblioteca?

 

Olá Enrico,

Ainda estou tentando encontrar uma maneira possível de identificar qual instância especializada está chamando as funções de verificação de sinal. Como posso fazer isso? Alguma dica, por favor?

 

Outra pergunta. Se eu quiser ter um expert negociado em vários pares, como faço para inicializá-lo? Em CExpertAdvisorBase::Init(), preciso especificar um nome de símbolo.

 

Como faço para criar um tipo de MM com base nos resultados de pedidos anteriores? É tão pouco flexível...