ФОРТС Глобальная переменная - страница 2

 

Пробовал

Не помогло 

В DeInit делал GlobalVariablesFlush();

Тоже мимо 

 
Неужели больше ни у кого нет Демо Открытия?
 
Mikalas:
Неужели больше ни у кого нет Демо Открытия?
У меня есть.   Как глянул эту ветку - решил повременить с использованием глобальных переменных  - как альтернативу им,  использую запись в текстовые файлы. 
 

Глобальные переменные при старте терминала благополучно обнуляются. Недочёты программирования не стоит перекладывать на платформу.

Надеюсь, что код ниже убедит Вас в необоснованности обвинения терминала:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   trans_count=0;

//--- Установка таймера
   if(!EventSetMillisecondTimer(TimerTime))
     {
      MessageBox("Таймер не установлен!","Ошибка",MB_OK|MB_ICONHAND);
      return( INIT_FAILED );
     }

//---
   if(!GlobalVariableCheck("trans_count"))
     {
      datetime a_time=GlobalVariableSet("trans_count",0);

      if(ulong(a_time)==0)
        {
         MessageBox("Глобальная переменная терминала 'Счётчик транзакций' не создана!","Ошибка",MB_OK|MB_ICONHAND);
         return( INIT_FAILED );
        }
     }

   if(GlobalVariableSet(_Symbol,0))
      Print("Глобальная переменная ",_Symbol," =0");
   else
     {
      MessageBox("Глобальную переменную не удалось обнулить","Ошибка обнуления",0);
      return(INIT_FAILED);
     }

//---  
   return( INIT_SUCCEEDED );
  }
 
barabashkakvn:

Глобальные переменные при старте терминала благополучно обнуляются. Недочёты программирования не стоит перекладывать на платформу.

Надеюсь, что код ниже убедит Вас в необоснованности обвинения терминала:

Нет, не убедит.

Вы путаете переменные. 

'trans_count" и "_Symbol" 

 

З.ы И давайте я Вас поучу программированию:

datetime  GlobalVariableSet(
   string  name,      // имя
   double  value      // устанавлимое значение
   );

 Возвращаемое значение не BOOL а DATETIME

 
Mikalas:

Нет, не убедит.

Вы путаете переменные. 

'trans_count" и "_Symbol" 

 

З.ы И давайте я Вас поучу программированию:

 Возвращаемое значение не BOOL а DATETIME

Улыбнуло. Чтобы утверждать про обнуление или необнуление - позаботьтесь о проверках: 

//+------------------------------------------------------------------+
//|                                                  Global_demo.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Mikalas"
#property link      "http://www.mql5.com"
#property version   "1.00"
//
input int TimerTime=1000;   //Период таймера
                            //
ulong   trans_count;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   trans_count=0;

//--- Установка таймера
   if(!EventSetMillisecondTimer(TimerTime))
     {
      MessageBox("Таймер не установлен!","Ошибка",MB_OK|MB_ICONHAND);
      return( INIT_FAILED );
     }

//---
   if(!GlobalVariableCheck("trans_count"))
     {
      datetime a_time=GlobalVariableSet("trans_count",0);

      if(ulong(a_time)==0)
        {
         MessageBox("Глобальная переменная терминала 'Счётчик транзакций' не создана!","Ошибка",MB_OK|MB_ICONHAND);
         return( INIT_FAILED );
        }
     }

   if(GlobalVariableSet(_Symbol,0))
      Print("Глобальная переменная ",_Symbol," =0");
   else
     {
      MessageBox("Глобальную переменную не удалось обнулить","Ошибка обнуления",0);
      return(INIT_FAILED);
     }
//--- получим значение гл. пер. trans_count
   Print("Гл. перем. trans_count = ",GlobalVariableGet("trans_count"));

//---  
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- удаление таймера
   EventKillTimer();
//---
   if(GlobalVariableCheck(_Symbol))
     {
      if(!GlobalVariableDel(_Symbol))
         MessageBox("С символа гл. перем. не удалена",_Symbol,0);
     }
//--- получим значение гл. пер. trans_count
   double tmp=GlobalVariableGet("trans_count");
   string str_temp="Глобальная переменная trans_count = "+DoubleToString(tmp,0);
   MessageBox("Закрываем терминал",str_temp,0);
  }
//+------------------------------------------------------------------+
//| Expert Set transaction count function                            |
//+------------------------------------------------------------------+
void SetTransCount(const bool up_down)
  {
   double tr_count;
   uint i=0;

   do
     {
      i++;
      if(GlobalVariableGet("trans_count",tr_count))
        {
         if(up_down)
           {
            if(GlobalVariableSetOnCondition("trans_count",tr_count+1,tr_count))
              {
               i=100;
              }
           }
         else
           {
            if(GlobalVariableSetOnCondition("trans_count",tr_count-1,tr_count))
              {
               i=100;
              }
           }
        }
     }
   while(i<100);
  }
//+------------------------------------------------------------------+
//| Expert timer function                                            |
//+------------------------------------------------------------------+
void OnTimer()
  {
// debug
   Comment("trans_count=",trans_count);
   if(trans_count<2000)
     {
      trans_count++;
      SetTransCount(true);
      ResetLastError();
      GlobalVariableSet(_Symbol,double(trans_count));
     }
  }

//+------------------------------------------------------------------+
//| The END                                                          |
//+------------------------------------------------------------------+

 Теперь хорошо будет видно, что происходит с переменной глобальной при закрытии и при старте. Желающие могут проверить на х32 и х64 системах.

 
barabashkakvn:

Улыбнуло. Чтобы утверждать про обнуление или необнуление - позаботьтесь о проверках: 

 Теперь хорошо будет видно, что происходит с переменной глобальной при закрытии и при старте. Желающие могут проверить на х32 и х64 системах.

Пожалуйста, не втягивайте меня в полемику о коде....

И я улыбаюсь больше, чем Вы!  

 

А теперь, вместо миллисекундного таймера делаем обычный посекундный таймер. Отключаем проблемную функцию SetTransCount() и в событии таймера просто увеличиваем глобальную переменную "trans_count". В итоге когда алгоритм простой и понятный - глобальные переменные работают, так как им и положено.

//+------------------------------------------------------------------+
//|                                                  Global_demo.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Mikalas"
#property link      "http://www.mql5.com"
#property version   "1.00"
//
input int TimerTime=10;   //Период таймера
                            //
ulong   trans_count;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   trans_count=0;

//--- Установка таймера
   if(!EventSetTimer(TimerTime))
     {
      MessageBox("Таймер не установлен!","Ошибка",MB_OK|MB_ICONHAND);
      return( INIT_FAILED );
     }

//---
   if(!GlobalVariableCheck("trans_count"))
     {
      datetime a_time=GlobalVariableSet("trans_count",0);

      if(ulong(a_time)==0)
        {
         MessageBox("Глобальная переменная терминала 'Счётчик транзакций' не создана!","Ошибка",MB_OK|MB_ICONHAND);
         return( INIT_FAILED );
        }
     }

   if(GlobalVariableSet(_Symbol,0))
      Print("Глобальная переменная ",_Symbol," =0");
   else
     {
      MessageBox("Глобальную переменную не удалось обнулить","Ошибка обнуления",0);
      return(INIT_FAILED);
     }
//--- получим значение гл. пер. trans_count
   Print("Гл. перем. trans_count = ",GlobalVariableGet("trans_count"));

//---  
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- удаление таймера
   EventKillTimer();
//---
   if(GlobalVariableCheck(_Symbol))
     {
      if(!GlobalVariableDel(_Symbol))
         MessageBox("С символа гл. перем. не удалена",_Symbol,0);
     }
//--- получим значение гл. пер. trans_count
   double tmp=GlobalVariableGet("trans_count");
   string str_temp="Глобальная переменная trans_count = "+DoubleToString(tmp,0);
   MessageBox("Закрываем терминал",str_temp,0);
  }
//+------------------------------------------------------------------+
//| Expert Set transaction count function                            |
//+------------------------------------------------------------------+
void SetTransCount(const bool up_down)
  {
   double tr_count;
   uint i=0;

   do
     {
      i++;
      if(GlobalVariableGet("trans_count",tr_count))
        {
         if(up_down)
           {
            if(GlobalVariableSetOnCondition("trans_count",tr_count+1,tr_count))
              {
               i=100;
              }
           }
         else
           {
            if(GlobalVariableSetOnCondition("trans_count",tr_count-1,tr_count))
              {
               i=100;
              }
           }
        }
     }
   while(i<100);
  }
//+------------------------------------------------------------------+
//| Expert timer function                                            |
//+------------------------------------------------------------------+
void OnTimer()
  {
// debug
   Comment("переменная (не гл. перем. терминала) trans_count=",trans_count);
   if(trans_count<2000)
     {
      trans_count++;
      //SetTransCount(true);
      ResetLastError();
      GlobalVariableSet(_Symbol,double(trans_count));
      GlobalVariableSet("trans_count",trans_count);
     }
  }

//+------------------------------------------------------------------+
//| The END                                                          |
//+------------------------------------------------------------------+
 

Владимир!

Не выставляйте себя "дурном свете"!

Вы не понимаете о чём идёт речь.

Почему Вы не слушаете дружеские советы и просьбы? 

 
Mikalas:
Попробуйте "ручками" создать глобальную переменную, закрыть терминал и затем посмотреть - файл с глобальными переменными. Есть ли там новая переменная?
Причина обращения: