Como você calcula a margem?

 

Boa tarde!

De repente, deparou-se com uma situação em que a margem sobre as posições abertas aumentou significativamente (20 vezes). Há uma suspeita de que o corretor tenha aumentado as exigências de margem para as posições em aberto. Esta suposição é confirmada pelo valor anormalmente alto da AccountMargin, que é várias vezes superior ao valor calculado para este instrumento e a alavancagem definida.

Em uma das contas em tal situação, tive que fechar as últimas posições abertas com o maior volume com uma perda para reduzir a carga no depósito e não permitir o Stop Out. E em algum momento (depois de fechar outra posição perdida) o valorda AccountMargin retornou ao nível calculado. Talvez eu não tenha notado isso de imediato e, portanto, não posso dizer com certeza para quais posições foram aplicados os requisitos de margem aumentada.

Ainda não fiz nada sobre a outra conta, exceto abrir uma ordem de fechamento. Agora preciso fazer uma reclamação ao corretor declarando quais pedidos foram abertos com maiores exigências de margem. E isto levanta uma questão:

Há alguma maneira de descobrir o valor da garantia (margem) para cada posição aberta separadamente no terminal? No terminal eu só vejo o valor total da margem, o mesmo valor é devolvido pela AccountMargin(). Na Referência MQL4 não encontrei uma função adequada com o prefixo Order. Seria lógico assumir que este valor pode ser obtido usando OrderGetDouble(), mas novamente, não há nenhum valor apropriado emENUM_ORDER_PROPERTY_DOUBLE.

Por favor, me diga como posso realmente obter o tamanho do depósito para uma única posição aberta no terminal MT4?

 
Você pode lê-loaqui.
Как получить программно "Процент маржи"
Как получить программно "Процент маржи"
  • 2017.05.31
  • www.mql5.com
В окне терминала "Спецификации контракта" есть пункт "Процент маржи...
 
Alexey Viktorov:
Você pode ler aqui.

Obrigado, eu o li. Há um roteiro na página 7 para calcular o valor da margem calculada para cada posição aberta. Eu o ajustei um pouco, levando em conta o fato de que não é CFD, mas FOREX, e o compilei nesta forma:

void OnStart()
{
 double size = 0, percentage = 0, orderMargin = 0, accountMargin = 0;
 long leverage = 0;
 for(int i = 0; i < OrdersTotal(); i++)
  {
   int tupe = -1;
   if(OrderSelect(i, SELECT_BY_POS) && (tupe=OrderType()) < OP_BUYLIMIT)
    {
     string symbol = OrderSymbol();
     string symbolCurencyMargin = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
     double orderOpenPrice = OrderOpenPrice();
     double orderLots = OrderLots();
     double margin = MarketInfo(symbol, MODE_MARGINREQUIRED);
     double ask = MarketInfo(symbol, MODE_ASK);
     double bid = MarketInfo(symbol, MODE_BID);
     double price = symbolCurencyMargin == "USD" ? 1 : tupe == OP_BUY ? bid : ask;
      size = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
      leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
      percentage = NormalizeDouble(margin/(size*price/100)*leverage, 0);
      //orderMargin = (size*orderOpenPrice*percentage/100)/leverage;
      orderMargin = (orderLots*size*orderOpenPrice)/leverage;
      accountMargin += orderMargin;
      Print(symbolCurencyMargin, " ******** Маржа ", symbol, " = ", orderMargin);
    }
  }
 Print(AccountInfoString(ACCOUNT_CURRENCY), " ******** AccountMargin = ", DoubleToString(accountMargin, 2));
}

Na grande maioria dos casos, o valor da margem final calculada por este roteiro coincide com a margem real. Mas, infelizmente, não no meu caso. O problema é que a fórmula para calcular a margem para cada pedido utiliza o valor de alavancagem ativa naquele momento.

Mas nos regulamentos de alguns corretores (sem apontar dedos) é especificado que para posições que são abertas sob certas condições (sexta-feira à noite, método de média, etc.) a alavancagem é especificada, e normalmente é várias vezes menor do que para a conta inteira. Esse é exatamente o meu caso. Entretanto, a fim de preparar corretamente uma reclamação e evitar repetir tal situação no futuro, preciso descobrir quais posições foram abertas com alavancagem normal e quais foram abertas com maior alavancagem.

A equipe de suporte do corretor diz abertamente que o aumento da alavancagem não é definido para a conta como um todo, mas para ordens específicas e isto acontece depois que a posição foi aberta. Assim, é inútil utilizar o pedido de AccountFreeMarginChek.

Isto realmente causa uma pergunta: existe alguma maneira de saber com segurança, qual margem é realmente utilizada para cada posição no terminal, se soubermos que o corretor pode definir uma alavancagem diferente para cada posição?

 
Janis Ozols:

Mas nos regulamentos de alguns corretores (não apontemos os dedos) é prescrito que para posições abertas sob certas condições (sexta-feira à noite, método de média, etc.) há uma alavancagem especial, geralmente várias vezes menor do que para toda a conta. Esse é exatamente o meu caso. Mas para fazer uma reclamação adequada e evitar uma repetição desta situação no futuro, preciso entender quais posições foram abertas com alavancagem normal, e quais foram abertas com maior alavancagem.

1) O corretor está sempre certo.
2) Se o corretor estiver errado, leia a regra nº 1.

 
Janis Ozols:

Obrigado, eu o li. Há um roteiro na página 7 para calcular o valor da margem calculada para cada posição aberta. Eu o ajustei um pouco, levando em conta o fato de que não é CFD, mas FOREX, e o compilei nesta forma:

Na grande maioria dos casos, o valor da margem final calculada por este roteiro coincide com a margem real. Mas, infelizmente, não no meu caso. O problema é que a fórmula para calcular a margem para cada pedido utiliza o valor de alavancagem ativa naquele momento.

Mas nos regulamentos de alguns corretores (sem apontar dedos) é especificado que para posições que são abertas sob certas condições (sexta-feira à noite, método de média, etc.) a alavancagem é especificada, e normalmente é várias vezes menor do que para a conta inteira. Esse é exatamente o meu caso. Entretanto, a fim de preparar corretamente uma reclamação e evitar repetir tal situação no futuro, preciso descobrir quais posições foram abertas com alavancagem normal e quais foram abertas com maior alavancagem.

A equipe de suporte do corretor diz abertamente que o aumento da alavancagem não é definido para a conta como um todo, mas para ordens específicas e isto acontece depois que a posição foi aberta. Assim, é inútil utilizar o pedido de AccountFreeMarginChek.

Isto realmente leva à seguinte pergunta: Existe alguma maneira de saber com segurança qual margem é realmente usada para cada posição no terminal, se soubermos que o corretor pode definir uma alavancagem diferente para cada posição?

Não perca seu tempo com correspondências inúteis. Está escrito no regulamento e discutir é como lutar contra moinhos de vento.

Não se trata do símbolo, trata-se do horário de abertura. Muitos o têm 15 minutos antes do fim de semana fechar. E 15 minutos mais tarde, na segunda-feira, a alavancagem volta ao normal.

 
Alexey Viktorov:

Não perca seu tempo com correspondências inúteis. Está escrito no regulamento e discutir é como lutar contra moinhos de vento.

Quero fazer uma reclamação principalmente para obter esclarecimentos sobre as regras de aplicação de maior alavancagem. Os regulamentos não são muito claros a este respeito.

O principal que eu quero entender é como evitar esta situação no futuro. Especificamente, nos regulamentos do meu corretor, a cláusula em questão contém a expressão vaga "a empresa se reserva o direito". Ou seja, eles podem ou não aplicar requisitos de margens maiores a uma ordem específica. Portanto, é muito importante para mim descobrir como detectar no terminal as posições às quais foi aplicado o aumento da alavancagem (que não a emitida pela AccountLeverage). Por exemplo, para fechar prontamente tais posições para informar o comerciante e interromper a negociação.

Certamente há alguma forma de solicitar do terminal a quantidade de margem para uma única posição. Eu simplesmente ainda não o conheço e não consigo encontrá-lo na documentação.

 
Janis Ozols:

Gostaria de fazer uma reclamação principalmente para obter esclarecimentos sobre as regras de aplicação de maior alavancagem. Não está muito claro no regulamento.

O principal que eu quero entender é como evitar esta situação no futuro. Especificamente, nos regulamentos do meu corretor, a cláusula em questão contém a expressão vaga "a empresa se reserva o direito". Ou seja, eles podem ou não aplicar requisitos de margens maiores a uma ordem específica. Portanto, é muito importante para mim descobrir como detectar no terminal as posições às quais foi aplicado o aumento da alavancagem (que não a emitida pela AccountLeverage). Por exemplo, para fechar prontamente tais posições para informar o comerciante e interromper a negociação.

Certamente há alguma forma de solicitar do terminal a quantidade de margem para uma única posição. Eu simplesmente ainda não sei, e não consigo encontrá-lo na documentação.

Eu não sei sobre seu corretor, mas há casos em que tudo estava bem, fechamos uma posição e obtemos uma margem maior. Não há como rastrear isto. E ninguém dará nenhuma explicação. Só há uma saída: não negociar em um momento em que sua margem possa aumentar. Isto é muito provavelmente regulado pelo percentual de margem, não pela alavancagem.

 

Calcule sua própria margem e alavancagem no momento em que você abre uma posição, usando fórmulas disponíveis publicamente.

Escreva a alavancagem no comentário ou no magik, ou em geral - escreva imediatamente a margem ajustada pela alavanca.

Você terá algo a lembrar

 
Alexey Viktorov:

Não sei quanto ao seu corretor, mas há casos em que tudo estava bem, fechamos a posição e obtemos maior margem.

No meu corretor é assim: abrimos uma posição e obtemos maior margem. E em alguns casos fazemos e em alguns casos não ("a empresa se reserva o direito de...").


Alexey Viktorov:

Há apenas uma saída: não negociar em um momento em que pode haver um aumento da margem. Isto é muito provavelmente regulado pelo percentual de margem, não pela alavancagem.

No meu caso, isto, infelizmente, não ajuda. A margem pode ser aumentada a qualquer momento. E é regulado pela alavancagem. Em qualquer caso, o regulamento fala de alavancagem. Gostaria muito de evitar discutir as condições comerciais de um determinado corretor neste tópico. O que realmente me interessa é como você pode obter informações do terminal sobre a quantidade de margem para uma única posição.

 
Renat Akhtyamov:

Calcule sua própria margem e alavancagem no momento em que você abre uma posição, usando fórmulas disponíveis publicamente.

Escreva a alavancagem no comentário ou no magik, ou em geral - escreva imediatamente a margem ajustada pela alavanca.

Você terá algo a lembrar.

Eu tentei fazer isso. Mas o problema é que a margem aumenta após a abertura de uma posição. Em outras palavras, antes de abrir uma posição, eu recebo o valor calculado de margem para ela. E imediatamente após uma chamada de OrderSend bem sucedida, peço ao terminal o valor da AccountMargin. E isso atende plenamente às minhas expectativas. Mas depois de um tempo este valor aumenta bruscamente! E o valorda AccountMargin acaba sendo dezenas de vezes maior do que o valor da margem para cada ordem em aberto, obtida imediatamente após sua abertura.

Minha pergunta pode ser reduzida a como, a qualquer momento, o terminal pode obter o valor real da margem para um pedido específico.

Este é AccountMargin() ou AccountInfoDouble(ACCOUNT_MARGIN) para toda a conta. Portanto, há duas maneiras de se obter este valor. Certamente, deve haver pelo menos uma maneira de obter o valor da margem para um pedido. Eu simplesmente não sei, é por isso que estou perguntando.

 
Janis Ozols:

Eu já tentei isso. Mas o problema é que a margem aumenta depois que a posição é aberta. Em outras palavras, antes de abrir uma posição, eu recebo o valor da margem calculada para ela. E imediatamente após uma chamada de OrderSend bem sucedida, peço ao terminal o valor da AccountMargin. E isso atende plenamente às minhas expectativas. Mas depois de um tempo este valor aumenta bruscamente! E o valorda AccountMargin acaba sendo dezenas de vezes maior do que o valor da margem para cada ordem em aberto, obtida imediatamente após sua abertura.

Minha pergunta pode ser reduzida a como, a qualquer momento, o terminal pode obter o valor real da margem para um pedido específico.

Este é AccountMargin() ou AccountInfoDouble(ACCOUNT_MARGIN) para toda a conta. Portanto, há duas maneiras de se obter este valor. Certamente, deve haver pelo menos uma maneira de obter o valor da margem para um pedido. Eu simplesmente ainda não sei, é por isso que estou perguntando.

você não precisa perguntar

Considere fórmulas

e o ombro, também. usando fórmulas

o terminal não rastreia a alavancagem atual, mas lhe dá aquela que você tinha quando carregou o terminal

é por isso que a margem solicitada por esta função é diferente

Razão: