Особенности языка mql5, тонкости и приёмы работы - страница 97

 
Artyom Trishkin:

Так вроде как было уже решение в КБ:

Но не для скрипта. Да и для советника довольно тяжко, т.к. предлагается вылетать из OnTick при неопределенной ситуации. А эта ситуация может случиться где-то глубоко в потрохах советника. И мало того, что оттуда надо будет выбираться, чтобы выйти по итогу из OnTick, так еще там может понадобиться открыть сразу, например, две позиции (а-ля корзина). Но при этом вторую открывать только в случае, если успешно открылась первая. При таком раскладе вылетать из OnTick после первого же OrderSend, мягко говоря, плохо.

 
fxsaber:

Но не для скрипта. Да и для советника довольно тяжко, т.к. предлагается вылетать из OnTick при неопределенной ситуации. А это ситуацию может случиться где-то глубоко в потрохах советника. И мало того, что оттуда надо будет выбираться, чтобы выйти по итогу из OnTick, так еще там может понадобиться открыть сразу, например, две позиции (а-ля корзина). Но при этом вторую открывать только в случае, если успешно завершилась первая. При таком раскладе вылетать из OnTick после первого же OrderSend, мягко говоря, плохо.

Скрипт можно тормознуть до явного получения количества позиций.

Советник... В советнике придётся учитывать сиё в логике функции открытия позиций - они вызываются из советника с возвратом результата своей работы. Резёльтат при наличии маркет-ордера возвращается false. И далее советник работает по заложенной в него логике. Да, согласен, в некоторые уже готовые сложнее внедрить, чем сразу учитывать такую вероятность. Но ветка для того и существует здесь - для чтобы другие знали и использовали знания.

 
Artyom Trishkin:

Скрипт можно тормознуть до явного получения количества позиций.

Можно тормознуть и советник.

Советник... В советнике придётся учитывать сиё в логике функции открытия позиций - они вызываются из советника с возвратом результата своей работы. Резёльтат при наличии маркет-ордера возвращается false. И далее советник работает по заложенной в него логике. Да, согласен, в некоторые уже готовые сложнее внедрить, чем сразу учитывать такую вероятность. Но ветка для того и существует здесь - для чтобы другие знали и использовали знания.

Надо просто подождать немного до момента, когда пройдет сделка. Выходить из ТС до следующего тика - жуткое решение.

 
fxsaber:

Можно тормознуть и советник.

Надо просто подождать немного до момента, когда пройдет сделка. Выходить из ТС до следующего тика - жуткое решение.

Ну в том коде как раз и выполнено ожидание на заданное время. Но нельзя же часами ожидать - ждёт некоторое время заданное количество попыток получения валидного окружения, потом выходит с результатом. Иначе, если долго ждать, то торговое окружение может сильно измениться, и уже поздно будет пить боржоми :)

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---
 
Artyom Trishkin:

Ну в том коде как раз и выполнено ожидание на заданное время. Но нельзя же часами ожидать - ждёт некоторое время заданное количество попыток получения валидного окружения, потом выходит с результатом. Иначе, если долго ждать, то торговое окружение может сильно измениться, и уже поздно будет пить боржоми :)

Да, я не заметил ожидания. Годится. Тогда был куда внимательнее...

 

Имхо, ориентироваться на PositionsTotal() - это в любом случае неправильное решение.  В процессе обработки твоего запроса могла открыться/закрыться другая позиция на счёте, например если работают несколько советников.  Что мешает проверять ответ от сервера, как оно и задумано разработчиками?

Фактически я вообще не вижу особого смысла в PositionsTotal кроме как для общего контроля.  Советник должен чётко контролировать тикеты своих позиций и работать только по ним.

 

После использования ChartIndicatorGet() обязательно должна быть вызвана функция IndicatorRelease(handle). Об этом написано в примере к функции ChartIndicatorGet(), но нет в примечании к функции! Разработчики хотели поправить документацию, но так этого и не сделали. В связи с закрытием СД, возможно, этого так и не будет сделано.

Лично сталкивался с проблемой "повисшего" индикатора. Из разговора с СД:

А, т.е. когда я запустил на чарте индикатор Х, он перебрал все индикаторы и обнаружил с помощью функции ChartIndicatorGet() копию - произвел инкремент счетчика. Дальше, я удалил первый индикатор Х - декремент счетчика, а про второй, по сути, забыл - получил "повисший" индикатор, т.к. его хэндл остался неочищенным?

Да. Именно так и получается. Поэтому OnDeinit не отрабатывает.

 

Forum on trading, automated trading systems and testing trading strategies

How to import historical data into csv to symbol custom using CustomRatesUpdate?

fxsaber, 2018.08.19 12:01

// Sets the maximum size of an array.
template <typename T>
int ArrayResize( T &Array[] )
{
  int MinSize = ArraySize(Array);
  int MaxSize = INT_MAX;
  int AvgSize;
  
  while ((MinSize < MaxSize - 1) && !IsStopped())
  {
    AvgSize = (int)((MinSize + (long)MaxSize) >> 1);        
    
//    ArrayFree(Array);
    
    if (ArrayResize(Array, (int)AvgSize) == AvgSize)
      MinSize = AvgSize;
    else
      MaxSize = AvgSize;
  }
  
  return(ArrayResize(Array, MinSize));
}
 
На английской части форума показали
// Обмен значениями между двумя числовыми переменными
#define SWAP(A, B) { A += B; B = A - B; A -= B; }
 
fxsaber:
На английской части форума показали

а смысл? сэкономить пару байт памяти? тем более с double получатся другие числа (== будет false) а у целых может быть переполнение

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