Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
Função para calcular o tamanho do lote a partir do risco por depósito - expert para MetaTrader 5
- Visualizações:
- 152
- Avaliação:
- Publicado:
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
price_open - preço de abertura de uma negociação;
price_stoploss - preço do nível de stop-loss;
risk_percent_equity - risco por negociação em porcentagem do depósito;
double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity) { double volume = {}; double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100; double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE); double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE); double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX); double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); double delta_stoploss = MathAbs(price_open - price_stoploss); double margin_risk_1lot = delta_stoploss / tick_size * tick_value; volume = margin_risk / margin_risk_1lot; volume = MathFloor(volume / lot_step) * min_lot; if(volume == 0) volume = min_lot; if(volume > max_lot) volume = max_lot; return volume; }
Exemplo de um Expert Advisor negociando aleatoriamente por meio dessa função
input int stoploss_points = 100;//stop loss em pips input double risk_percent_equity = 1;//risco como porcentagem do depósito //+------------------------------------------------------------------+ ENUM_ORDER_TYPE order_type = ORDER_TYPE_BUY; double equity_open = {}; double profit_expected = {}; bool pos_open = false; //+------------------------------------------------------------------+ void OnTick() { if(!pos_open) { MqlTradeRequest request; MqlTradeCheckResult result_check; MqlTradeResult result_trade; ZeroMemory(request); ZeroMemory(result_check); ZeroMemory(result_trade); double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE); if(order_type == ORDER_TYPE_BUY) order_type = ORDER_TYPE_SELL; else order_type = ORDER_TYPE_BUY; if(order_type == ORDER_TYPE_BUY) { request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK); request.type = ORDER_TYPE_BUY; request.sl = request.price - tick_size * stoploss_points; request.tp = request.price + tick_size * stoploss_points; } else { request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID); request.type = ORDER_TYPE_SELL; request.sl = request.price + tick_size * stoploss_points; request.tp = request.price - tick_size * stoploss_points; } double volume = GetVolByRisk(request.price, request.sl, risk_percent_equity); request.action = TRADE_ACTION_DEAL; request.symbol = Symbol(); request.volume = volume; request.deviation = 5; profit_expected = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100; equity_open = AccountInfoDouble(ACCOUNT_EQUITY); if(OrderCheck(request, result_check)) { OrderSend(request, result_trade); pos_open = true; } } } //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if(trans.type == TRADE_TRANSACTION_DEAL_ADD) { HistoryDealSelect(trans.deal); ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY); if(deal_entry == DEAL_ENTRY_OUT) { Print("=========="); Print("volume= ", trans.volume); Print("equity_open= ", equity_open); Print("equity_close= ", AccountInfoDouble(ACCOUNT_EQUITY)); Print("profit expected= +/- ", profit_expected); Print("profit real= ", HistoryDealGetDouble(trans.deal, DEAL_PROFIT)); Print("=========="); pos_open = false; } } } //+------------------------------------------------------------------+ double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity) { double volume = {}; double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100; double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE); double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE); double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX); double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); double delta_stoploss = MathAbs(price_open - price_stoploss); double margin_risk_1lot = delta_stoploss / tick_size * tick_value; volume = margin_risk / margin_risk_1lot; volume = MathFloor(volume / lot_step) * min_lot; if(volume == 0) volume = min_lot; if(volume > max_lot) volume = max_lot; return volume; } //+------------------------------------------------------------------+
Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/48222
ATR Cycles
Um filtro de volatilidade baseado em 3 ATRs: um ATR rápido, um ATR médio e um ATR lento
KA-Gold Bot MT5
O KA-Gold Bot é um consultor de negociação avançado projetado especificamente para ouro, utilizando a poderosa combinação da estratégia do canal Keltner e duas médias móveis exponenciais (EMAs) - a EMA de 10 períodos e a EMA de 200 períodos. Princípio de funcionamento: A MME de 10 períodos representa o corte médio do preço acima/abaixo da banda de Keltner, confirmando uma tendência de alta/baixa. O fato de o preço estar acima da MME de 200 períodos confirma a tendência de alta/baixa. Isso indica que a tendência de alta/baixa tem sido mais forte do que nos 10 períodos anteriores, considerando a volatilidade dos últimos 50 períodos - Prazo: M15
MathTicker - gerador de ticks no modo matemático
Registra os ticks no modo de ticks reais e os lê no modo matemático, chamando sua estratégia a cada tick.
SAR ADX Signal
Sinal SAR ADX com notificação móvel, reescrito a partir da versão MT4 (a fonte não foi mais encontrada). Esse é um indicador repintável, portanto, tenha cuidado ao usá-lo.