Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Появилась идея? Обсуди ее на форуме трейдеров!
Игорь
208
Игорь 2011.05.13 11:44 
С точки зрения быстродействия работы кода, при условии не однократного использования переменной, что предпочтительнее? Пример:
1-я конструкция
double l_sl = StopLoss * MarketInfo (Symbol(), MODE_POINT);
double l_tp = TakeProfit * MarketInfo (Symbol(), MODE_POINT);
2-я конструкция
// объявляем глобальную переменную
double g_point = MarketInfo (Symbol(), MODE_POINT);
-------------
double l_sl = StopLoss * g_point;
double l_tp = TakeProfit * g_point;
Просьба высказываться, если есть что сказать, приводя обоснованные аргументы.
Dmitry Fedoseev
41249
Dmitry Fedoseev 2011.05.13 11:52  

Сделайте это сами, потом расскажите:

int start=GetTickCount();

for(int i=0;i<1000000;i++) {

Здесь код 

}

Alert(GetTickCount()-start);

...Аналогично для второго варианта 
Игорь
208
Игорь 2011.05.13 12:11  
Integer:

Сделайте это сами, потом расскажите:

Вот чего не ожидал, так это такого результата...
Сделал (как и предполагалось - достойный аргумент "попробовать самому"!!!) простенькую конструкцию:
double g_point;
int StopLoss = 200;
int TakeProfit = 200;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
  int Tick1, Tick2;
  g_point = MarketInfo (Symbol(), MODE_POINT);
  Tick1 = GetTick.C();
  Tick2 = GetTick();
  Print ("Tick1 = ", Tick1, "; Tick2 = ", Tick2);
  if (Tick1 - Tick2 != 0)
  Alert ("Всё-таки есть разница ?!");
//----
   return (0);
  }
//+------------------------------------------------------------------+
int GetTick.C()
  {
  int start = GetTickCount();
  for (int i = 0; i < 1000000; i++)
  {
  double l_sl = StopLoss * MarketInfo (Symbol(), MODE_POINT);
  double l_tp = TakeProfit * MarketInfo (Symbol(), MODE_POINT);
  }
  return (GetTickCount()-start);
  }
//+------------------------------------------------------------------+
int GetTick()
  {
  int start = GetTickCount();
  for (int i = 0; i < 1000000; i++)
  {
  double l_sl = StopLoss * g_point;
  double l_tp = TakeProfit * g_point;
  }
  return (GetTickCount()-start);
  }
а вот результат принта:
2011.05.13 13:06:41     TestCount EURUSD,H1: Alert: Всё-таки есть разница ?!
2011.05.13 13:06:41     TestCount EURUSD,H1: Tick1 = 2687; Tick2 = 63
Спасибо!!!
Актер
2301
Актер 2011.05.13 12:30  
Можно вопрос? Часто ли в жизни приходится повторять какую-либо операцию по 1 миллиону раз за один тик? )
Debugger
2501
Debugger 2011.05.13 12:37  
OnGoing:
Можно вопрос? Часто ли в жизни приходится повторять какую-либо операцию по 1 миллиону раз за один тик? )


бывают такие случаи.


только есть еще один, на первый взгляд очень эффективный способ, который лежит на поверхности.

mt4trade
399
mt4trade 2011.05.13 12:39  
OnGoing:
Можно вопрос? Часто ли в жизни приходится повторять какую-либо операцию по 1 миллиону раз за один тик? )


Если код вызывается в тестере, на оптимизации, то это явно влияет на ее продолжительность.

Кстати, IgRU4ek, результат - это в тестере или скрипт? Не сравнивали там и там?

Игорь
208
Игорь 2011.05.13 12:40  
OnGoing:
Можно вопрос? Часто ли в жизни приходится повторять какую-либо операцию по 1 миллиону раз за один тик? )
Я НИКОГО не ОТ ЧЕГО не отговариваю, и тем более ни ЗА ЧТО не агитирую. Мне полученного результат вполне достаточно, чтобы сделать выводы!
Игорь
208
Игорь 2011.05.13 12:42  
mt4trade:


Если код вызывается в тестере, на оптимизации, то это явно влияет на ее продолжительность.

Кстати, IgRU4ek, результат - это в тестере или скрипт? Не сравнивали там и там?

Это скрипт. Ради спортивного интереса не мешало бы и в тестере проверить - СОГЛАСЕН!
Игорь
208
Игорь 2011.05.13 12:43  
Debugger:


бывают такие случаи.
только есть еще один, на первый взгляд очень эффективный способ, который лежит на поверхности.

По-подробнее, если не секрет...
Игорь
208
Игорь 2011.05.13 12:50  
Немножко усложнил конструкцию:
double g_point;
int StopLoss = 200;
int TakeProfit = 200;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
  int cnt, a_Tick[3], rez = 100000000;
  string txt, a_res[] = {"Tick1","Tick2","Tick3"};
  g_point = MarketInfo (Symbol(), MODE_POINT);
  a_Tick[0] = GetTick.C();
  a_Tick[1] = GetTick.C2();
  a_Tick[2] = GetTick();
  for (int j = 0; j < 3; j++)
    {
    if (rez > a_Tick[j])
       {
       rez = a_Tick[j];
       cnt = j;
       }
    txt = StringConcatenate (txt, a_res[j], " = ", a_Tick[j], "; ");
    }
    Print (txt);
  Alert ("Наменьший результат ", a_res[cnt], " ?!");
//----
   return (0);
  }
//+------------------------------------------------------------------+
int GetTick.C()
  {
  int start = GetTickCount();
  for (int i = 0; i < 1000000; i++)
  {
    double l_sl = StopLoss * MarketInfo (Symbol(), MODE_POINT);
    double l_tp = TakeProfit * MarketInfo (Symbol(), MODE_POINT);
  }
  return (GetTickCount()-start);
  }
//+------------------------------------------------------------------+
int GetTick.C2()
  {
  int start = GetTickCount();
  for (int i = 0; i < 1000000; i++)
  {
    double l_sl = StopLoss * Point;
    double l_tp = TakeProfit * Point;
  }
  return (GetTickCount()-start);
  }
//+------------------------------------------------------------------+
int GetTick()
  {
  int start = GetTickCount();
  for (int i = 0; i < 1000000; i++)
  {
    double l_sl = StopLoss * g_point;
    double l_tp = TakeProfit * g_point;
  }
  return (GetTickCount()-start);
  }
и проверил в тестере:
13:45:19 2011.01.03 00:00  TestCount USDCHF,M15: Tick1 = 813; Tick2 = 31; Tick3 = 31; 
13:45:19 2011.01.03 00:00  TestCount USDCHF,M15: Alert: Наменьший результат Tick2 ?!
13:45:20 2011.01.03 00:15  TestCount USDCHF,M15: Tick1 = 890; Tick2 = 47; Tick3 = 31; 
13:45:20 2011.01.03 00:15  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:22 2011.01.03 00:30  TestCount USDCHF,M15: Tick1 = 813; Tick2 = 31; Tick3 = 15; 
13:45:22 2011.01.03 00:30  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:23 2011.01.03 00:45  TestCount USDCHF,M15: Tick1 = 828; Tick2 = 47; Tick3 = 31; 
13:45:23 2011.01.03 00:45  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:25 2011.01.03 01:00  TestCount USDCHF,M15: Tick1 = 843; Tick2 = 32; Tick3 = 31; 
13:45:25 2011.01.03 01:00  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:26 2011.01.03 01:15  TestCount USDCHF,M15: Tick1 = 844; Tick2 = 31; Tick3 = 31; 
13:45:26 2011.01.03 01:15  TestCount USDCHF,M15: Alert: Наменьший результат Tick2 ?!
13:45:28 2011.01.03 01:30  TestCount USDCHF,M15: Tick1 = 844; Tick2 = 31; Tick3 = 16; 
13:45:28 2011.01.03 01:30  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:29 2011.01.03 01:45  TestCount USDCHF,M15: Tick1 = 797; Tick2 = 15; Tick3 = 31; 
13:45:29 2011.01.03 01:45  TestCount USDCHF,M15: Alert: Наменьший результат Tick2 ?!
13:45:31 2011.01.03 02:00  TestCount USDCHF,M15: Tick1 = 921; Tick2 = 32; Tick3 = 31; 
13:45:31 2011.01.03 02:00  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:32 2011.01.03 02:15  TestCount USDCHF,M15: Tick1 = 766; Tick2 = 47; Tick3 = 15; 
13:45:32 2011.01.03 02:15  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:33 2011.01.03 02:30  TestCount USDCHF,M15: Tick1 = 937; Tick2 = 32; Tick3 = 31; 
13:45:33 2011.01.03 02:30  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
13:45:35 2011.01.03 02:45  TestCount USDCHF,M15: Tick1 = 922; Tick2 = 31; Tick3 = 31; 
13:45:35 2011.01.03 02:45  TestCount USDCHF,M15: Alert: Наменьший результат Tick2 ?!
13:45:37 2011.01.03 03:00  TestCount USDCHF,M15: Tick1 = 968; Tick2 = 32; Tick3 = 31; 
13:45:37 2011.01.03 03:00  TestCount USDCHF,M15: Alert: Наменьший результат Tick3 ?!
Я в данном вопросе сориентировался!
Актер
2301
Актер 2011.05.13 12:53  
mt4trade:


Если код вызывается в тестере, на оптимизации, то это явно влияет на ее продолжительность.

Кстати, IgRU4ek, результат - это в тестере или скрипт? Не сравнивали там и там?

Если даже период тестирования 10 лет, то миллион транзакций (изм. т/п или с/л) за этот период - это круто) Такой грааль ни один брокер не погладит по головке)

Да и есть обратная пропорция, если уж пошли считать миллисекунды. При увеличении кол-ва глобальных переменных, происходит пропорциональное увеличение выделяемой памяти, что также сказывается на производительности системы в целом.

PS: При всем при этом, стиль использования переменных конечно более изящен, не спорю.

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий