Como é que o MetaTrader 5 calcula o lucro?

 

Executar um guião simples:

//+------------------------------------------------------------------+
//|                                                       profit.mq5 |
//+------------------------------------------------------------------+
string com;
string Sy[28]={"EURGBP","EURAUD","EURNZD","EURUSD","EURCAD","EURCHF","EURJPY","GBPAUD","GBPNZD","GBPUSD",
              "GBPCAD","GBPCHF","GBPJPY","AUDNZD","AUDUSD","AUDCAD","AUDCHF","AUDJPY","NZDUSD","NZDCAD",
              "NZDCHF","NZDJPY","USDCAD","USDCHF","USDJPY","CADCHF","CADJPY","CHFJPY"};
double a[28],b[28],BuyPlus[28],BuyMinus[28],SellPlus[28],SellMinus[28];
double diff=0.001;

void OnStart()
  {com="";
   for(int i=0;i<28;i++)
      {b[i]=SymbolInfoDouble(Sy[i],SYMBOL_BID);a[i]=SymbolInfoDouble(Sy[i],SYMBOL_ASK);
       OrderCalcProfit(ORDER_TYPE_BUY,Sy[i],1.0,a[i],a[i]+diff,BuyPlus[i]);
       OrderCalcProfit(ORDER_TYPE_BUY,Sy[i],1.0,a[i],a[i]-diff,BuyMinus[i]);
       OrderCalcProfit(ORDER_TYPE_SELL,Sy[i],1.0,b[i],b[i]+diff,SellPlus[i]);
       OrderCalcProfit(ORDER_TYPE_SELL,Sy[i],1.0,b[i],b[i]-diff,SellMinus[i]);
       
       com=com+"\n"+Sy[i]+"  BuyPlus="  +DoubleToString(BuyPlus[i],4)
                         +"  BuyMinus=" +DoubleToString(BuyMinus[i],4)
                         +"  SellPlus=" +DoubleToString(SellPlus[i],4)
                         +"  SellMinus="+DoubleToString(SellMinus[i],4);
      }//for
   Comment(com);
  }//start

O erro é claramente visível...

O problema deve vir deSYMBOL_TRADE_TICK_VALUE_PROFIT eSYMBOL_TRADE_TICK_VALUE_LOSS.

Vamos precisar deSYMBOL_TRADE_TICK_VALUE_LONG e SYMBOL_TRADE_TICK_VALUE_SHORT.

A pesquisa revelou algo interessante:

Renat:

Я вчера, когда смотрел код, неверно выразился по поводу разной стоимость пункта в зависимости от направления.

Точнее сказать, что TickValue при конвертации в целевую валюту зависит от того, убыточна она или нет. То есть, если мы получили убыток в 1 пипс, то нам надо его выкупить по цене Ask, а если прибыль в 1 пипс, то продать по цене Bid.


Isto está errado, é claro. Para uma posição curta, preço ao contrário....

Espero realmente que o erro seja involuntário! Pode corrigi-lo, por favor!

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

Infelizmente, a questão não está claramente formulada e não há nenhuma conclusão a partir do exemplo proposto. Não é claro - o que é exactamente indicado como um erro.

Formule a sua pergunta com precisão, anexe os resultados obtidos e indique onde se encontra o erro neles, por favor.

Por exemplo, indicar onde o erro se encontra aqui:

EURGBP  BuyPlus=158.40000000  BuyMinus=-158.48000000  SellPlus=-158.48000000  SellMinus=158.40000000  Profit=1.58398000  Loss=1.58482000

Adicionei SYMBOL_TRADE_TICK_VALUE_PROFIT e SYMBOL_TRADE_TICK_VALUE_LOSS valores no final.

Podemos ver que o lucro tem realmente em conta diferentes valores de um tick, dependendo da rentabilidade ou da perda de uma transacção. Isto porque existe uma operação de conversão implícita para a moeda de depósito, quando se tem de vender (se for lucro) ou comprar de volta (se for perda) o resultado financeiro obtido numa moeda para conversão.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

 

O valor de um tick não depende do lucro ou da perda de uma troca.

O lucro e a perda fecharão pelo mesmo preço. A conversão é a mesma.

Apenas as transacções curtas e longas podem ter uma diferença no valor do tick e podem ser contadas de forma diferente para a conversão para a moeda de depósito.

O exemplo de BuyPlus e BuyMinus seria igual. SellPlus e SellMinus também. Só se pode comprar.... é diferente de Vender...

Está a confundir algo aqui :

Renat:

... Quando tem devender(se for lucro) oucomprar de volta(se for perda) o resultado financeiro em uma moeda para conversão.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 

Quando abre uma transacção para EURGBP, e a moeda do depósito é USD,basicamente tem (aproximadamente) Comprar EURUSD e Vender GBPUSD. (A diferença de volume não importa, porque não se alteram quando se fecha)

Para abrir:Comprar EURUSD em Ask(EURUSD) e vender GBPUSD em Bid(GBPUSD).

No final(se for um lucro,se for uma perda) tem o mesmo preço: Bid(EURUSD) e Ask(GBPUSD).

Porque é que o valor do tick é diferente para olucro/perda?

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 

Isto é o resultado de uma concepção errada de longa data dos criadores:

Renat:

É mais correcto dizer que o TickValue ao converter para a moeda alvo depende de ser ou não uma perda. Isto é, se tivermos um prejuízo de 1 pip, temos de o comprar de volta ao preço Ask, e se tivermos um lucro de 1 pip, temos de o vender ao preço Bid.

 
Manov:

O valor de um tick não depende do facto de uma transacção ser lucrativa ou não lucrativa.

O lucro e a perda fecharão pelo mesmo preço. Na conversão - o mesmo.

Isso é o que acontece.

Para o fazer, é necessário compreender a matemática dos cálculos com conversões cruzadas complexas. Enquanto operar com majores como EURUSD e GBPUSD, não verá nada.

Sim, à primeira vista pode parecer que não depende disso, mas se examinar as cruzes em pormenor, verá que depende.

 
Renat:

Aí é que está, depende.

Este é, na verdade, um ponto discutível. A lógica de Renat é clara e parece mesmo correcta à primeira vista:

Quando se faz um comércio cruzado, obtém-se um lucro na sua moeda de base. Por exemplo, o lucro de uma transacção EURGBP é medido em GBP. Mas não existe um conceito de lucro multi-divisas em MT5, pelo que o lucro em GBP é convertido para a moeda da conta na mosca. E parece que em caso de lucro positivo deve ser convertido à taxa de câmbio actual GBPUSD_Bid, e em caso de negativo - GBPUSD_Ask.

No entanto, aqui está um contra-exemplo:

  1. Tem duas contas independentes. Decidiu transferir fundos de um para o outro.
  2. Na EURGBP, o spread interno de uma conta é definido para BuyLimit. Consequentemente, o preço da Proposta torna-se seu.
  3. Na outra conta, utilizando uma ordem de mercado, executa-se a VENDA.
  4. Com esta simples operação, vendeu para si próprio.
  5. Passado algum tempo, decide fechar os negócios.
  6. Na primeira conta, estabelece-se o SellLimit dentro do spread. Agora o seu preço passa a ser o Preço-Pedido.
  7. Por outro lado, utiliza a ordem do mercado para COMPRAR.
  8. Acontece que agora comprou da sua própria conta.
  9. Ambas as transacções em cada conta foram encerradas. Comprou e vendeu para si próprio.
  10. Numa conta tem lucro positivo e na outra negativo.
  11. Acha que o montante de fundos em ambas as suas contas mudou (não incluindo a comissão do corretor)?
  12. De acordo com a lógica de Renat, mudou. Porque o lucro de uma conta não será igual à perda da outra conta. E isto apesar do facto de ser você mesmo a comprar e a vender.
  13. Será isso correcto?

Estávamos a falar de condições de mercado - corretor ECN/STP.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
hrenfx:

No entanto, um contra-exemplo:
  1. Será isto a coisa certa a fazer?

Tratava-se das condições do mercado - corretor ECN/STP.

Considerar que existem pelo menos duas outras transacções internas de conversão com os seus próprios spreads.
 
Renat:

O problema é esse: depende.

Para o fazer, é necessário aprofundar o suficiente na matemática dos cálculos com complexas conversões cruzadas. Enquanto operar com majores como EURUSD e GBPUSD, não verá nada.

Sim, parece à primeira vista, que não deve depender, mas se examinar as cruzes em pormenor, verá que depende.

O cálculo do pedido/oferta pode sercomplicado, mas de facto,para todas as cruzes, tem 2 ofícios:

1. comprar ou venderSYMBOL_CURRENCY_BASE-ACCOUNT_CURRENCY on Ask/Bid

2) Comprar ou venderSYMBOL_CURRENCY_PROFIT -ACCOUNT_CURRENCY for Ask/Bid

Cada comércio, se o abrirmos com Bid, fechá-lo-emos com Ask. E vice versa ...

O sinal de resultado não importa para preços próximos, como acontece agora no MetaTrader 5 !

 
Renat:
Tenha em mente que há pelo menos mais duas conversões internas com os seus próprios spreads.

De que operações de conversão estamos a falar? A lógica é simples, tem de converter lucros em múltiplas moedas para a moeda da conta, nada mais. No caso do exemplo, o lucro em GBP deve ser convertido em USD. Não importa se o lucro é positivo ou negativo, tem de o converter.

Desistiu do padrão de mercado de obter lucros em várias moedas e convertê-las no momento da capotagem. Este é um afastamento das condições de mercado do MT5, que se posiciona como uma plataforma de mercado. Mas por uma questão de simplificação, esta partida pode ser compreendida e não implica em muitos casos (não em todos) custos graves.

Mas no caso do cálculo do lucro, para chamar as coisas pelos seus próprios nomes, está, intencionalmente ou acidentalmente, a contribuir para um esquema fraudulento para tirar dinheiro aos clientes em favor de um corretor que utiliza o MT5. Deixe-me explicar, no momento em que um corretor está a obter lucros extra na MT5, desde a negociação de todos os seus clientes iguais (aproximadamente) até ao volume de negócios de todos os seus clientes em cruzamentos, multiplicado pelo spread correspondente das majors.

Implementou um esquema gratuito para ganhar dinheiro com o spread, e com qualquer spread. Por exemplo, durante as notícias, no mesmo GBPUSD, o spread pode ser muito amplo e se houver um fecho/abertura nos clientes do corretor, o corretor ganha este enorme spread num local plano.

Isto é uma desvantagem e a renúncia ao lucro em múltiplas moedas, porque o spread em múltiplas moedas pode ser convertido a preços muito desagradáveis durante as notícias. E, de facto, durante o rollover, o lucro multi-divisas é convertido na compensação total de todos os clientes. E não há forma de tais desequilíbrios poderem ocorrer, como demonstrado no contra-exemplo acima.