Изучаем и пишем вместе на MQL5 - страница 13

 
Yedelkin:

 

Странно. Вам нужен код на MQL5, который уже должен быть на сайте. Стоит только поискать. Именно об этом речь.

Впрочем, дело Ваше. 

поиск очень утомителен, просто может, кто то сходу может сказать.

Я кстати переделал этот код на mql5. Может, кому-нибудь пригодится

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;
 
Господа.
прошу прокомментировать:

ENUM_TRADE_RETURN_CODES
Код     Идентификатор                  Описание 
10004 TRADE_RETCODE_REQUOTE Реквота
10006 TRADE_RETCODE_REJECT    Запрос отвергнут
...
нет кода 10005. Не ошибка ли это?
С уважением...
 

Вопрос. Есть такая функция GetTickCount () - возвращает количество миллисекунд, прошедших с момента старта системы. В примечании сказано, что "счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера".

А что происходит после переполнения счётчика? Он обнуляется и начинает новый отсчет, или же система стопорится?  

 

Yedelkin:

А что происходит после переполнения счётчика? Он обнуляется и начинает новый отсчет, или же система стопорится?  

Переполняется и начинает с нуля.
 
Renat:
Переполняется и начинает с нуля.
ОК, понял!
 

Вопрос. В описании оператора switch(выражение){...} сказано, что "выражение оператора switch должно быть целого  типа". В интернете встречал описание этого оператора с выражениями других типов. Будет ли расширено применение оператора switch путем добавления выражений строкового типа?

 
Yedelkin:

Вопрос. В описании оператора switch(выражение){...} сказано, что "выражение оператора switch должно быть целого  типа". В интернете встречал описание этого оператора с выражениями других типов. Будет ли расширено применение оператора switch путем добавления выражений строкового типа?

Нет, к сожалению не будет. Для строковых типов только if ... else if ... else

За счёт использования целых типов в switch достигается нескольки кратное ускорение по сравнению с if 

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

Нет, к сожалению не будет. Для строковых типов только if ... else if ... else

За счёт использования целых типов в switch достигается нескольки кратное ускорение по сравнению с if 

ОК, спасибо за подсказку!
 

Вопрос. В описании функции StringConcatenate() сказано, что "функция StringConcatenate() работает быстрее и экономнее по памяти, чем связывание строк при помощи операций сложения за счет того, что не используются временные переменные типа string". Воспользовался примерами из Справочника, чуть изменив их:

   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);
На выходе получил:

 

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

 Получилось, что StringConcatenate работает медленнее, чем связывание строк при помощи операций сложения. В  чём загвоздка?

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

Вопрос. В описании функции StringConcatenate() сказано, что "функция StringConcatenate() работает быстрее и экономнее по памяти, чем связывание строк при помощи операций сложения за счет того, что не используются временные переменные типа string". Воспользовался примерами из Справочника, чуть изменив их:

На выходе получил:

 Получилось, что StringConcatenate работает медленнее, чем связывание строк при помощи операций сложения. В  чём загвоздка?

Немного не так нужно проверять (если я все правильно понимаю). Фишка функции в другом...

Примерно такой код

////////////////////////////////////////////////////////////////////////////////
//             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);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

А такой результат

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

Скорей всего строчку d= "" нужно было поместить в цикл for, но думается мне косяк этот не очень влияет на результат.

Причина обращения: