Bom dia, se alguém puder me ajudar, por favor. No meu entendimento, fiz tudo o que está indicado no artigo. Mas não consigo ter duas operações abertas simultâneas, além do que entendo que o autor queria fazer para não colocar compra se já havia compra ou venda se já havia venda. Minha estratégia, por exemplo, envia um sinal de venda quando tenho uma ordem de compra aberta e, em vez de abrir uma venda, o código fecha a operação de compra sem que ela consiga tocar o tp/sl. Assim, fico sem nenhuma compra ou venda. A venda fecha a compra e a compra fecha a venda. Estou usando apenas um par, apenas um período de tempo e apenas um tamanho de lote em minha estratégia. Você pode me dizer como posso ter a compra e a venda abertas ao mesmo tempo se isso acionar a estratégia? Ou seja, que as ordens sejam fechadas SOMENTE por tp/sl. Muito obrigado desde já.
Estou no "Testador de Estratégia" com este arquivo do final do Guia e ele aparece o seguinte erro:
*o erro já foi conversado aqui neste artigo, porém nenhuma solução escrita deu certo comigo e preciso de suas ajudas.
OF 012:44:39.040 EA_ADX (XAUUSD,H1) 2020.01.0319:00:00Alert: The Buy order request could not be completed -error:4756
ED 212:44:39.043 Trades 2020.01.0320:00:00 failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP 012:44:39.043 EA_ADX (XAUUSD,H1) 2020.01.0320:00:00Alert: The Buy order request could not be completed -error:4756
ER 212:44:39.049 Trades 2020.01.0321:00:00 failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR 012:44:39.049 EA_ADX (XAUUSD,H1) 2020.01.0321:00:00Alert: The Buy order request could not be completed -error:4756
PP 212:44:39.053 Trades 2020.01.0322:00:00 failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]
//--- Do we have positions opened already?bool Buy_opened= false ; // variable to hold the result of Buy opened positionbool Sell_opened= false ; // variable to hold the result of Sell opened positionif ( PositionSelect ( _Symbol ) == true ) // we have an opened position
{
if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
{
Buy_opened = true ; //It is a Buy
}
elseif ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
{
Sell_opened = true ; // It is a Sell
}
}
Como PositionSelect seleciona a primeira posição para _Symbol, se o EA abrir uma posição de compra, a variável Sell_opened sempre será falsa enquanto a posição de compra estiver aberta, fazendo com que várias posições de venda sejam realizadas sempre que houver um sinal de venda.
Para corrigir isso e saber se há posições de compra e venda abertas simultaneamente, a seguinte lógica pode ser usada:
//--- Do we have positions opened already?bool Buy_opened = false ; // variable to hold the result of Buy opened positionbool Sell_opened = false ; // variables to hold the result of Sell opened positionif ( PositionSelect ( _Symbol ) == true ) // we have an opened position
{
for ( int i= 0 ;i< PositionsTotal ();i++){
PositionSelectByTicket ( PositionGetTicket (i));
if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
{
Sell_opened = true ; // It is a Sell
} elseif ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
{
Buy_opened = true ; //It is a Buy
}
}
Muito obrigado pelo artigo, Samuel, você é demais!
Foi um pouco difícil fazê-lo funcionar com minha corretora porque o artigo está no modo "net" e tive que procurar informações para colocá-lo no modo "hedging". O primeiro problema que encontrei foi com o mrequest.type_filling .
Para o corretor XM, o que funciona é:
mrequest.type_filling = ORDER_FILLING_IOC; // Tipo de execução da ordem
Se você não souber qual deles o seu MT5 permite, minha recomendação é usar a função TypeFilling() em um Print(TypeFilling()) ou um Comment( TypeFilling()) e ele retorna o tipo; se ele informar que é 1 (ORDER_FILLING_FOK) ou 2 (ORDER_FILLING_IOC), você saberá qual deles deve colocar(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) porqueORDER_FILLING_FOK (1) não funciona para mim com essa corretora.
Depois que isso for corrigido, o problema é que o PositionSelect abre muitas posições. Embora Samuel não diga isso em sua estratégia, entendo que o objetivo é abrir uma única posição de compra ou venda (o que vier primeiro) com os critérios estabelecidos (as 4 etapas booleanas) e que, até que essa posição seja fechada, não podemos abrir outra.
O que eu fiz foi alterar esse código ...
//--- não temos erros, portanto, continuamos.//--- Já temos posições abertas?bool Buy_opened=false; // variável que armazena o resultado da posição aberta Purchasebool Sell_opened=false; // variável que armazena o resultado da posição aberta Vendaif (PositionSelect(_Symbol) ==true) // temos uma posição aberta
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
Buy_opened = true; // É uma compra
}
elseif(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
Sell_opened = true; // It's a Sale
}
}
Para este...
//--- Como não há erros, continuamos.//--- Já temos posições abertas?bool Buy_opened = false; // Variável que armazena o resultado da posição de compra abertabool Sell_opened = false; // Variável que armazena o resultado da posição de venda aberta// Vamos examinar todas as ordens para ver se há alguma em aberto.for(int i = 0; i < PositionsTotal(); i++)
{
ulong ticket = PositionGetTicket(i);
PositionSelectByTicket(ticket);
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
Buy_opened = true; // é uma compra
}
elseif(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
Sell_opened = true; // é uma venda
}
}
// se houver uma posição aberta, esperamos até que a operação ativa seja fechada (tocando o SL ou oTP).if (Buy_opened || Sell_opened) return;
Observação: Logo após vem a linha...
//--- Copie o preço de fechamento da barra anterior para a barra atual, que é a barra1.
p_close=mrate[1].close;
Dessa forma, funcionou bem para mim. Espero que seja útil para você.
Alguém sabe se posso utilizar esse EA para mini-índice ou mini-dólar ?
Olá pessoal, bom dia.
Estou no "Testador de Estratégia" com este arquivo do final do Guia e ele aparece o seguinte erro:
*o erro já foi conversado aqui neste artigo, porém nenhuma solução escrita deu certo comigo e preciso de suas ajudas.
O arquivo é o do final do Guia.
Como resolver este problema?
Também continuo com esse erro depois de fazer as duas correções sugeridas:
ZeroMemory(mrequest);
e também
if(Buy_opened || Sell_opened)
Alguém pode me ajudar com o erro 4756? Parece que não é possível colocar uma ordem de compra.
Verifique se você usou a função SymbolInfoTick e escreveu essa parte do código:
Como PositionSelect seleciona a primeira posição para _Symbol, se o EA abrir uma posição de compra, a variável Sell_opened sempre será falsa enquanto a posição de compra estiver aberta, fazendo com que várias posições de venda sejam realizadas sempre que houver um sinal de venda.
Para corrigir isso e saber se há posições de compra e venda abertas simultaneamente, a seguinte lógica pode ser usada:
Olá pessoal, bom dia.
Estou no "Testador de Estratégia" com este arquivo do final do Guia e ele aparece o seguinte erro:
*o erro já foi conversado aqui neste artigo, porém nenhuma solução escrita deu certo comigo e preciso de suas ajudas.
O arquivo é o do final do Guia.
Como resolver este problema?
Verifique o preço de venda que está solicitando, para isso use breakpoint para depurar as variáveis mrequest.price, mrequest.sl e mrequest.tp
Tente mudar
para:
Alguns papeis tem regras de Stop Loss minimo, leia mais aqui: https://www.mql5.com/pt/forum/319474
Olá,
Muito obrigado pelo artigo, Samuel, você é demais!
Foi um pouco difícil fazê-lo funcionar com minha corretora porque o artigo está no modo "net" e tive que procurar informações para colocá-lo no modo "hedging". O primeiro problema que encontrei foi com o mrequest.type_filling .
Para o corretor XM, o que funciona é:
Se você não souber qual deles o seu MT5 permite, minha recomendação é usar a função TypeFilling() em um Print(TypeFilling()) ou um Comment( TypeFilling()) e ele retorna o tipo; se ele informar que é 1 (ORDER_FILLING_FOK) ou 2 (ORDER_FILLING_IOC), você saberá qual deles deve colocar(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) porqueORDER_FILLING_FOK (1) não funciona para mim com essa corretora.
Depois que isso for corrigido, o problema é que o PositionSelect abre muitas posições. Embora Samuel não diga isso em sua estratégia, entendo que o objetivo é abrir uma única posição de compra ou venda (o que vier primeiro) com os critérios estabelecidos (as 4 etapas booleanas) e que, até que essa posição seja fechada, não podemos abrir outra.
O que eu fiz foi alterar esse código ...
Para este...
Observação: Logo após vem a linha...
Dessa forma, funcionou bem para mim. Espero que seja útil para você.
Com os melhores cumprimentos.
Também continuo com esse erro depois de fazer as duas correções sugeridas:
ZeroMemory(mrequest);
e também
if(Buy_opened || Sell_opened)
Alguém pode me ajudar com o erro 4756? Parece que não é possível colocar uma ordem de compra.
Talvez o tipo de preenchimento de sua corretora seja ORDER_FILLING_IOC, você pode tentar editar o código a partir de:
mrequest.type_filling = ORDER_FILLING_FOK;Para:
mrequest.type_filling = ORDER_FILLING_IOC;Eu tive o mesmo problema e agora o resolvi com sucesso