A maioria das corretoras não emite mais chamadas de margem, pois todas as posições são fechadas (automaticamente?) antes que uma conta caia no vermelho (e você tenha que adicionar dinheiro: a chamada de margem).
Margem é o valor considerado como um depósito para uma posição aberta, ACCOUNT_MARGIN_FREE é o restante (parte não utilizada).
Um máximo de 5% a 10% do saldo da conta (saldo) ou do saldo de capital (saldo da conta + posições abertas, patrimônio líquido) deve ser usado para negociação a fim de evitar que as posições sejam fechadas devido à falta de capital e às perdas nas posições.
O risco de uma posição depende do SL e do tamanho do lote. Como o SL geralmente é fixo por motivos técnicos, o tamanho do lote é usado para calcular o risco: Pesquise "calculate lotsize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
Dica: a maioria dos artigos também está disponível em alemão, basta substituir o /en/ no URL por /de/:https://www.mql5.com/de/articles/2555
Obrigado pelas informações. Nas verificações que um robô de negociação deve passar, é mencionado um método "CheckMoneyForTrade", que verifica se a margem a ser usada para a negociação é maior do que a margem livre (ACCOUNT_FREE_MARGIN). Se eu entendi corretamente, você também deve verificar se os fundos usados também excedem uma determinada porcentagem do saldo da conta, ou seja, algo como:
if (freeMargin - tradeMargin < balance * 0.9) returnfalse;
Assim, é claro que você pode alterar 0,9 para (1 - maxRisk) e implementar uma propriedade "Maximum Risk in %" que pode ser definida pelo usuário.
P.S. Você usa o primeiro nome ou o sobrenome aqui no fórum?
Benjamin Fotteler #: Obrigado pelas informações. Nas verificações que um robô de negociação deve passar, é mencionado um método "CheckMoneyForTrade", que verifica se a margem a ser usada para a negociação é maior do que a margem livre (ACCOUNT_FREE_MARGIN). Se eu entendi corretamente, você também deve verificar se os fundos usados também excedem uma determinada porcentagem do saldo da conta, ou seja, algo do tipo:
Assim, é claro que você pode alterar 0,9 para (1 - maxRisk) e implementar uma propriedade "Risco máximo em %" que pode ser definida pelo usuário.
P.S. Estamos nos tratando pelo primeiro nome ou pelo primeiro nome aqui no fórum?
Todo mundo se atrapalha com o tamanho do lote e há muito código e comentários aqui!
Como a maioria das pessoas aqui é, de alguma forma, anônima com seus apelidos ou nomes próprios, e isso costumava ser ainda mais frequente, o "Du" se tornou naturalizado.
I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
Tenho outra pergunta: se eu calcular a perda de uma negociação interrompida com TICK_VALUE ou com deltaValue como acima, o resultado será sempre ligeiramente diferente do cálculo interno da MQL5:
Isso ocorre porque a perda/ganho por tick é diferente para uma conta em EUR e para o preço de mercado 1.0 e o preço de mercado 1.2? Porque se eu digitar, por exemplo, "price + 0.1" em vez de price e "sl + 0.1" em vez de sl no código abaixo, a distância do tick (diff) será a mesma, mas os respectivos resultados gerados pelo OrderCalcProfit serão diferentes. E quando observo os lucros/perdas que obtenho nas negociações manuais, isso parece se confirmar.
Se eu estiver certo, então o código a seguir seria mais preciso:
O código a seguir foi criado de acordo com o próprio expert sar parabólico do mql 5. Posso inverter a operação do sinal de compra e do sinal de venda aqui? Ou seja, quando o sinal de compra vier, quero que ele abra vendas em vez de comprar. Alguém pode ajudar?
Sugestão interessante, vou dar uma olhada nela. A função OrderCalcProfit() só existe no MT5 e as ideias para o cálculo de lotes remontam à época do MT4...
Agora, tive tempo de trabalhar com sua solução. Ela é mais precisa (enquanto a outra é mais cautelosa, já que a comissão é levada em conta?) e aparentemente menos propensa a erros, como pode ser visto com ouro e prata na conta demo da MQ - com a Roboforex ela é, como esperado, um pouco mais cautelosa do que sua solução:
Obrigado por seus testes. Sim, se você comparar os resultados entre si, poderá ver, por um lado, a consistência do OrderCalcProfit e, por outro lado, pelo menos para EURUSD e RoboForex, que os resultados diferem em aproximadamente "Lot size * CommissionPerLot". Isso poderia ser adicionado:
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Pesquise "calculate lotsize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
Assim, é claro que você pode alterar 0,9 para (1 - maxRisk) e implementar uma propriedade "Maximum Risk in %" que pode ser definida pelo usuário.
P.S. Você usa o primeiro nome ou o sobrenome aqui no fórum?Obrigado pelas informações. Nas verificações que um robô de negociação deve passar, é mencionado um método "CheckMoneyForTrade", que verifica se a margem a ser usada para a negociação é maior do que a margem livre (ACCOUNT_FREE_MARGIN). Se eu entendi corretamente, você também deve verificar se os fundos usados também excedem uma determinada porcentagem do saldo da conta, ou seja, algo do tipo:
Assim, é claro que você pode alterar 0,9 para (1 - maxRisk) e implementar uma propriedade "Risco máximo em %" que pode ser definida pelo usuário.
P.S. Estamos nos tratando pelo primeiro nome ou pelo primeiro nome aqui no fórum?Todo mundo se atrapalha com o tamanho do lote e há muito código e comentários aqui!
Agora eu entendi o que William Roeder escreveu para o MT5, que seria a função não testada(!!):
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477)
Por favor, avise-me se encontrar algum erro!
Como a maioria das pessoas aqui é, de alguma forma, anônima com seus apelidos ou nomes próprios, e isso costumava ser ainda mais frequente, o "Du" se tornou naturalizado.
Obrigado pelo código. A única coisa que faltou foi a adaptação a um tamanho de lote intermediário válido:
Tenho outra pergunta: se eu calcular a perda de uma negociação interrompida com TICK_VALUE ou com deltaValue como acima, o resultado será sempre ligeiramente diferente do cálculo interno da MQL5:
Isso ocorre porque a perda/ganho por tick é diferente para uma conta em EUR e para o preço de mercado 1.0 e o preço de mercado 1.2? Porque se eu digitar, por exemplo, "price + 0.1" em vez de price e "sl + 0.1" em vez de sl no código abaixo, a distância do tick (diff) será a mesma, mas os respectivos resultados gerados pelo OrderCalcProfit serão diferentes. E quando observo os lucros/perdas que obtenho nas negociações manuais, isso parece se confirmar.
Se eu estiver certo, então o código a seguir seria mais preciso:
P.S. Mais uma vez, obrigado pela ideia básica: vincular o fator de risco não ao saldo, mas à margem livre, claramente faz sentido.O código a seguir foi criado de acordo com o próprio expert sar parabólico do mql 5. Posso inverter a operação do sinal de compra e do sinal de venda aqui? Ou seja, quando o sinal de compra vier, quero que ele abra vendas em vez de comprar. Alguém pode ajudar?
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Incluir |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- sinais disponíveis
#include <Expert\Signal\SignalSAR.mqh>
//--- trilhas disponíveis
#include <Expert\Trailing\TrailingNone.mqh>
//--- gerenciamento de dinheiro disponível
#include <Expert\Money\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Entradas
//+------------------------------------------------------------------+
//--- entradas para especialista
input string Expert_Title ="sar"; // Nome do documento
ulong Expert_MagicNumber =13831; //
bool Expert_EveryTick =false; //
//--- entradas para o sinal principal
input int Signal_ThresholdOpen =10; //Valor do limiar do sinal para abrir [0...100]
input int Signal_ThresholdClose=10; // Valor do limite do sinal para fechar [0...100]
input double Signal_PriceLevel =0,0; // Nível de preço para executar uma negociação
input int Signal_Expiration =4; //Vencimento das ordens pendentes (em barras)
input double Signal_SAR_Step =0.02; // Incremento de velocidade SAR parabólico (0.02,0.2)
input double Signal_SAR_Maximum =0.2; // Parabolic SAR(0.02,0.2) Taxa máxima
input double Signal_SAR_Weight =1.0; // Parabolic SAR(0.02,0.2) Peso [0....1.0]
//--- entradas para dinheiro
input double Money_FixLot_Percent =10.0; //Porcentagem
input double Money_FixLot_Lots =0.1; // Volume fixo
//+------------------------------------------------------------------+
//| Objeto especialista global
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Função de inicialização do especialista |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Inicialização do especialista
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//----- falhou
printf(__FUNCTION__+": erro ao inicializar o especialista");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Criando sinal
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//----- falhou
printf(__FUNCTION__+": erro ao criar o sinal");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.Expiration(Signal_Expiration);
//--- Criando o filtro CSignalSAR
CSignalSAR *filter0=novo CSignalSAR;
if(filter0==NULL)
{
//----- falhou
printf(__FUNCTION__+": erro ao criar filter0");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Definir os parâmetros do filtro
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Weight(Signal_SAR_Weight);
//--- Criação do objeto de rastreamento
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//----- falhou
printf(__FUNCTION__+": erro ao criar o trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Adicionar trailing ao expert (será excluído automaticamente))
if(!ExtExpert.InitTrailing(trailing))
{
//----- falhou
printf(__FUNCTION__+": erro ao inicializar o trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Definir parâmetros de trailing
//--- Criação do objeto dinheiro
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//----- falhou
printf(__FUNCTION__+": erro ao criar dinheiro");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Adicionar dinheiro ao especialista (será excluído automaticamente))
if(!ExtExpert.InitMoney(money))
{
//----- falhou
printf(__FUNCTION__+": erro ao inicializar o dinheiro");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Definir parâmetros de dinheiro
dinheiro.Porcentagem(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Verificar os parâmetros de todos os objetos de negociação
if(!ExtExpert.ValidationSettings())
{
//----- falhou
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Ajuste de todos os indicadores necessários
if(!ExtExpert.InitIndicators())
{
//----- falhou
printf(__FUNCTION__+": erro ao inicializar os indicadores");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- ok
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do expert
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| Função do manipulador de eventos "Tick".
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| Função do manipulador de eventos "Trade"
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| Função do manipulador de eventos "Timer"
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
Agora, tive tempo de trabalhar com sua solução. Ela é mais precisa (enquanto a outra é mais cautelosa, já que a comissão é levada em conta?) e aparentemente menos propensa a erros, como pode ser visto com ouro e prata na conta demo da MQ - com a Roboforex ela é, como esperado, um pouco mais cautelosa do que sua solução:
Na conta da MQ, os tamanhos dos lotes seriam muito altos.
Aqui está meu script para comparar os dois métodos:
Derivei a direção de in > sl (compra) ou in < sl (venda). Assim, não haveria problemas com as ordens pendentes
Obrigado por seus testes. Sim, se você comparar os resultados entre si, poderá ver, por um lado, a consistência do OrderCalcProfit e, por outro lado, pelo menos para EURUSD e RoboForex, que os resultados diferem em aproximadamente "Lot size * CommissionPerLot". Isso poderia ser adicionado:
Se eu usei a pesquisa do fórum corretamente, não há como consultar o valor "CommissionPerLot" diretamente usando MQL5, há?
Se eu usei a pesquisa do fórum corretamente, então não há como consultar o valor "CommissionPerLot" diretamente usando MQL5, há?Sim, não diretamente no terminal, mas solicite-o ao corretor ou no histórico de negociação: DEAL_COMMISSION.