Скачать MetaTrader 5

ФОРТС счётчик транзакций

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

Добрый день!

У меня в терминале одновременно работают 25 советников,

которые используют один счётчик транзакций, реализованный на глобальной переменной:

//+------------------------------------------------------------------+
//| Expert Set transaction count function                            |
//+------------------------------------------------------------------+
void SetTransCount()
{
  if ( GlobalVariableCheck( "trans_count" ) )
  {
    double tr_count = GlobalVariableGet( "trans_count" );
    
    tr_count++;
    GlobalVariableSet( "trans_count", tr_count ); 
  }
  else
  {
    GlobalVariableSet( "trans_count", 1 );
  }
}

 Сравнивая список заявок в Квике со свом счётчиком, я обнаружил

достаточно большое расхождение в колличестве тразакций.

 Вероятно несколько советников одновременно обращаются к этой переменной.

Может быть уже кто-то это делал?

Поделитесь опытом, пожалуйста.

o_o
Модератор
24190
o_o  
GlobalVariableSetOnCondition
Mikhail Filimonov
5931
Mikhail Filimonov  

Устанавливает новое значение существующей глобальной переменной, если текущее значение переменной равно значению третьего параметра check_value.

Если переменной не существует, функция сгенерирует ошибку ERR_GLOBALVARIABLE_NOT_FOUND (4501) и вернет false.

И как это поможет? 

Sergey Gridnev
5288
Sergey Gridnev  
Mikalas:

Устанавливает новое значение существующей глобальной переменной, если текущее значение переменной равно значению третьего параметра check_value.

Если переменной не существует, функция сгенерирует ошибку ERR_GLOBALVARIABLE_NOT_FOUND (4501) и вернет false.

И как это поможет? 

 

Попробуйте такую конструкцию:

    double tr_count = GlobalVariableGet( "trans_count" );
    
    GlobalVariableSetOnCondition( "trans_count", tr_count+1, tr_count ); 


PS. Ну, и возвращаемый результат придётся проверять.

o_o
Модератор
24190
o_o  
Mikalas:

И как это поможет? 

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

Contender

Проблема не в том, что функция SetTransCount()

не работает, а в том, что к глобальной переменной обращаются

обновременно несколько советников.  

Mikhail Filimonov
5931
Mikhail Filimonov  
sergeev:
Функция обеспечивает атомарный доступ к глобальной переменной, поэтому она может быть использована для организации мьютекса при взаимодействии нескольких одновременно работающих экспертов в пределах одного клиентского терминала.

Спасибо.

Sergey Gridnev
5288
Sergey Gridnev  
Mikalas:

Contender

Проблема не в том, что функция SetTransCount()

не работает, а в том, что к глобальной переменной обращаются

обновременно несколько советников.  

Вы попробовали сделать как я написал?

Функция GlobalVariableSetOnCondition атомарна.

Sergey Gridnev
5288
Sergey Gridnev  
Mikalas:

А почему этого не написано в хелпе?

Не в том хелпе ищете ;)

https://www.mql5.com/ru/docs/globals/globalvariablesetoncondition 

Документация по MQL5: Глобальные переменные терминала / GlobalVariableSetOnCondition
Документация по MQL5: Глобальные переменные терминала / GlobalVariableSetOnCondition
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableSetOnCondition - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Mikhail Filimonov
5931
Mikhail Filimonov  
Спасибо ( в примечании )
Mikhail Filimonov
5931
Mikhail Filimonov  

Не очень красиво, но работает.

//+------------------------------------------------------------------+
//| Expert Set transaction count function                            |
//+------------------------------------------------------------------+
void SetTransCount()
{
  double tr_count;
  uint i = 0;
  
  do
  {
    i++;
    if ( GlobalVariableGet( "trans_count", tr_count ) )
    {
      if ( GlobalVariableSetOnCondition( "trans_count", tr_count + 1, tr_count ) )
      {
        i = 100;
      }
    }
  }  
  while( i < 100 );
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий