Aprender e escrever juntos em MQL5 - página 13

 
Yedelkin:

Estranho. É necessário o código para MQL5, que já deve estar no sítio web. Tudo o que tem de fazer é pesquisar. É exactamente disso que estou a falar.

Mas isso depende de si.

É uma busca muito aborrecida, talvez alguém lhe diga.

A propósito, refiz este código para mql5. Talvez alguém o possa usar.

input double risk=0.01;
   double lot_min =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double lot_max =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double lot_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double contract=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   double lot;
   
     lot=NormalizeDouble(free_margin*risk*leverage/contract,2);
     lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
 
Cavalheiros.
por favor comente:

ENUM_TRADE_RETURN_CODES
Código ID Descrição
10004 TRADE_RETCODE_REQUOTE Pedido rejeitado
10006 TRADE_RETCODE_REJECT Pedido rejeitado
...
sem código 10005. Não será isto um erro?
Respeitosamente ...
 

Pergunta. Existe uma função chamada GetTickCount () - devolve o número de milissegundos decorridos desde o início do sistema. A nota diz que "a contagem é limitada pela resolução do temporizador do sistema ".Uma vez que o tempo é armazenado como um inteiro não assinado, ele transborda a cada 49,7 dias quando o computador está em funcionamento contínuo".

E o que acontece depois de o balcão transbordar? Reinicia e inicia uma nova contagem decrescente, ou o sistema congela?

 

Yedelkin:

O que acontece quando o contador transborda? Reinicia e inicia uma nova contagem ou o sistema pára?

Sobreflui e começa do zero.
 
Renat:
Sobreflui e começa do zero.
OK, já está!
 

Pergunta. A descrição do interruptor (expressão){...} diz que "a expressão do operador do interruptor deve ser do tipo inteiro". Já vi a descrição deste operador com expressões de outros tipos na Internet. O uso do operador de comutação será alargado através da adição de expressões do tipo string?

 
Yedelkin:

Pergunta. A descrição do interruptor (expressão){...} diz que "a expressão do operador do interruptor deve ser do tipo inteiro". Já vi a descrição deste operador com expressões de outros tipos na Internet. Vamos alargar o uso do operador de comutação adicionando expressões do tipo string?

Não, infelizmente, não o fará. Para tipos de cordas apenas se ... senão, se ... senão .

A utilização de tipos inteiros no interruptor irá acelerar o operador do interruptor várias vezes mais do que se

Документация по MQL5: Основы языка / Типы данных / Целые типы
Документация по MQL5: Основы языка / Типы данных / Целые типы
  • www.mql5.com
Основы языка / Типы данных / Целые типы - Документация по MQL5
 
stringo:

Não, infelizmente não o fará. Para tipos de cordas apenas se ... senão, se ... senão

A utilização de tipos inteiros no interruptor acelerará o código várias vezes mais do que se

OK, obrigado pela dica!
 

Pergunta. A descrição da função StringConcatenate() diz que "StringConcatenate() funciona mais rapidamente e mais económico na memória do que a ligação de cordas através de operações de adição devido ao facto de não serem utilizadas variáveis temporárias de tipo string". Utilizei os exemplos do Manual de Referência, alterando-os ligeiramente:

   string a="a",b="b",c;
   uint   start,stop;
   long   i,length=10000000;
//--- первый способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);


//--- второй способ
   a="a"; // заново инициализируем переменную a
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(a,b);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);

//--- третий способ
   a="a";c="";  
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      int k=StringConcatenate(c,a,b);
      //c="";   //с такой строчкой работает ещё дольше.          
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
A produção é:

DR 0 DoubleToString (EURGBP,M1) 22:15:55  time for 'c = a + b'              = 2359 milliseconds, i = 10000000
QE 0 DoubleToString (EURGBP,M1) 22:15:56  time for 'StringAdd(a,b)'          = 1031 milliseconds, i = 10000000
FE 0 DoubleToString (EURGBP,M1) 22:16:00  time for 'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000

Acontece que o StringConcatenate funciona mais lentamente do que a encadernação de cordas usando operações de adição. Qual é o problema?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Yedelkin:

Pergunta. A descrição da função StringConcatenate() diz que "StringConcatenate() funciona mais rapidamente e mais económico na memória do que a ligação de cordas através de operações de adição devido ao facto de não serem utilizadas variáveis temporárias de tipo string". Utilizei exemplos da Referência, alterando-os um pouco:

Consegui a produção:

Acontece que o StringConcatenate funciona mais lentamente do que a encadernação de cordas usando operações de adição. Qual é o problema?

É um pouco errado verificar (se o entendi correctamente). O truque da função é outra coisa...

Aproximadamente este código

////////////////////////////////////////////////////////////////////////////////
//             Global variables, used in working the trade system             //
////////////////////////////////////////////////////////////////////////////////
string a="Пример";
double b=1.26,c = 1.27;
string d;

uint   start,stop;

long   i,length=10000000;
////////////////////////////////////////////////////////////////////////////////
void OnStart()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

start=GetTickCount();
   
  for(i=0;i<length;i++)
  {
  d=a+(string)b+(string)c;
  }

stop=GetTickCount();

Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  StringAdd(d,a);
  StringAdd(d,(string)b);
  StringAdd(d,(string)c);
  }
stop=GetTickCount();

Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  int k=StringConcatenate(d,a,b,c);
  }

stop=GetTickCount();

Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

E este resultado

2011.04.15 15:28:58     123 (EURUSD,D1) time for 'd = a + b + c' = 81094 milliseconds, i = 10000000
2011.04.15 15:30:24     123 (EURUSD,D1) time for 'StringAdd()' = 85828 milliseconds, i = 10000000
2011.04.15 15:31:46     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 10000000
2011.04.15 15:33:36     123 (EURUSD,D1) time for 'd = a + b + c' = 82938 milliseconds, i = 10000000
2011.04.15 15:35:00     123 (EURUSD,D1) time for 'StringAdd()' = 83859 milliseconds, i = 10000000
2011.04.15 15:36:21     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000

PS

Muito provavelmente, a linha d= "" deveria ter sido colocada na linha de "for loop", mas não creio que este bug tenha muito efeito no resultado.

Razão: