Esta função mostra o resultado errado, ou melhor, o resultado errado. Investiguei e descobri que a identificação da posição não muda no retorno (isto é, durante uma troca de entrada/saída), como descrito na documentação:
Uma inversão de posição muda sua identificação para o bilhete de pedido que resultou na inversão.
Seu GetPositionPrice pode empilhar 2 ou mais posições opostas se houver uma inversão, e calcula um preço médio para elas. Tal preço médio de uma posição não tem utilidade prática.
Então, a identificação da posição muda ou não na inversão?
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
igorbel: Como você pode dizer a partir de um comércio de entrada/saída qual volume fechou uma posição anterior e qual abriu uma nova posição?
Você pode compará-lo com o atual aberto. Mas é melhor examinar a história da posição por seu id, que não muda quando se vira a posição... Comprar/vender volumes para ajudar.
Dennis Kirichenko: Pode ser comparado com a atual posição aberta. Mas é melhor examinar a história da posição por seu id, que não muda quando a posição é revertida... Comprar/vender volumes para ajudar.
A partir de recentemente, as MUDANÇAS de ID de posição quando você se vira. A documentação sobre isso já foi atualizada....
POSITION_IDENTIFIER
O ID da posição é um número único, que é atribuído a cada posição recém-aberta e não muda ao longo de sua vida útil. Corresponde ao bilhete do pedido com o qual a posição foi aberta.
O identificador de posição é especificado em cada ordem (ORDER_POSITION_ID) e cada comércio (DEAL_POSITION_ID) que o abriu, alterou ou fechou. Use esta propriedade para procurar ordens e negócios relacionados com a posição.
A inversão de uma posição muda seu identificador para o bilhete de pedido, o que resultou na inversão.
Dennis Kirichenko: Você poderia compará-lo com o atual aberto. Mas é melhor examinar a história da posição pelo id, que não muda durante uma inversão... Comprar/vender volumes para ajudar.
Esta não é uma opção de forma alguma. A posição anterior também poderia estar aberta devido à inversão, etc. Poderia ser uma opção, mas claramente não uma opção ótima.
A partir de recentemente, as MUDANÇAS de ID de posição quando você se vira. A documentação sobre isso já foi atualizada....
POSITION_IDENTIFIER
O ID da posição é um número único, que é atribuído a cada posição recém-aberta e não muda ao longo de sua vida útil. Corresponde ao bilhete do pedido com o qual a posição foi aberta.
O identificador de posição é especificado em cada ordem (ORDER_POSITION_ID) e cada comércio (DEAL_POSITION_ID) que o abriu, alterou ou fechou. Use esta propriedade para procurar ordens e negócios relacionados com a posição.
A inversão de uma posição muda seu identificador para o bilhete de pedido, o que resultou na inversão.
longo
Está escrito assim, mas na realidade nada muda.
Meu código, se você quiser:
long pos_id1,pos_id2,pos_id3;
ulong deal1_ticket=xxx;
ulong deal2_ticket=xxx;
ulong deal3_ticket=xxx;
if(!HistoryDealSelect(deal1_ticket))
Print(__FUNCTION__+": deal 1 not selected. Error=",GetLastError());
pos_id1=HistoryDealGetInteger(deal1_ticket,DEAL_POSITION_ID);
Print(__FUNCTION__+": ticket=",deal1_ticket,", position ID=",pos_id1);
if(!HistoryDealSelect(deal2_ticket))
Print(__FUNCTION__+": deal 2 not selected. Error=",GetLastError());
pos_id2=HistoryDealGetInteger(deal2_ticket,DEAL_POSITION_ID);
Print(__FUNCTION__+": ticket=",deal2_ticket,", position ID=",pos_id2);
if(!HistoryDealSelect(deal3_ticket))
Print(__FUNCTION__+": deal 3 not selected. Error=",GetLastError());
pos_id3=HistoryDealGetInteger(deal3_ticket,DEAL_POSITION_ID);
Print(__FUNCTION__+": ticket=",deal3_ticket,", position ID=",pos_id3);
Onde deal2_ticket é o in/out transaction ticket, deal1_ticket é o ticket que precede a transação in/out, deal3_ticket é o ticket após a transação in/out. Em todos os três casos recebo a mesma identificação de posição.
Onde deal2_ticket é o in/out transaction ticket, deal1_ticket é o ticket que precede a transação in/out, deal3_ticket é o ticket após a transação in/out. Em todos os três casos recebo a mesma identificação de posição.
O meu está mudando. Experimente a construção mais recente 1340.
igorbel: E como podemos determinar a partir de um comércio in/out que volume fechou a posição anterior e que abriu a nova?
Este Expert Advisor é executado no modo "Debugging on History" em uma conta netting. O exemplo é um pouco rude, pois calcula-se que há apenas um negócio do tipo "IN/OUT" na história do negócio.
A princípio, depois de todos os negócios executados e do fechamento completo de uma posição, as descrições de todos os negócios são mostradas(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE), nesse DEAL_POSITION_ID para um negócio do tipo IN/OUT é memorizado.
Em seguida, ele percorre novamente a história e soma todas as entradas para o comércio com DEAL_POSITION_ID.
Obtemos algo como isto:
10:58:23.963 Test (EURUSD,H1) 2016.01.0400:06:42 CTrade::OrderSend: instant buy 0.04 EURUSD at 1.08732 [done at 1.08732]
10:58:30.692 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID0, DEAL_VOLUME0.00, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BALANCE10:58:30.784 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.02, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BUY10:58:32.074 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.01, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BUY10:58:33.826 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.07, DEAL_ENTRYDEAL_ENTRY_INOUT, DEAL_TYPEDEAL_TYPE_SELL10:58:37.237 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID4, DEAL_VOLUME0.04, DEAL_ENTRYDEAL_ENTRY_OUT, DEAL_TYPEDEAL_TYPE_BUY10:59:07.397 Test (EURUSD,H1) 2016.01.0400:07:19DEAL_POSITION_ID2: volume in 0.03, volume out 0.07
Funções úteis e freqüentemente utilizadas:
Função GetPositionPrice() redesenhada:
Esta função mostra o resultado errado, ou melhor, o resultado errado. Investiguei e descobri que a identificação da posição não muda no retorno (isto é, durante uma troca de entrada/saída), como descrito na documentação:
https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties
Uma inversão de posição muda sua identificação para o bilhete de pedido que resultou na inversão.
Seu GetPositionPrice pode empilhar 2 ou mais posições opostas se houver uma inversão, e calcula um preço médio para elas. Tal preço médio de uma posição não tem utilidade prática.
Então, a identificação da posição muda ou não na inversão?
Como você pode dizer a partir de um comércio de entrada/saída qual volume fechou uma posição anterior e qual abriu uma nova posição?
Pode ser comparado com a atual posição aberta. Mas é melhor examinar a história da posição por seu id, que não muda quando a posição é revertida... Comprar/vender volumes para ajudar.
A partir de recentemente, as MUDANÇAS de ID de posição quando você se vira. A documentação sobre isso já foi atualizada....
POSITION_IDENTIFIER
O ID da posição é um número único, que é atribuído a cada posição recém-aberta e não muda ao longo de sua vida útil. Corresponde ao bilhete do pedido com o qual a posição foi aberta.
O identificador de posição é especificado em cada ordem (ORDER_POSITION_ID) e cada comércio (DEAL_POSITION_ID) que o abriu, alterou ou fechou. Use esta propriedade para procurar ordens e negócios relacionados com a posição.
A inversão de uma posição muda seu identificador para o bilhete de pedido, o que resultou na inversão.
longo
Você poderia compará-lo com o atual aberto. Mas é melhor examinar a história da posição pelo id, que não muda durante uma inversão... Comprar/vender volumes para ajudar.
Esta não é uma opção de forma alguma. A posição anterior também poderia estar aberta devido à inversão, etc. Poderia ser uma opção, mas claramente não uma opção ótima.
A partir de recentemente, as MUDANÇAS de ID de posição quando você se vira. A documentação sobre isso já foi atualizada....
POSITION_IDENTIFIER
O ID da posição é um número único, que é atribuído a cada posição recém-aberta e não muda ao longo de sua vida útil. Corresponde ao bilhete do pedido com o qual a posição foi aberta.
O identificador de posição é especificado em cada ordem (ORDER_POSITION_ID) e cada comércio (DEAL_POSITION_ID) que o abriu, alterou ou fechou. Use esta propriedade para procurar ordens e negócios relacionados com a posição.
A inversão de uma posição muda seu identificador para o bilhete de pedido, o que resultou na inversão.
longo
Está escrito assim, mas na realidade nada muda.
Meu código, se você quiser:
Onde deal2_ticket é o in/out transaction ticket, deal1_ticket é o ticket que precede a transação in/out, deal3_ticket é o ticket após a transação in/out. Em todos os três casos recebo a mesma identificação de posição.
É o que diz, mas na realidade nada muda.
Se você quiser, meu código:
Onde deal2_ticket é o in/out transaction ticket, deal1_ticket é o ticket que precede a transação in/out, deal3_ticket é o ticket após a transação in/out. Em todos os três casos recebo a mesma identificação de posição.
E como podemos determinar a partir de um comércio in/out que volume fechou a posição anterior e que abriu a nova?
Este Expert Advisor é executado no modo "Debugging on History" em uma conta netting. O exemplo é um pouco rude, pois calcula-se que há apenas um negócio do tipo "IN/OUT" na história do negócio.
A princípio, depois de todos os negócios executados e do fechamento completo de uma posição, as descrições de todos os negócios são mostradas(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE), nesse DEAL_POSITION_ID para um negócio do tipo IN/OUT é memorizado.
Em seguida, ele percorre novamente a história e soma todas as entradas para o comércio com DEAL_POSITION_ID.
Obtemos algo como isto:
Está mudando para mim. Experimente o último build 1340.