Erros, bugs, perguntas - página 4

 
Interesting:

MarketInfo(Symbol(),MODE_MARGININIT) = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)

O que corresponde então ao MODE_MARGINREQUIRED? Ou então, como sei quanto dinheiro gratuito preciso para abrir 1 lote para comprar?

Em Moving Average.mq5 Expert Advisor from mql5 creators, os lotes são calculados desta forma

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

Porque é que o MaximumRisk é tão pequeno (0,02%) e dividido por 1000 ao calcular os lotes? O que representa este 1000? Talvez 1000 = fundos disponíveis necessários para comprar 1 lote multiplicado por 100% (para converter 0,02% em 0,0002 fracção)? Ou seja, os fundos disponíveis para a compra de 1 lote são de $10 ($10x100%=1000). Será que está na direcção certa?

E mais uma pergunta. Existe um limite para o número máximo de encomendas em aberto?

 
gpwr:

O que corresponde então ao MODE_MARGINREQUIRED? Ou, de outra forma, como sei a quantidade de fundos disponíveis necessários para abrir 1 lote para comprar?

E mais uma pergunta. Existe um limite para o número máximo de encomendas em aberto?


Fiz esta pergunta a mim próprio.


Aqui está a resposta dos criadores:

Rashid Umarov:

Ver

SÍMBOLO_COMÉRCIO_TAMANHO_DE_CONTRATO

Dimensão do contrato comercial

duplo

и

SÍMBOLO_MOEDA_MARGIN

Moeda em que a margem é calculada

corda


Pelo que entendi, terá de ser você a calculá-lo

 

gpwr:

Em Moving Average.mq5 Expert Advisor from mql5 creators, os lotes são calculados desta forma

Porque é que o MaximumRisk é tão pequeno (0,02%) e dividido por 1000 ao calcular os lotes? O que representa este 1000? Talvez 1000 = fundos disponíveis necessários para comprar 1 lote multiplicado por 100% (para converter 0,02% em 0,0002 fracção)? Ou seja, os fundos disponíveis para a compra de 1 lote são de $10 ($10x100%=1000). Será que está na direcção certa?

E mais uma pergunta. Existe um limite para o número máximo de encomendas em aberto?


AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk

Esta linha calcula o risco como 2% do montante de fundos livres, se bem entendi. Porque dividem este montante por 1000?


Mas se bem entendi, então com um depósito (fundos grátis) de $20.000, o Consultor Especialista recomenda abrir não mais de 2% deste montante ($400).

Dividindo este montante por 1.000 obteremos logicamente 0,4 lote...

 

gpwr:

Existe um limite para o número máximo de encomendas em aberto?

Estava a pensar a mesma coisa. Há uma sugestão de que os criadores ainda estão a pensar (para eles, a propósito - aplicação 15802).
 
Interesting:

Esta linha calcula o risco como 2% do montante de fundos disponíveis, se bem entendi. A razão pela qual este montante é dividido por 1.000 cabe aos criadores.

Mas se bem entendi, então com um depósito (fundos grátis) de $ 20.000, o Consultor Especialista recomenda abrir não mais do que 2% deste montante ($ 400).

Dividindo este montante por 1.000 obteremos logicamente 0,4 lote...

Agora já o tenho. Há um erro em Moving Average.mq5. Em vez de

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Deve ser

input double MaximumRisk        = 0.02;    // Maximum Risk as a fraction  of a free margin

Depois a divisão por 1000 no cálculo dos lotes é clara: $100.000(tamanho do lote)/100(alavancagem) = 1000. No entanto, os criadores do mql5 não devem mostrar tal exemplo de um consultor especializado. Deve ser alterado

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

Para

double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(FreeMargin*MaximumRisk/LotRqdMgn,2);

Ou melhor ainda

double Step       =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(MathFloor(FreeMargin*MaximumRisk/LotRqdMgn/Step)*Step,2);

É uma pena que o MODE_MARGINREQUIRED se tenha perdido, no entanto. Talvez os programadores restaurem este parâmetro para reduzir o número de cálculos.

 
Interesting:
stringo:
Nomes curtos sempre foram usados apenas para exibição na subjanela do indicador
Por isso, não está lá exposto, ou é um erro ou não percebo nada...
Encontrado o erro e corrigido, o 16051 pode ser encerrado.
 

Não sei se estou a colocar os meus relatórios de insectos no sítio certo. Caso contrário, por favor, corrijam-me.

Ao testar a minha EA, criei propositadamente tal situação para ver se o testador determina correctamente a margem. Portanto, o depósito de 100 dólares. Trocamos EURUSD. O tamanho mínimo do lote é de 0,1. O seguinte código para o cálculo dos lotes está no Expert Advisor

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);

O testador gera estes erros

2010.06.08 22:28:57 Core 1 não há dinheiro suficiente [compra imediata 0.10 EURUSD a 1.19242]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.24, NewFreeMargin: -19.24
2010.06.08 22:28:57 Core 1 1000 100
2010.06.08 22:28:57 Core 1 não há dinheiro suficiente [compra imediata 0.10 EURUSD a 1.19180]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.18, NewFreeMargin: -19.18
2010.06.08 22:28:57 Core 1 1000 100
2010.06.08 22:28:57 Core 1 não há dinheiro suficiente [compra imediata 0.10 EURUSD a 1.19362]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.36, NewFreeMargin: -19.36
2010.06.08 22:28:57 Core 1 1000 100

A julgar por estas mensagens, a margem gratuita necessária para comprar 1 lote, LotRqdMgn, é igual a 1000, o que parece estar correcto. FreeMargin=100. Multiplique 0,1 lote por 1000 e obtém 100. Isto significa que temos fundos suficientes para abrir o 1º lote. Mas o testador relata que não temos fundos suficientes. Onde está o erro?

 
gpwr:

Com base nestas mensagens, a margem gratuita necessária para comprar 1 lote, LotRqdMgn, é de 1000, o que parece correcto. FreeMargin=100. Multiplique 0,1 lote por 1000 e obtém 100. Isto significa que temos fundos suficientes para abrir o 1º lote. Mas o testador relata que não temos fundos suficientes. Onde está o erro?

O erro é que se esqueceu da moeda da margem nos seus cálculos. Saldo = 100 USD e exigência de margem = 100 EUR (119 USD).

É por isso que não se pode fazer uma transacção - tudo está correcto.

 
Renat:

O erro é que se esqueceu da moeda da margem nos seus cálculos. Saldo = 100 USD e exigência de margem = 100 EUR (119 USD).

É por isso que não é possível fazer uma transacção - tudo está correcto.

Obrigado Renat. Compreendi o meu erro. Alterou a fórmula de cálculo do LotRqdMgn e agora tudo funciona correctamente.

 

Uma nova palavra na biblioteconomia, ou o espantoso ao lado...


Assim, criei um Consultor Especialista que utiliza a biblioteca, verificou-a e tudo funciona. Fiz um arquivo com o consultor especializado, esta biblioteca e alguns ficheiros MQL5 e MQH. Entreguei o arquivo ao Aplicador/Desenvolvedor para testes.


Não há problema, mas decidi fazer os testes noutro terminal. Assim, desembalei o arquivo e decidi anexar o Consultor Especialista ao quadro.


E no diário terminal estas duas linhas são escritas:

2010.06.10 09:54:51 PM Experts MechanicalTrading-Infinity-2010 (EURUSD,Daily)
2010.06.10 09:54:51 Carregamento de Especialistas de Tradução Mecânica-Infinity-2010 (EURUSD,Daily) falhou


Comecei a procurar o quê e como funciona (ou melhor, não funciona) e encontrei um facto espantoso - o terminal vê compilada biblioteca em directório (como *.ex5), mas persistentemente "afunda-a", o que não é muito bom, como compreende...

Depois de tentar muitas razões possíveis para tal comportamento, decidi colocar o ficheiro original (como *.mq5) na pasta com a biblioteca. Tentei acrescentar um EA ao mapa - oh meu deus, tudo funciona.


No processo do jogo, surgiu uma série de questões:

1. Porque é que o Expert Advisor não funciona, se a biblioteca é representada apenas como .ex5?

2. Porque é que o terminal elimina teimosamente este ficheiro do directório?

3. Porque é que o diário de bordo terminal não tem um comentário claro sobre todos os pontos acima?

4. Porque é que a documentação não diz que este comportamento é possível?


E finalmente a quinta e última questão - como lidar com tudo isto e o que estou a fazer mal (pode ser que falte um ficheiro EX5 no terminal e que esteja à procura de algo, por exemplo um ficheiro de cabeçalho ou a própria biblioteca)?


PS

A propósito, tenho o mesmo bug com os Expert Advisors, eliminação obstinada do ficheiro *.ex5... :(

Razão: