Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 815

 
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.
 

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.

 
pivomoe:

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.

 
User_mt5:

...


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

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &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(const MqlTradeTransaction &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(const MqlTradeRequest &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(const MqlTradeResult &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.

 
Vladimir Karputov:

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?

 
Vladimir Karputov:

Absolutamente tudo é transparente na OnTradeTransaction.

Obrigado pela resposta, foi praticamente o que eu fiz. Mais perguntas do que insights até agora...

 
Vladimir Karputov:

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.

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
Arquivos anexados:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

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.

Responderei este fim-de-semana. Desculpe.

 

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