Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1415

 
  1. 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).
  2. Margem é o valor considerado como um depósito para uma posição aberta, ACCOUNT_MARGIN_FREE é o restante (parte não utilizada).
  3. 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.
  4. 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
  5. 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) return false;

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!

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)

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   return( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
}
// use: lotsz(5, sl)

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.

Why is there NO Complete EA within the Code-Base? - When does the market close or open?
Why is there NO Complete EA within the Code-Base? - When does the market close or open?
  • 2011.08.20
  • www.mql5.com
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
 

Obrigado pelo código. A única coisa que faltou foi a adaptação a um tamanho de lote intermediário válido:

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts/stepSize)*stepSize);
}
// use: lotsz(5, sl)

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:

double price=(ordDir==ORDER_TYPE_BUY) ? mqTick.ask : ((ordDir==ORDER_TYPE_SELL) ? mqTick.bid : mqTick.last);
double loss;
OrderCalcProfit(ordDir, sym, 1, price, sl, loss)

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:

double lotsz (double risk, double entry, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double loss;
   OrderCalcProfit(ordDir, sym, 1, entry, sl, loss);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts / stepSize) * stepSize);
}
// use: lotsz(5, ask, sl)
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();

}

//+------------------------------------------------------------------+


 
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...
 
Não consigo abrir minha sessão no aplicativo para ver quanto dinheiro tenho
 

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:

MetaQuotes demo account (b. 3369 Beta channel)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAUUSD  in: 1717.65000 sl:1717.15000  diff:0.50000  delta:10.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.01000
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAGUSD  in: 18.45100 sl:18.40100  diff:0.05000  delta:500.00000  delta:*diff:25.00000  tVal:0.50000  tSz:0.00100
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   EURUSD  in: 1.02185 sl:1.02235  diff:0.00050  delta:97861.72139  delta:*diff:48.93086  tVal:0.97862  tSz:0.00001
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAUUSD  BU  in: 1717.65000  sl: 1717.15000  lotsC: 71.3100 (-3489.26)  lotsB: 10.2000 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAGUSD  BU  in: 18.45100  sl: 18.40100  lotsC: 18.4900 (-4523.66)  lotsB: 2.0400 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  EURUSD  SE  in: 1.02185  sl: 1.02235  lotsC: 9.8000 (-479.29)  lotsB: 10.2100 (-499.34)


RoboForex Demo account (b. 3320 release channel)
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAUUSD  in: 1717.10000 sl:1717.15000  diff:0.05000  delta:100.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.00100
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAGUSD  in: 18.43400 sl:18.43350  diff:0.00050  delta:5000.00000  delta:*diff:2.50000  tVal:0.05000  tSz:0.00001
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   EURUSD  in: 1.02186 sl:1.02236  diff:0.00050  delta:100000.00000  delta:*diff:50.00000  tVal:1.00000  tSz:0.00001
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAUUSD  SE  in: 1717.10000  sl: 1717.15000  lotsC: 38.2000 (-191.00)  lotsB: 53.4900 (-267.45)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAGUSD  BU  in: 18.43400  sl: 18.43350  lotsC: 59.4300 (-148.57)  lotsB: 106.9700 (-267.42)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  EURUSD  SE  in: 1.02186  sl: 1.02236  lotsC: 5.1400 (-257.00)  lotsB: 5.3500 (-267.50)

Na conta da MQ, os tamanhos dos lotes seriam muito altos.

Aqui está meu script para comparar os dois métodos:

//+------------------------------------------------------------------+
//|                                            test_MM-functions.mq5 |
//|                                                            Calli |
//|                              https://www.mql5.com/de/users/gooly |
//+------------------------------------------------------------------+
#property copyright "Calli"
#property link      "https://www.mql5.com/de/users/gooly"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input double   risk_perCent   = 5.0;   // risk of capital in % on free_margin
input double   diff_sl        = 50;    // diff sl in points from entry
input double   CommPerLot     = 2.00;  

string Com = "",Syms[] = {"XAUUSD", "XAGUSD", "EURUSD" }; //,"AUDUSD","GBPCHF","GBPUSD", "EURCAD", "USDCAD", "USDRUB", "GBPJPY", "USDJPY"};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#define  forEach(TYPE, VAR, ARRAY) \
                TYPE VAR=NULL; \
                for(int i##VAR=0;  i##VAR<ArraySize(ARRAY)&&((VAR=ARRAY[i##VAR])!=NULL||true);  i##VAR++)

void OnStart()
  {
//---
   MqlTick mqTick;
   forEach(string, sym, Syms){
      
      double pnt = SymbolInfoDouble(sym,SYMBOL_POINT);
      ENUM_ORDER_TYPE ord = GetMicrosecondCount()%2==0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; // randomly buy or sell
      SymbolInfoTick(sym,mqTick); 
      double entry = (ord==ORDER_TYPE_BUY) ? mqTick.ask : mqTick.bid,
             sl    = (ord==ORDER_TYPE_BUY) ? entry - diff_sl*pnt : entry + diff_sl*pnt,
             lossC = 0.0, lossB = 0.0,
             lotsC = lotszC(risk_perCent, entry, sl, sym, CommPerLot), 
             lotsB = lotszB(risk_perCent, entry, sl, sym, CommPerLot);
      
      if (!OrderCalcProfit(ord, sym, lotsC, entry, sl, lossC) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      if (!OrderCalcProfit(ord, sym, lotsB, entry, sl, lossB) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      string res = StringFormat("Set: Risk: %.1f %%, dSL: %.0f  Com/Lot: %.2f  Free: %.2f %s:  %s  %s  in: %.5f  sl: %.5f  lotsC: %.4f (%+.2f)  lotsB: %.4f (%+.2f)",
                                 risk_perCent, diff_sl, CommPerLot,
                                 AccountInfoDouble(ACCOUNT_MARGIN_FREE),AccountInfoString(ACCOUNT_CURRENCY),
                                 sym, (ord==ORDER_TYPE_BUY ? "BU" : "SE"), entry, sl, lotsC, lossC, lotsB, lossB );
      Com = Com + res+"\n";
   }
   Comment(Com);
   //Print(Com);
  }
//+------------------------------------------------------------------+
double lotszC (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double diff = fabs (entry - sl); 
   Print(sym,"  in: ",DoubleToString(entry,5)," sl:",DoubleToString(sl,5),"  diff:",DoubleToString(diff,5),
         "  delta:",DoubleToString(deltaValue,5),"  delta:*diff:",DoubleToString(deltaValue*diff,5),
         "  tVal:",DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE),5),"  tSz:",
         DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE),5));
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts/stepSize)*stepSize);
}

double lotszB (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double loss;
   if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts / stepSize) * stepSize);
}

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:

if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / (-loss + CommissionPerLot);
Se eu usei a pesquisa do fórum corretamente, não há como consultar o valor "CommissionPerLot" diretamente usando MQL5, há?
 
Benjamin Fotteler #:


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.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
  • www.mql5.com
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Razão: