oldiol: Escrevo no código: if(!m_Trade.PositionClose(_Symbol,100))//--- fechamos a posição pelo símbolo actual. O resultado é que a posição é invertida! Ficaria muito grato por dicas sobre como fechar a posição.
A posição é invertida porque o programa envia dois pedidos idênticos para o servidor. O programa envia dois pedidos idênticos para o servidor, porque o seu código não verifica a presença de um pedido enviado anteriormente (e não verifica o resultado do processamento deste pedido no servidor).
Yedelkin: A posição é invertida porque o programa envia dois pedidos idênticos para o servidor. O programa envia dois pedidos idênticos para o servidor porque o seu código não verifica um pedido enviado anteriormente (e não verifica o resultado do processamento deste pedido no servidor).
oldiol: Por favor corrija o meu código para o correcto...
Todos têm uma compreensão diferente do código certo. Por isso, é preciso escrever o código "correcto" no final. E como outra dica - tente ver se este código funciona correctamente (uso esquemático da bandeira sendRequest):
bool sentRequest=false; //задать на уровне глобальных переменных программы
...
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
if(!sentRequest)
{
if(p_close1<buy_stop_level)
{
if(!m_Trade.PositionClose(_Symbol,100))
Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
else
{
Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");
sentRequest=true;
}
}
}
else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");
}
else
if(sentRequest) sentRequest=false;
Todos têm uma compreensão diferente do código certo. Por isso, é preciso escrever o código "correcto" no final. E como outra dica - tente ver se este código funciona na chave certa (uso esquemático da bandeira sendRequest):
O resultado é o seguinte: o código fecha devidamente uma posição longa e não abre uma posição curta... Ao reabrir uma posição longa, a EA não a fecha de acordo com a condição. Há mensagens na janela EA a toda a hora:
Como posso utilizar este código no organismo do Expert Advisor, se ele só funciona uma vez)?
oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения: Как же использовать этот код в теле эксперта, если он работает только 1 раз)?
Deve ser bastante simples nesta matéria. No código esquemático a bandeira sendRequest deve ser colocada a zero se a posição aberta não for uma posição de compra (última linha de código). Veja porque é que esta bandeira não é colocada a zero no seu código quando ou não há posição aberta ou a posição aberta não é uma posição de Compra.
Viva! Funcionou)))) Removido if(sentRequest) sentRequest=false; E escrito antes do bloco if(PositionsTotal()==0) sentRequest=false; Muito obrigado a Yedelkin pela sua ajuda, BOA Sorte!
oldiol: Removido if(sentRequest) sentRequest=false; e escrito antes do bloco if(PositionsTotal()==0) sentRequest=false;
Então não houve verificação de posição no código principal? Depois acrescentaria que a posição para um determinado símbolo é seleccionada usando as funções PositionGetSymbol ou PositionSelect.
oldiol: Ao reabrir um longo, a EA já não fecha a posição por condição. Há mensagens na janela EA o tempo todo: Como posso usar este código no corpo da EA, se funciona apenas 1 vez)? Desculpe, erro meu... Há mais uma condição no código
A posição é invertida porque o programa envia dois pedidos idênticos para o servidor. O programa envia dois pedidos idênticos para o servidor porque o seu código não verifica um pedido enviado anteriormente (e não verifica o resultado do processamento deste pedido no servidor).
Yedelkin escreve: o seu código não verifica um pedido previamente enviado. Pode dizer-me qual é a função que verifica?
Todos têm uma compreensão diferente do código certo. Por isso, é preciso escrever o código "correcto" no final. E como outra dica - tente ver se este código funciona correctamente (uso esquemático da bandeira sendRequest):
Todos têm uma compreensão diferente do código certo. Por isso, é preciso escrever o código "correcto" no final. E como outra dica - tente ver se este código funciona na chave certa (uso esquemático da bandeira sendRequest):
Muito obrigado! A experimentar...
O resultado é o seguinte: o código fecha devidamente uma posição longa e não abre uma posição curta... Ao reabrir uma posição longa, a EA não a fecha de acordo com a condição. Há mensagens na janela EA a toda a hora:
Como posso utilizar este código no organismo do Expert Advisor, se ele só funciona uma vez)?
oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения: Как же использовать этот код в теле эксперта, если он работает только 1 раз)?
Deve ser bastante simples nesta matéria. No código esquemático a bandeira sendRequest deve ser colocada a zero se a posição aberta não for uma posição de compra (última linha de código). Veja porque é que esta bandeira não é colocada a zero no seu código quando ou não há posição aberta ou a posição aberta não é uma posição de Compra.
Viva! Funcionou)))) Removido if(sentRequest) sentRequest=false; E escrito antes do bloco if(PositionsTotal()==0) sentRequest=false; Muito obrigado a Yedelkin pela sua ajuda, BOA Sorte!
oldiol : Ao reabrir um longo, a EA já não fecha a posição por condição. Há mensagens na janela EA o tempo todo: Como posso usar este código no corpo da EA, se funciona apenas 1 vez)? Desculpe, erro meu... Há mais uma condição no código
if(PositionSelect(_Symbol)===true) // existe uma posição aberta
{
POSIÇÃO FECHAR BLOCO
} // ... portanto
if(sentRequest) sentRequest=false;// colocou-o atrás do parêntese seguinte e tudo funciona perfeitamente. Yedelkin OBRIGADO!