Discussão do artigo "Escrevendo um consultor especialista utilizando a abordagem de programação orientada a objeto do MQL5"
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?
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); }
o design é intrigante
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);
Não é assim que eles geralmente escrevem em tais casos?
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)?
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
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso

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.
Autor: Samuel