Erros, bugs, perguntas - página 480

 
papaklass:
Agora actualizado e a tentar descobrir de novo. Coloquei impressões em quase todas as linhas. Comunicarei os resultados.

Aqui está a corrida com o seu inserto, no momento em que a paragem da perda foi reparada:

2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 Long position by EURUSD to be closed of stop-loss
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27
Deal #63 sl 1.33328 2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27 oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 CSampleExpert::Trade
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 encomenda realizada venda 0.15 a 1.33328 [#63 venda 0.15 EURUSD a 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 negócio realizado [#63 vender 0.15 EURUSD a 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 negócio #63 vender 0.15 EURUSD a 1.33328 feito (com base na encomenda #63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 stop loss triggered buy 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 sell 0.15 EURUSD a 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 Long position by EURUSD to be modified trailing
 
Obviamente o resultado diferente é um processamento diferente na OnTrade, só estou à procura de negócios, só eles me interessam, você por outro lado compreendo que está a processar todos os eventos classificando-os e há algo de errado algures por aqui.
 
Presumo que o mercado de apostas de futuros seja também uma demonstração? Tirado um verdadeiro do MMVB, os lotes não correspondem.
 
papaklass:

Faço encomendas pendentes com uma hora de duração de 1 hora. Após uma hora, as ordens que não foram activadas são encerradas pelo tempo de expiração da ordem. Se várias ordens são fechadas simultaneamente, e antes de fechar, a função HistoryOrdersTotal() tinha um valor diferente de zero, então perde algumas ordens. Por exemplo, antes do fecho de 8 ordens, a função tinha um valor de 4, mas após o fecho, tem um valor de 10. Duas ordens são perdidas.


O que quer dizer com "as ordens foram perdidas"? Deve ter-se em conta que as mensagens que chegam à OnTrade() podem conter informações sobre mais do que um evento comercial. Além disso, se forem enviadas várias mensagens simultaneamente, ao processar a primeira mensagem, a cache histórica pode já ter mudado, e pode ter uma sensação de "eventos perdidos".

Por favor leia o artigo Eventos comerciais no MetaTrader 5:

Conclusão

Todas as operações na plataforma de negociação MetaTrader 5 são assíncronas, e o envio de mensagens sobre todas as alterações na conta de negociação é feito independentemente umas das outras, por isso não tente rastrear um único evento de acordo com a regra "Um pedido - Um evento de negociação". Se quiser determinar exactamente o que mudou após o evento de Comércio, precisa de analisar todos os negócios, posições e ordens em cada chamada do manipulador OnTrade e compará-los com o estado que existia antes do evento aparecer.
 
papaklass:
Eu pedi especificamente o valor HistoryOrdersTotal(), que era igual a 4, antes de fechar as encomendas. Após fechar 8 encomendas, o valor de HistoryOrdersTotal() deveria ter sido igual a 12 (4 + 8), mas foi igual a 10. Anexei um ficheiro de registo, podemos ver situações semelhantes nele mais do que uma vez. Anexei também o Consultor Especialista, com o qual é obtido. Faça-o você mesmo e verá tudo.

Tente mudar a função, o que vai acontecer?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
O relatório HTML do teste nem sempre é guardado num ficheiro?!
 
zigan:
O relatório HTML da execução do teste nem sempre é guardado num ficheiro!

Descrever mais precisamente. Em que circunstâncias.

 
alexvd:

Descrever mais precisamente. Em que circunstâncias.

Raramente, cerca de um em 20-30 testes - abra o separador "Resultados

clique em guardar relatório XML - eu recebo o ficheiro de relatório, está tudo bem!

clique em guardar relatório HTML - aparece uma janela para guardar ficheiro, fica pendurada com a barra de progresso vazia durante algum tempo (brevemente), depois a barra de progresso preenche-se rapidamente e a janela fecha-se... Mas nenhum ficheiro de relatório é criado!

Não posso especificar um padrão para quando exactamente isto acontece.

 
Rosh:

Tente mudar a função, o que vai acontecer?

Não creio que isto possa ajudar. OnTrade, por uma questão de princípio, não pode funcionar da mesma forma que o papaklass.

A chave é"precisa de analisar todas as transacções, posições e ordens em cada chamada para o manipulador OnTrade e compará-la com o estado em que se encontrava antes de aparecer" . No exemplo em com encomendas pendentes, isto só se aplica a encomendas na história. Para evitar perder ordens, eu alteraria o código desta forma:

Introduzir uma variável global na OldHistoryOrders; e no Ontrade, algo como isto:

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
Arquivos anexados:
 
papaklass:

Não é assim que eu trabalho com a OnTrade() como descreveu. No meu código anexado, removi tudo, deixando apenas a parte que destaca o bug da função. Praticamente não tenho loops no meu EA. A EA manipula um único símbolo num único tick. Por conseguinte, não preciso de ciclos. Processo todos os símbolos em 12 ticks.

PS: OnTrade() informa-me sobre um evento comercial. E que evento ocorreu é definido pelas minhas funções sem loops.

Bem, está bem, estava apenas a referir-me ao vosso exemplo que prova, supostamente, a perda de encomendas pela função OnTrade. OnTrade funciona de forma assíncrona, não por carrapatos, por isso não se importa quantos símbolos se processam num carrapato. Tem um monte de encomendas vazias que expiram de uma só vez, por isso não pode passar sem o trabalho. Alterei o vosso código para mostrar que a OnTrade não perde nada. Cheguei mesmo a correr no testador e tudo parece estar no seu devido lugar. Os tickers de todas asencomendas eliminadas impressas pela impressora da OnTrade estão presentes no registo. Já experimentou a minha versão?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5