Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 627

 
Sergey Likho:

Você pode me dizer como calcular as garantias para uma transação?


Tentei duas abordagens

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


E este aqui

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



O primeiro dá resultados estranhos no EURJPY se minha moeda de depósito for USD. Preciso acrescentar algo à fórmula?

O segundo também funciona apenas uma vez, às vezes dá o valor certo, às vezes dá algum absurdo (depende do depósito)

A segunda variante é a forma correta de calcular o depósito. Para ser mais exato, a variável val mostra o valor dos fundos livres após o pedido ter sido feito e a variávelFreeMarginCheck mostra o valor do próprio depósito

 
Igor Makanu:

A segunda opção é a forma correta de calcular a margem, ou melhor, você obtém o valor dos fundos livres na variável val após fazer um pedido, e a variávelFreeMarginCheck é o valor da margem em si.

Você tem certeza?

AccountFreeMarginCheck

Devolve a quantidade de fundos livres que restarão após a abertura da ordem especificada ao preço atual na conta corrente.


Há também aí uma sutileza:

Se o contador estiver aberto, ou seja, se houver um bloqueio completo ou incompleto na conta, a função pode dar valores incorretos.


 
Sergey Likho:

Você tem certeza?

Sim, você está certo, isso é exatamente certo:

Devolve a quantidade de fundos livresremanescentes após a abertura da ordem especificada ao preço atual na conta corrente.

sobre negócios abertos, você precisa verificar, eu não me lembro, mas o mais provável é que o que o terminal escreve, deve concordar com os dados calculados: o número total de lotes em cada direção de negócios (BAY/SELL) para todos os símbolos, em seguida, chamar para cada símbolo

AccountFreeMarginCheck() passando por lotes em cada direção e somando estes resultados

O mercado está funcionando hoje, é fácil verificá-lo, como este

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

Saudações, você poderia me dizer o que há de errado com a função? A função realiza uma pausa comercial por tempo, os parâmetros incluem o início da pausa e o final da pausa.
A função lê o tempo não do servidor do corretor, mas do computador, apesar do fato de que o TimeCurrent é prescrito. Em geral, as negociações são fechadas durante a pausa, ou seja, a função não funciona.

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

Saudações, você poderia me dizer o que há de errado com a função? A função realiza uma pausa comercial por tempo, os parâmetros são início e fim da pausa.
A função lê o tempo não do servidor do corretor, mas do computador, apesar do fato de que o TimeCurrent é prescrito. Em geral, os negócios são fechados durante uma pausa, o que significa que a função não funciona.

UnprintTimeStart eStrToTime(TimeStart);

então não imprimirTimeCurrent()

seuTimeStart não está no formato de data/hora completa, ou seja, a hora será sempre o dia, mês e ano atuais quando você executar a EA, e então ela mudará?

E globalmente ... para determinar as horas e minutos de negociação as horas e minutos devem ser comparados ao tempo de servidor de hora e minuto, você só compara o fato de que o tempo de servidor é maior do que o especificado

SZZ: para evitar confusão, você podepensar na data como uma int, que é, e comparando 2datas, você está comparando 2 int

PSPS:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

seu código provavelmente funcionará, você deve tentar dessa forma:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


Normalmente conto o tempo desta maneira:

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

e depois compará-lo com as configurações da EA

 
Igor Makanu:

Obrigado, vou tentar descobrir, sou apenas um iniciante), com && opção em vez de |||| ainda não tentei online, a propósito, no testador este código funciona, ele lê o tempo do terminal, sem fechamento de pedidos durante a pausa, mas online é diferente.

 

Olá! O terminal não começa no testador de estratégia. Eu defino a data, por exemplo (2017,04,01 a 2018,05,29), pressiono o início, ele imediatamente dá uma parada. No registro, diz o seguinte,

TestGenerator: sem dados históricos 'EURUSD30' de 2017.04.01 a 2018.05.29. E assim por diante em qualquer segmento. Meu computador está funcionando, pensei que talvez não tivesse RAM suficiente. A mesma coisa no computador de casa, reiniciar não ajuda, mas funciona por um tempo. Eu fiz o download do Expert Advisor do Mercado, trial. Se alguém souber o motivo, por favor, avise.


 
danil77783:

Olá! O terminal não começa no testador de estratégia. Eu defino a data, por exemplo (2017,04,01 a 2018,05,29), pressiono o início, ele imediatamente dá uma parada. No registro, diz o seguinte,

TestGenerator: sem dados históricos 'EURUSD30' de 2017.04.01 a 2018.05.29. E assim por diante em qualquer segmento. Meu computador está funcionando, pensei que talvez não tivesse RAM suficiente. A mesma coisa no computador de casa, reiniciar não ajuda, mas funciona por um tempo. Fiz o download do Expert Advisor do Mercado, trial. Se eu tiver alguma idéia do motivo, você pode me dar uma dica?


Acho que o testador diz que não há dados do histórico, pressione F2 e baixe o histórico, depois reinicialize o terminal

 
danil77783:

Olá! O terminal não começa no testador de estratégia. Eu defino a data, por exemplo (2017,04,01 a 2018,05,29), pressiono o início, ele imediatamente dá uma parada. No registro, diz o seguinte,

TestGenerator: sem dados históricos 'EURUSD30' de 2017.04.01 a 2018.05.29. E assim por diante em qualquer segmento. Meu computador está funcionando, pensei que talvez não tivesse RAM suficiente. A mesma coisa no computador de casa, reiniciar não ajuda, mas funciona por um tempo. Eu fiz o download do Expert Advisor do Mercado, trial. Se eu souber o motivo, por favor, avise...


Nenhum dado histórico significa alguma coisa?

 
Igor Makanu:

Acho que o testador está lhe dizendo que não há dados do histórico, pressione F2 e faça o download do histórico, depois recarregue o terminal

Obrigado! Vou tentar. A atualização do terminal o afeta de alguma forma? Seja ele atualizado ou não, embora ele mesmo o diga......