Utilizo-o para obter um bilhete para uma encomenda SELL_STOP
Mudei o código para
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---if(bln_find_order) // true -> you should look for a order
{
staticlong counter=0;
Print("Attempt number ",counter);
ResetLastError();
if(HistoryOrderSelect(ul_find_order))
{
long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
if(type_order==ORDER_TYPE_SELL_STOP)
{
Print("The pending order ",ul_find_order," is found! Type of order is ",
EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
bln_find_order=false; // true -> you should look for a order
counter=0;
return;
}
else
{
Print("The order ",ul_find_order," is not pending");
bln_find_order=false; // true -> you should look for a orderreturn;
}
}
else
{
Print("Order ",ul_find_order," is not find, error#",GetLastError());
}
counter++;
}
}
Tudo está bem até um certo momento. Até que um outro tipo de ordem apareça na história.
Por exemplo, SELL_LIMIT.
Assim que o SELL_LIMIT aparece na história, não consigo obter um bilhete do último SELL_STOP.
O Conselheiro Especialista atira um erro.
A encomenda 9 não está pendente
Embora haja SELL_STOP na história
Porque tenho de obter a encomenda #9 se preciso do bilhete #7?
Parece que o Conselheiro Especialista procura a ordem necessária não ao longo de toda a história, mas apenas para a última
Quando StopLoss_=0, a condição superior desencadeia - uma tentativa de modificar TakeProfit. O erro é que subtrai do PREÇO ABERTO - neste caso, o nível TakeProfit pode ser superior ao PREÇO CORRENTE e isto é um erro.
No seu caso, subtraia do PREÇO DIREITO (m_position.PriceCurrent).
Pode estar inaceitavelmente perto do preço actual. Como se verifica isto?
Eu não tenho acesso a uma troca, por isso faça-o você mesmo ou trabalhe em instrumentos de câmbio. Desculpe.
Adicionado: introduzir mais uma verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser MAIS ALTO ou IGUAL, para o actual TakeProfit da posição.
Eu não tenho acesso a uma troca, por isso faça-o você mesmo ou trabalhe em instrumentos de câmbio. Desculpe.
Adicionado: introduzir outra verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser MAIS ALTO ou EQUAL para o actual TakeProfit da posição.
Vladimir Karputov:...introduzir outra verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser ALTO ou IGUAL para o TakeProfit actual da posição.
Não encaixa, modificar pela ATR Que outras verificações podem ser feitas para este erro? Tudo é possível. No mt4 existeSTOPLEVEL, mas aqui o quê?
Existe um consultor especializado que lhe permite determinar quando uma ordem pendente foi accionada
https://www.mql5.com/ru/code/17610
Utilizo-o para obter um bilhete para uma encomenda SELL_STOP
Mudei o código para
Tudo está bem até um certo momento. Até que um outro tipo de ordem apareça na história.
Por exemplo, SELL_LIMIT.
Assim que o SELL_LIMIT aparece na história, não consigo obter um bilhete do último SELL_STOP.
O Conselheiro Especialista atira um erro.
A encomenda 9 não está pendente
Embora haja SELL_STOP na história
Porque tenho de obter a encomenda #9 se preciso do bilhete #7?
Olá. Recebo um erro seStopLoss_=0
falhou modificar #2 vender 3,00 Si-9,18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Paragens inválidas]
Olá. Recebo erro seStopLoss_=0
falhou modificar #2 vender 3,00 Si-9,18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Paragens inválidas]
Lógica incorrecta na escrita do programa.
Quando StopLoss_=0, a condição superior desencadeia - uma tentativa de modificar TakeProfit. O erro é que subtrai do PREÇO ABERTO - neste caso, o nível TakeProfit pode ser superior ao PREÇO CORRENTE e isto é um erro.
No seu caso, subtraia do PREÇO DIREITO (m_position.PriceCurrent).
Uma posição de venda foi aberta e o selllimit foi activado, tenho de mover o tp em relação ao novo preço da posição, não em relação ao preço actual.
Que tipo de verificação devo fazer para evitar tentar modificar para um preço inválido?
Uma posição de venda foi aberta e o selllimit foi activado, tenho de mover o tp em relação ao novo preço da posição, não em relação ao preço actual.
Que tipo de verificação devo fazer para não tentar modificar para um preço inválido?
Verificar:
if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent() { m_trade.PositionModify(m_position.Ticket(), m_position.StopLoss(), m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit) ); ...Verificar:
Obrigado, mas o erro mantém-se.
Pode estar inaceitavelmente perto do preço actual. Como posso verificar isto?
Obrigado, mas o erro mantém-se.
Pode estar inaceitavelmente perto do preço actual. Como se verifica isto?
Eu não tenho acesso a uma troca, por isso faça-o você mesmo ou trabalhe em instrumentos de câmbio. Desculpe.
Adicionado: introduzir mais uma verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser MAIS ALTO ou IGUAL, para o actual TakeProfit da posição.
Eu não tenho acesso a uma troca, por isso faça-o você mesmo ou trabalhe em instrumentos de câmbio. Desculpe.
Adicionado: introduzir outra verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser MAIS ALTO ou EQUAL para o actual TakeProfit da posição.
Provavelmente o preço de abertura (POSITON_PRICE_OPEN) ?
Provavelmente o preço de abertura (POSITON_PRICE_OPEN) ?
Esta opção estava acima. Ver os postos acima. Respondeu no meio da conversa.
Não encaixa, modificar pela ATR Que outras verificações podem ser feitas para este erro? Tudo é possível. No mt4 existeSTOPLEVEL, mas aqui o quê?