Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 71

 
Vitalie Postolache:

Desde quando um período é um tipo duplo?

É isso que estou dizendo, string+int é um erro

Mas se você o fizer da maneira que escrevi acima, não haverá erro.

 
Renat Akhtyamov:

É isso que estou dizendo: string+int é um erro.

Mas se você o fizer da maneira que escrevi acima, não haverá erro.


IntegerToString? Não, ainda não ouviu falar ;)
 
Vitalie Postolache:

IntegerToString? Não, ainda não ouviu falar ;)
De qualquer maneira funciona bem, eu não vejo um problema
 

olá a todos

Eu sou novo em programação, mas tento aprender)

Tenho um pequeno problema em fechar a ordem de acordo com as leituras dos indicadores

devo informar imediatamente sobre as condições de abertura e fechamento: abro uma posição seguindo as leituras do indicador e fecho-a seguindo as leituras do indicador, mas na direção oposta, sem nenhuma parada e lucro

if(r > 50 && p > m) //condições para abertura de uma ordem de compra

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir pedido de compra

}

estou escrevendo corretamente a condição de fechamento do pedido?

if(r < 50 && p < m) --- esta é uma condição de Venda e uma condição de Fechamento

{

OrderClose(ticketB,0.1,Bid,5,Red);

}

e imprime o possível uso de 'ticketB' variável não-inicializada e o valor de retorno de 'OrderClose' deve ser verificado

Vocês podem me dizer onde eu escrevi errado?



 
funnyrain8:

olá a todos

Eu sou novo em programação, mas tento aprender)

Tenho um pequeno problema em fechar a ordem de acordo com as leituras dos indicadores

devo informar imediatamente sobre as condições de abertura e fechamento: abro uma posição seguindo as leituras do indicador e fecho-a seguindo as leituras do indicador, mas na direção oposta, sem nenhuma parada e lucro

if(r > 50 && p > m) //condições para abertura de uma ordem de compra

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir pedido de compra

}

estou escrevendo corretamente a condição de fechamento do pedido?

if(r < 50 && p < m) --- esta é uma condição de Venda e uma condição de Fechamento

{

OrderClose(ticketB,0.1,Bid,5,Red);

}

e imprime o possível uso de 'ticketB' variável não-inicializada e o valor de retorno de 'OrderClose' deve ser verificado

Vocês poderiam me dizer onde eu escrevi errado?



A variável ticketB não é inicializada, ou seja, seu tipo não é conhecido. Neste caso, é Int

O segundo erro é que temos que verificar o resultado do fechamento do pedido em busca de erros. Procurar "função de tratamento de erros" no fórum

 
Renat Akhtyamov:

a variável ticketB não é rubricada, ou seja, o tipo não é conhecido. Neste caso, é Int.

O segundo erro é a verificação do resultado do fechamento do pedido em busca de erros. Procurar "função de tratamento de erros" no fórum

Não consigo entender bem a lógica ou estou estupefato), mas como faço isso? No início tentei fazer isso usando OrderSelect, mas estava errado)

Preciso de algumas informações sobre isto.

 
funnyrain8:

é GetLastError? não consigo entender a lógica ou sou um pouco burro) mas como defini-lo? a princípio tentei fazer tudo com OrderSelect, mas não é a mesma coisa)

Preciso de algumas informações sobre isto.

Sim.

Veja através da base de código - muitos exemplos de implementação.

 
Olá, eu sou um vendedor de sinais, gostaria de saber como você pode promover seus sinais para que as pessoas os subscrevam...
 
Vitalie Postolache:


Onde está a lógica? Você estabelece o lote máximo permitido para o primeiro pedido e depois o aumenta para cada pedido subseqüente. Você não acha que isto é, para dizer de forma branda, pouco sensato?

Além disso, você diminui o lote da primeira ordem no laço usando algum método totalmente incompreensível, enquanto os lotes das outras ordens que foram "calculadas" antes permanecem inalterados, e estes valores não vão além dos limites desta função. Então, o que eles fazem?

Sem mencionar que o laço de incremento não pode ser um número real, ele tem que ser um contador, um inteiro. Mas você define o valor do lote como um contador e subtrai um dele a cada iteração. Este é um grande erro, um erro muito grave.

Esclareça primeiro a lógica em sua mente e depois tente implementá-la em seu código.

Os valores que não são retirados para determinar o lote final após a multiplicação, deve ser o máximo lote possível para abrir, de fato, as ordens com estes lotes podem não abrir porque a EA abre as ordens em um pequeno intervalo, mas a probabilidade está lá e é por isso que eu quero calcular o máximo lote inicial possível. Ouvi seus conselhos e isto é o que eu tenho. O que você pensa sobre esta função? Acho que me escapou algo ou o prescrevi incorretamente; o testador pendura um pouco e obtém um pequeno lote de produção.
//Функция расчета торгового лота
double GetLots()
{
 double lots = 0.0;
 double L9 = MarketInfo(Symbol(),MODE_MAXLOT);
 double L8 = L9 / Multipler;
 double L7 = L8 / Multipler;
 double L6 = L7 / Multipler;
 double L5 = L6 / Multipler;
 double L4 = L5 / Multipler;
 double L3 = L4 / Multipler;
 double L2 = L3 / Multipler;
 double cl = L2 / Multipler;
 double balance = AccountFreeMarginCheck(Symbol(),OP_BUY,L9);
 
 if(balance <= AccountFreeMargin())
 {
  for(int risk = 100;balance > 0 && risk > 0;risk--)
  {
   if(!IsStopped())
   {
    if(risk >= 1)
    {
     lots = (cl/100)*risk;
    }
    if(risk < 1)
    {
     for(int risk2 = 100;balance > 0 && risk2 >= 1;risk2--)
     {
      lots = (cl/100)*(risk2*0.01);
     }
    }
   }
  }
 }
 double clots = NormalizeDouble(MathMax(lots,MarketInfo(Symbol(),MODE_MINLOT)),2);
 return(clots);
}
 
Arseniy Barudkin:

O que você pensa sobre isso?


Eu direi o mesmo. Você não é bom em lógica. Qual é o problema para calcular imediatamente o lote inicial, com base nos fundos disponíveis e no valor do risco (acho que foi escrito cerca de 3%)? Por que você tem que fazer tudo em um só lugar?

Pegue o valor da margem livre, multiplique pelo risco, divida por 100 e o valor da margem para 1 lote - aqui está a fórmula mais simples para calcular o lote com uma porcentagem especificada da margem livre. Além disso, é preciso levar em conta a etapa de mudança de lote e evitar que o tamanho mínimo/máximo do lote permitido pelas corretoras seja ultrapassado:

input double risk = 3; //процент свободной маржи для расчёта лота
double GetLots()
{
  double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
  double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
  double rsk = MathMin(100.0,risk);
  double lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
  double lotmin = MarketInfo(Symbol(), MODE_MINLOT);

  double clots = NormalizeDouble(lotstep*MathRound(AccountFreeMargin()*rsk/100/margin/lotstep),2);
  if(clots < lotmin) clots = lotmin;
  if(clots > lotmax) clots = lotmax;

return(clots);
}