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

 
Vladimir Zubov:

Não sei, normalmente não fecho o navegador até chegar à fase de "pronto a verificar". Tente procurar no seu separador "os meus produtos", o rascunho está normalmente lá, se não estiver lá, talvez precise de começar do início. Se o nome do produto que queria publicar não foi tirado, provavelmente ainda não guardou o rascunho.

Obrigado! Encontrei-a!
 
Saudações a todos, caros colegas!
Uma vez fiz uma pergunta sobre a possibilidade de salvar uma série de objectos de classe num ficheiro, e obtive uma resposta afirmativa da comunidade. Finalmente, tive a oportunidade de verificar tudo. E sim, de facto que isso poupa. E depois até lê AQUELE. De qualquer modo, tanto FileWriteArray como FileReadArray devolvem valores correctos pelo número de artigos escritos e lidos. Contudo, ao tentar aceder ao primeiro elemento da matriz através de um método de classe, o testador gera o erro de acesso ao ponteiro inválido seguido do erro crítico OnTick e termina. Note, no entanto, que se estiver a trabalhar não com uma matriz escrita e depois lida, mas apenas com algo que é criado na memória, tudo funciona. Qual poderá ser o problema? Qual é a forma correcta de restaurar um conjunto de objectos guardados?
 
BlackTomcat:
Saudações a todos, caros colegas!
Uma vez fiz uma pergunta sobre a possibilidade de salvar uma série de objectos de classe num ficheiro, e obtive uma resposta afirmativa da comunidade. Finalmente, tive a oportunidade de verificar tudo. E sim, de facto que isso poupa. E depois até lê AQUELE. De qualquer modo, tanto FileWriteArray como FileReadArray devolvem valores correctos pelo número de artigos escritos e lidos. Contudo, ao tentar aceder ao primeiro elemento da matriz através de um método de classe, o testador gera o erro de acesso ao ponteiro inválido seguido do erro crítico OnTick e termina. Note, no entanto, que se estiver a trabalhar não com uma matriz escrita e depois lida, mas apenas com algo que é criado na memória, tudo funciona. Qual poderá ser o problema? Como restaurar correctamente um conjunto de objectos guardados?
Por favor, envie-me o código!
 
Olá! conheço muito bem o MT4, mas o MT5 é um principiante. Por favor, informe qual a ordem para fechar uma ordem! Não a encontrei na lista de tipos de operação aqui https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions. ApenasCLOSE_BY e só preciso de a fechar.
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexander Kharlamov:
Olá, conheço muito bem o MT4, mas o MT5 é um novato. Por favor informe qual o comando para fechar a ordem! Não encontrei nenhum comando na lista de tipos de operação aqui https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions. O único comando que tenho éCLOSE_BY, só preciso de fechar a ordem.

em mt5 não é assim tão simples

fechar meios para abrir um comércio oposto com o mesmo lote

ou seja, operaçãoTRADE_ACTION_DEAL

 
Vladislav Andruschenko:

em mt5 não é assim tão simples

fechar meios para abrir um comércio oposto com o mesmo lote

ou seja, operaçãoTRADE_ACTION_DEAL

Obrigado pela sua resposta, mas ainda não estou muito claro... Abri um comércio oposto e depois preciso de fazer umTRADE_ACTION_CLOSE_BY entre eles?
 
Alexander Kharlamov:
Obrigado pela resposta, mas ainda não a compreendo bem. Abro uma posição oposta e depoisTRADE_ACTION_CLOSE_BY entre eles?

Em MT5 existe o conceito de uma POSIÇÃO. Pode fechar uma posição. Se quiser fechar completamente uma posição, utilize a biblioteca padrão. Para uma conta netting, um exemplo de encerramento de uma posição:

//+------------------------------------------------------------------+
//|                                                 PositionClos.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- подключение стандартной библиотеки
#include <Trade\Trade.mqh>
//--- объект класса CTrade
CTrade trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- закрытие позицию по текущему символу
   trade.PositionClose(Symbol());
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Karputov Vladimir:

Em MT5 existe um conceito de POSIÇÃO. Pode fechar uma posição. Se quiser fechar completamente uma posição, utilize a biblioteca padrão. Para uma conta netting, um exemplo de como fechar uma posição:

Acho que estou a começar a perceber! ) A posição mudará com cada execução de ordem para esse instrumento, à direita. A questão agora é"O identificador de posição é um número único que é atribuído a cada posição recentemente aberta e não muda ao longo da sua vida. Corresponde ao bilhete da ordem com que a posição foi aberta".

E se as encomendas subsequentes alterarem a posição, o seu número permanece igual ao da primeira encomenda que a criou?
 
Alexander Kharlamov:

1. Acho que estou a começar a compreender! ) A posição mudará com cada execução de ordem para este símbolo, certo?
2. Oidentificador da posição é um número único, que é atribuído a cada posição recentemente aberta e não muda ao longo da sua vida útil. Corresponde ao bilhete da ordem com que a posição foi aberta".

E se as encomendas subsequentes alterarem a posição, o seu número permanece igual ao da primeira encomenda que a criou?

1. Sim, é isso mesmo. A execução de uma ordem gera uma transacção. Uma transacção pode:

  • criar uma posição
  • alterar o tamanho de uma posição
  • fechar uma posição
2. O que poderia ser melhor do que a prática? :) Abrir uma posição (manualmente) em qualquer gráfico. Executar o guião

//+------------------------------------------------------------------+
//|                                           PositionGetInteger.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int i=0;i<PositionsTotal();i++)
     {
      //--- проверим наличие позиции и выведем время её изменения 
      string pos_symbol=PositionGetSymbol((uint)i);
      if(pos_symbol!=NULL)
        {
         //--- получим идентификатор позиции для дальнейшей работы с ней 
         ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
         Print(pos_symbol," postion #",position_ID);
         //--- получим время образования позиции в миллисекундах с 01.01.1970 
         long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
         PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                     create_time_msc,TimeToString(create_time_msc/1000));
         //--- получим время последнего изменения позиции в секундах с 01.01.1970 
         long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
         PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                     position_ID,update_time_sec,TimeToString(update_time_sec));
         //--- получим время последнего изменения позиции в миллисекундах с 01.01.1970 
         long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
         PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                     position_ID,update_time_msc,TimeToString(update_time_msc/1000));
        }
     }
//--- 
  }
//+------------------------------------------------------------------+

- Olhe para a linha (veja o separador "Peritos" do terminal):

2016.08.29 14:51:24.435 PositionGetInteger (EURUSD,M1)  EURUSD postion #95873997

Aumentar o volume, executar novamente o guião - comparar novamente a linha

2016.08.29 14:51:32.872 PositionGetInteger (EURUSD,M1)  EURUSD postion #95873997

Como pode ver, a propriedade da posição (POSITION_IDENTIFIER) não muda se a posição não for invertida.

Arquivos anexados:
 
POSIITION_IDENTIFIER muda quando a posição é invertida.
Razão: