Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1415
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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.