Discussão do artigo "Escrevendo um consultor especialista utilizando a abordagem de programação orientada a objeto do MQL5"

 

Novo artigo Escrevendo um consultor especialista utilizando a abordagem de programação orientada a objeto do MQL5 foi publicado:

Este artigo foca na abordagem orientada a objeto para fazer o que fizemos no artigo "Guia passo a passo para escrever um Expert Advisor no MQL5 para iniciantes" - criando um simples Expert Advisor. A maior parte das pessoas acha que isso é difícil, mas quero assegurá-lo que quando você terminar de ler esse artigo, você será capaz de escrever o seu próprio consultor especialista que é baseado em orientação a objeto.

Funções de membro da classe

Autor: Samuel

 

Em geral, ele não é ruim, mas é um pouco fraco em seguir o slogan OOP usado no nome. Por exemplo, por que stoploss, take e price são colocados fora da classe? STP e TKP deveriam ser membros, precisamos do método setSLTP; latest_price e levels deveriam ser considerados dentro de openBuy/openSell. Eles próprios estão escritos de forma muito irracional - é desejável deixar apenas um if com chamada MarginOK e, dentro dele, adicionar a primeira linha da verificação if(Chk_Margin == 0) return(true);

E mais uma pequena coisa. Por que Chk_Margin é declarado como int-, embora seja usado apenas como um bool? Seria melhor descrevê-lo com um tipo mínimo suficiente, caso contrário, haverá dúvidas ao ler o código-fonte, o que acontecerá se Chk_Margin == 2, 3, etc.?

 
Com o par especificado no período especificado e com os parâmetros de entrada padrão, não é possível obter um gráfico de equilíbrio tão bonito. O autor tinha outras citações? Você poderia anexar os parâmetros de entrada com os quais esse gráfico foi obtido?
 
capr:
Com o par especificado no período especificado e com os parâmetros de entrada padrão, não é possível obter um gráfico de equilíbrio tão bonito. O autor tinha outras citações? Você poderia anexar os parâmetros de entrada com os quais esse gráfico foi obtido?

Quão diferentes devem ser as cotações entre você e o autor para que os resultados sejam muito diferentes))))))) Consegui quase o mesmo, e o resultado final é até um pouco melhor:

 

O design é intrigante

   if(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4)
     {
       return(true);
     }
     else
     {
       return(false);
     }
[Excluído]  
ortv:

o design é intrigante

Por que exatamente você não gosta tanto dele? É claro que eu não o vi no contexto do código....
 
Interesting:
Por que exatamente você não gosta tanto dele? É claro que eu não vi isso no contexto do código.....

não é assim que você geralmente escreve nesses casos?

return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
[Excluído]  
ortv:

Não é assim que eles geralmente escrevem em tais casos?

Você pode fazer isso dessa forma, se o código for reproduzido exatamente e não houver mais nada no processamento...
 

Não entendo a seguinte parte do código:

// Copiar o preço de fechamento da barra anterior (barra 1) para a variável correspondente do Expert Advisor
   Cexpert.setCloseprice(mrate[1].close);  // preço de fechamento da barra 1
//--- Verificar se há uma posição de compra
   if (Cexpert.checkBuy()==true)
   {
      if (Buy_opened) 
         {
            Alert("Já temos uma posição para comprar!!!"); 
            return;    // Não adicione à posição longa
         }
      double aprice = NormalizeDouble(latest_price.ask,_Digits);
      double stl    = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);
      double tkp    = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);
      int    mdev   = 100;
      // fazer o pedido
      Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev);
   }
Se formos abrir uma posição de compra, devemos nos concentrar no preço latest_price.ask, mas ao definir um Stop Loss e Take Profit para essa posição - no preço latest_price.bid. Isso está correto? Por que o Stop Loss e o Take Profit são definidos com base no preço de venda no texto do código? É um erro de impressão ou uma peculiaridade de uma estratégia específica (o código tem uma construção semelhante para abrir uma posição de venda)?
[Excluído]  
Yedelkin:

Não entendo a seguinte parte do código:

Se formos abrir uma posição de compra, devemos nos concentrar no preço latest_price.ask, mas ao definir um Stop Loss e Take Profit para essa posição - no preço latest_price.bid. Isso está correto? Então, por que o Stop Loss e o Take Profit são definidos com base no preço de venda no texto do código? É um erro de impressão ou uma peculiaridade de uma estratégia específica (o código tem uma construção semelhante para abrir uma posição de venda)?

Esta é a lógica (provavelmente, eu também costumo usá-la):

1. O preço de abertura para compra é considerado como Ask (e está correto);

Digamos que abrimos a 1,27 no EURUSD.

2. Ao abrir uma posição, obtemos a diferença igual ao spread; no caso da compra, é o Ask-Bid (perda potencial se fecharmos com o preço atual);

Vamos supor que o spread seja igual a 5 pips. Portanto, o lance na abertura será de 1,2695 (certo?).

3. As posições compradas são fechadas ao preço de compra (e isso é bastante lógico).

Portanto, quando o Bid for para 1,27, teremos uma BU na posição (certo?).

4. Mas também precisamos obter um lucro (100 pips na cotação padrão).

Ou seja, o TP deve ser maior que o Open em 100 pips. No nosso caso, é 1,28 (certo?).

Ao mesmo tempo, o TP será acionado se o Bid (não o Ask) atingir esse valor de 1,28....

5. O SL também precisa ser definido (digamos que seja 50 pips). Portanto, em nosso exemplo, ele estará localizado em 1,2650 (50 pips abaixo do Open).

Em que condições o SL funcionará?

Logicamente, ele deve funcionar quando o preço passar esses mesmos 50 pips contra nós (ou seja, o Ask nas moedas de fechamento no SL deve estar logicamente nesses mesmos 1,2650).

Onde deve estar o Bid nesse caso? E nesse momento ele estará localizado em 1,2645 (porque Spred pela condição temos 5 pips).

Lembrando que os Longs são fixos.

6. Agora vamos ver o que está realmente acontecendo (vamos tomar como exemplo a abertura do mercado de uma posição comprada na MQL4).

//Взято из справки по OrderSend
 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point);

O que vemos aqui

O preço de abertura é considerado como Ask, o SL é considerado como Bid e o TP é considerado como Ask.

Em nosso caso, obteremos esse padrão.

OrderSend(Symbol(),OP_BUY,1,Open = Ask,3,SL = Bid-50*Point,TP Ask+100*Point);

Vamos substituir nossos dados aqui:

OrderSend(Symbol(),OP_BUY,1,1.2700,3,1.2695-50*Point,TP 1.2700+100*Point);

O que obtemos no final - Abertura = 1,2700 SL= 1,2645 TP 1,28

PS

Vamos comparar com os dados originais:

Ordem - Aberta = 1,2700 SL= 1,2645 TP 1,28

Modelo - Aberto = 1,2700 SL= 1,2645 TP 1,28

 
Interesting:

Há essa lógica aqui (muito provavelmente, eu também costumo usá-la):

1. O preço de abertura para compra é considerado como Ask (e está correto);

Digamos que abramos a 1,27 no EURUSD

2. Ao abrir uma posição, obtemos a diferença igual ao spread; no caso da compra, é o Ask-Bid (perda potencial se fecharmos com o preço atual);

Vamos supor que o spread seja igual a 5 pips. Portanto, o lance na abertura será de 1,2695 (certo?).

5. O SL também deve ser definido (digamos que seja de 50 pips). Portanto, em nosso exemplo, ele estará localizado em 1,2650 (50 pips abaixo de Open)

Em que condições o SL será acionado?

Logicamente, ele deve funcionar quando o preço passar esses mesmos 50 pips contra nós (ou seja, o Ask nas moedas de fechamento no SL deve estar logicamente nesses mesmos 1,2650).

Onde deve estar o Bid nesse caso? E, nesse momento, ele estará localizado em 1,2645 (porque, de acordo com a condição, temos 5 pips).

Lembrando que os Longs são fixos.

Se o Bid na abertura estiver em 1,2695, já temos 5 pips de perda automaticamente. Se, ao mesmo tempo, o SL for de 50 pips, de acordo com a ideia do desenvolvedor, então teremos mais 45 pips para ir na direção desfavorável antes que ele seja acionado. Ou seja, quando o stop loss for acionado, o Bid deverá estar em 1,2650 em vez de 1,2645; e o Ask, respectivamente, em 1,2655.