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

fxsaber
16223
fxsaber  
Artyom Trishkin:

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

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

Artyom Trishkin
Модератор
49626
Artyom Trishkin  
fxsaber:

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

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

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

fxsaber
16223
fxsaber  
Artyom Trishkin:

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

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

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

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

Artyom Trishkin
Модератор
49626
Artyom Trishkin  
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;
     }
//---
fxsaber
16223
fxsaber  
Artyom Trishkin:

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

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

Alexey Navoykov
4552
Alexey Navoykov  

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

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

Alexey Kozitsyn
8489
Alexey Kozitsyn  

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

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

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

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

fxsaber
16223
fxsaber  

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));
}
fxsaber
16223
fxsaber  
На английской части форума показали
// Обмен значениями между двумя числовыми переменными
#define SWAP(A, B) { A += B; B = A - B; A -= B; }
TheXpert
18189
TheXpert  
fxsaber:
На английской части форума показали

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