pivomoe: Só não consigo perceber se é normal que .
Há muitas coisas que são difíceis de entender aqui. Em particular, ao lidar com a sequência de transacções, descobri que existem algumas inconsistências em vários casos. Por exemplo, quando uma posição é aberta, uma ordem de mercado é formalmente aberta primeiro, que depois se transforma numa posição. No entanto, durante esta série de transacções com metralhadoras existe uma situação em que uma posição já foi aberta, mas a ordem ainda não foi fechada. É evidente que este é o mesmo evento, mas as transacções são organizadas de forma fragmentada, emitidas sequencialmente, e com esta abordagem é em princípio impossível reflectir correctamente a transformação de uma ordem de mercado numa posição.
Na minha opinião, é melhor organizar o vosso controlo comercial: lembrem-se das vossas ordens comerciais e monitorizem a composição das ordens e posições simplesmente pelo facto da sua presença nas listas relevantes.
Sabia que as ordens do mercado são emitidas nestas transacções a um preço zero? Por exemplo, uma pessoa quer abrir uma posição Buy em 1.2000, Sl=1.1000, Tr=1.3000. Quando esta transacção é executada, a primeira coisa que aparece é onde a ordem do mercado é listada com os seguintes dados: Sl= 1.1000, Tr= 1.3000, ou seja, com os números especificados e Price=0 (igual a zero). Apenas um tipo de ordem de mercado com preço zero :) E pense no que quiser.
Por conveniência. Uma pequena função é chamada da MqlTradeTransaction. O elemento requerido é aí encontrado através da procura de elementos da classe. E para este elemento, uma das funções da classe é chamada que faz algo de útil.
Por favor descreva com mais detalhes o que pretende obter exactamente? Por que razão se chama algo da OnTradeTransaction?
Primeiro apenas em palavras, depois vamos corrigi-lo na direcção certa.
User_mt5: A função Abc() do utilizador é executada, e implementa um longo (em termos de tempo) algoritmo. Durante a execução desta função, alguns eventos têm lugar, por exemplo - Comércio, Temporizador, etc. É possível saber que estes eventos ocorreram sem terminar a execução da função Abc()?
Não. Enquanto uma função estiver a contar, tudo o resto será ignorado.
É semelhante àfunçãoSleep()- ou seja, enquanto a sua função estiver a contar durante muito tempo, o seu comportamento é semelhante ao do sono - todos os outros eventos serão ignorados.
Segundo: Para visualizar os resultados, podemos extrair este bloco de código do exemploOrderSendAsync
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ voidOnTradeTransaction(constMqlTradeTransaction &trans,
constMqlTradeRequest &request,
constMqlTradeResult &result)
{
//--- получим тип транзакции в виде значения перечисления ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type;
//--- если транзакция является результатом обработки запроса, выведем только её название if(type==TRADE_TRANSACTION_REQUEST)
{
Print(EnumToString(type));
//--- выведем строковое описание обработанного запроса Print("------------RequestDescription\r\n",RequestDescription(request));
//--- выведем описание результата запроса Print("------------ResultDescription\r\n",TradeResultDescription(result));
//--- запомним тикет ордера для его удаления на следующей обработке в OnTick() if(result.order!=0)
{
//--- удалим этот ордер по его тикету при следующем вызове OnTick()
order_ticket=result.order;
Print(" Тикет отложенного ордера ",order_ticket,"\r\n");
}
}
else// для транзакций другого типа выведем полное описание //--- выведем описание полученной транзакции в Журнал Print("------------TransactionDescription\r\n",TransactionDescription(trans));
//---
}
//+------------------------------------------------------------------+ //| Возвращает текстовое описание транзакции | //+------------------------------------------------------------------+ string TransactionDescription(constMqlTradeTransaction &trans)
{
//--- string desc=EnumToString(trans.type)+"\r\n";
desc+="Symbol: "+trans.symbol+"\r\n";
desc+="Deal ticket: "+(string)trans.deal+"\r\n";
desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n";
desc+="Order ticket: "+(string)trans.order+"\r\n";
desc+="Order type: "+EnumToString(trans.order_type)+"\r\n";
desc+="Order state: "+EnumToString(trans.order_state)+"\r\n";
desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n";
desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n";
desc+="Price: "+StringFormat("%G",trans.price)+"\r\n";
desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n";
desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n";
desc+="Position: "+(string)trans.position+"\r\n";
desc+="Position by: "+(string)trans.position_by+"\r\n";
//--- вернем полученную строку return desc;
}
//+------------------------------------------------------------------+ //| Возвращает текстовое описание торгового запроса | //+------------------------------------------------------------------+ string RequestDescription(constMqlTradeRequest &request)
{
//--- string desc=EnumToString(request.action)+"\r\n";
desc+="Symbol: "+request.symbol+"\r\n";
desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n";
desc+="Order ticket: "+(string)request.order+"\r\n";
desc+="Order type: "+EnumToString(request.type)+"\r\n";
desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n";
desc+="Order time type: "+EnumToString(request.type_time)+"\r\n";
desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n";
desc+="Price: "+StringFormat("%G",request.price)+"\r\n";
desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n";
desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n";
desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n";
desc+="Comment: "+request.comment+"\r\n";
//--- вернем полученную строку return desc;
}
//+------------------------------------------------------------------+ //| Возвращает текстовое описание результата обработки запроса | //+------------------------------------------------------------------+ string TradeResultDescription(constMqlTradeResult &result)
{
//--- string desc="Retcode "+(string)result.retcode+"\r\n";
desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n";
desc+="Order ticket: "+(string)result.order+"\r\n";
desc+="Deal ticket: "+(string)result.deal+"\r\n";
desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n";
desc+="Price: "+StringFormat("%G",result.price)+"\r\n";
desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n";
desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n";
desc+="Comment: "+result.comment+"\r\n";
//--- вернем полученную строку return desc;
}
e colá-lo num Expert Advisor que pode ser anexado a um gráfico. Depois pode abrir/fechar posições manualmente e ver a impressão dos resultados no separador Especialistas.
Não. Enquanto uma função estiver a contar, tudo o resto será ignorado.
É análoga àfunçãoSleep()- ou seja, enquanto a sua função está a contar durante muito tempo, o seu comportamento é anflógico ao Sleep - todos os eventos restantes serão ignorados.
Obrigado, isso é lamentável. E como utilizar o recurso do PC de forma eficaz nessa altura? Novamente código em loop e sondagem periódica de parâmetros?
Por favor descreva com mais detalhes o que pretende obter exactamente? Porque está a chamar algo da OnTradeTransaction?
Primeiro apenas em palavras, depois vamos corrigi-lo na direcção certa.
Compreendi que o problema não é com a OnTradeTransaction. Vejam a confusão que tenho aqui:
Aqui está o código.
CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
if( !PositionInfoVedygii.Select("SBRF-12.17") )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());
E aqui está o resultado da sua execução
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17 2017.09.22 10:30:12 Volume 0,0 Volume 0,0
Eu troco as linhas 2 e 3. ou seja, o código é agora
CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
if( !PositionInfoVedygii.Select("SBRF-12.17") )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());
Obtenho um resultado como este.
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17 2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0
Em ambos os casos, não são gerados avisos pelo compilador. Em anexo encontra-se o código Expert Advisor de 80 linhas e definições de teste. Corretor BCS. A versão 1730.
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
Percebi que o problema não é com a OnTradeTransaction. Vejam só a confusão que tenho:
Aqui está o código.
E aqui está o resultado da sua execução
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17 2017.09.22 10:30:12 Volume 0,0 Volume 0,0
Eu troco as linhas 2 e 3. ou seja, o código é agora
Obtenho um resultado como este.
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17 2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0
Em ambos os casos, não são gerados avisos pelo compilador. Em anexo encontra-se o código Expert Advisor de 80 linhas e definições de teste. Corretor BCS. A versão 1730.
Só não consigo perceber se é normal que .
Há muitas coisas que são difíceis de entender aqui. Em particular, ao lidar com a sequência de transacções, descobri que existem algumas inconsistências em vários casos.
Na minha opinião, é melhor organizar o vosso controlo comercial: lembrem-se das vossas ordens comerciais e monitorizem a composição das ordens e posições simplesmente pelo facto da sua presença nas listas relevantes.Por exemplo, quando uma posição é aberta, uma ordem de mercado é formalmente aberta primeiro, que depois se transforma numa posição. No entanto, durante esta série de transacções com metralhadoras existe uma situação em que uma posição já foi aberta, mas a ordem ainda não foi fechada. É evidente que este é o mesmo evento, mas as transacções são organizadas de forma fragmentada, emitidas sequencialmente, e com esta abordagem é em princípio impossível reflectir correctamente a transformação de uma ordem de mercado numa posição.
Por falar em aves.
Sabia que as ordens do mercado são emitidas nestas transacções a um preço zero?
Por exemplo, uma pessoa quer abrir uma posição Buy em 1.2000, Sl=1.1000, Tr=1.3000.
Quando esta transacção é executada, a primeira coisa que aparece é onde a ordem do mercado é listada com os seguintes dados:
Sl= 1.1000, Tr= 1.3000, ou seja, com os números especificados e Price=0 (igual a zero). Apenas um tipo de ordem de mercado com preço zero :) E pense no que quiser.
Por conveniência. Uma pequena função é chamada da MqlTradeTransaction. O elemento requerido é aí encontrado através da procura de elementos da classe. E para este elemento, uma das funções da classe é chamada que faz algo de útil.
Por favor descreva com mais detalhes o que pretende obter exactamente? Por que razão se chama algo da OnTradeTransaction?
Primeiro apenas em palavras, depois vamos corrigi-lo na direcção certa.
A função Abc() do utilizador é executada, e implementa um longo (em termos de tempo) algoritmo.
Durante a execução desta função, alguns eventos têm lugar, por exemplo - Comércio, Temporizador, etc.
É possível saber que estes eventos ocorreram sem terminar a execução da função Abc()?
Não. Enquanto uma função estiver a contar, tudo o resto será ignorado.
É semelhante àfunçãoSleep()- ou seja, enquanto a sua função estiver a contar durante muito tempo, o seu comportamento é semelhante ao do sono - todos os outros eventos serão ignorados.
...
Absolutamente tudo é transparente na OnTradeTransaction.
Primeiro: aestrutura da MqlTradeTransaction é preenchida de forma diferente dependendo do tipo de transacção comercial (ENUM_TRADE_TRANSACTION_TYPE).
leia aqui:Estrutura de uma transacção comercial (MqlTradeTransaction)
Segundo: Para visualizar os resultados, podemos extrair este bloco de código do exemploOrderSendAsync
e colá-lo num Expert Advisor que pode ser anexado a um gráfico. Depois pode abrir/fechar posições manualmente e ver a impressão dos resultados no separador Especialistas.
Não. Enquanto uma função estiver a contar, tudo o resto será ignorado.
É análoga àfunçãoSleep()- ou seja, enquanto a sua função está a contar durante muito tempo, o seu comportamento é anflógico ao Sleep - todos os eventos restantes serão ignorados.
Obrigado, isso é lamentável.
E como utilizar o recurso do PC de forma eficaz nessa altura? Novamente código em loop e sondagem periódica de parâmetros?
Absolutamente tudo é transparente na OnTradeTransaction.
Obrigado pela resposta, foi praticamente o que eu fiz. Mais perguntas do que insights até agora...
Por favor descreva com mais detalhes o que pretende obter exactamente? Porque está a chamar algo da OnTradeTransaction?
Primeiro apenas em palavras, depois vamos corrigi-lo na direcção certa.
Compreendi que o problema não é com a OnTradeTransaction. Vejam a confusão que tenho aqui:
Aqui está o código.
E aqui está o resultado da sua execução
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17
2017.09.22 10:30:12 Volume 0,0 Volume 0,0
Eu troco as linhas 2 e 3. ou seja, o código é agora
Obtenho um resultado como este.
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0
Em ambos os casos, não são gerados avisos pelo compilador. Em anexo encontra-se o código Expert Advisor de 80 linhas e definições de teste. Corretor BCS. A versão 1730.
Percebi que o problema não é com a OnTradeTransaction. Vejam só a confusão que tenho:
Aqui está o código.
E aqui está o resultado da sua execução
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17
2017.09.22 10:30:12 Volume 0,0 Volume 0,0
Eu troco as linhas 2 e 3. ou seja, o código é agora
Obtenho um resultado como este.
2017.09.22 10:30:12 Falha na selecção de posição por símbolo SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0
Em ambos os casos, não são gerados avisos pelo compilador. Em anexo encontra-se o código Expert Advisor de 80 linhas e definições de teste. Corretor BCS. A versão 1730.
O erro parece estar em tentar obter informações sobre mais de 1 posição, em 1 linha(Imprimir).
Apenas informação sobre 1 (seleccionado ) posição está disponível em qualquer altura :
- No segundo caso está correcto, porque o último Select retorna verdadeiro , o qual não verificou.
- E no primeiro caso : o último Select retorna falso , o que também não verificou, e o resultado é imprevisível.
..... obviamente Select===false repõe a informação do Select===verdadeiro