Полезные функции от KimIV - страница 31

 
ShestkoFF писал (а) >>
Ну блокировать я бы конечно не стал. Я бы передал наверх эту ошибку и уже там решал, что с ней делать.

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

:-) вот Вы сами и ответили на свой вопрос о длительной паузе. Она делается для того, чтобы переждать время действия сигнала на открытие позиции или установку ордера.

Благодарю Вас, Василий, ещё раз за успешное сбивание меня с пути истинного. Я уж чуть было не бросился исправлять коды... И ещё раз благодарю, что обратно на свою дорогу меня вернули :-)

 
KimIV писал (а) >>

:-) вот Вы сами и ответили на свой вопрос о длительной паузе. Она делается для того, чтобы переждать время действия сигнала на открытие позиции или установку ордера.

Благодарю Вас, Василий, ещё раз за успешное сбивание меня с пути истинного. Я уж чуть было не бросился исправлять коды... И ещё раз благодарю, что обратно на свою дорогу меня вернули :-)

Если честно, то не понял логики.
Ну например выставили мы ордер на 0.000001 лота. Нам сервер ессессено за это по рукам.
А мы вместо того, чтобы поменять лот(снаружи функции), делаем паузу.
В результате этой паузы действительно может пропасть сигнал на установку ордера, но должны то мы сменить лот, а не ждать.
Поэтому тут я не согласен насчет паузы. Надо просто выходить из этой функции и наверх передавать код ошибки и уже там его обрабатывать.
Если пойти по моему пути - то возможно мы не пропустим профитную сделку!!! А можем и лося поймать :)

PS: Я таки собью вас с пути неистинного :)

 
а мне казалось, нужно сразу вызывать функцию расчета лота (а не выходить на верх), выход на верх только после переполнения счетчика ошибок
 
Prival писал (а) >>
а мне казалось, нужно сразу вызывать функцию расчета лота (а не выходить на верх), выход на верх только после переполнения счетчика ошибок

Да конечно нужно сразу вызывать эту функцию, но если все же произошла ошибка!!!
Выходом наверх я называю ситуацию когда надо выйти из функции SetOrder.
Я вижу себе это примерно так:


int ticket = SetOrder(.....);

if (ticket > 0) {

// all ok

} else {

// correct logic error

}


int SetOrder(....) // возвращает либо тикет, либо номер ошибки только с отрицательным знаком.
{

int ticket = OrderSend(....)

if (ticket < 0) {

// correct set order errors

}

}


Т.е я считаю нужно разделять ошибки логики от ошибок установки ордера. Надеюсь сегодня я приведу пример реализации.
 
ShestkoFF писал (а) >>
Если честно, то не понял логики.

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

ShestkoFF писал (а) >>
Ну например выставили мы ордер на 0.000001 лота. Нам сервер ессессено за это по рукам.

А почему мы это сделали? Почему мы намеренно стали передавать неверный размер лота? Чем мы можем оправдать такое своё поведение?

ShestkoFF писал (а) >>

Надо просто выходить из этой функции и наверх передавать код ошибки и уже там его обрабатывать.

Что нам это даст? Получим другой размер лота? А почему сразу не получили правильный размер лота? Назовите причины. Давайте проанализируем...
 

Просто я считаю, что ваша функция - это библиотечная функция, т.е универсальная, и поэтому нужно разделять все ошибки на 2 категории:

  • ошибки которые нужно обрабатывать внутри функции SetOrder(ошибки соединения, реквоты...)
  • ошибки которые нужно обрабатывать снаружи функции SetOrder(неправильный размер лота, неправильные стопы...)

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

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

блок проверки ошибок.

Вот такое вот у меня видение этого дела :) Как уже писал выше надеюсь сегодня приведу пример реализации.

 

Мой вариант моды:



int ModeInt(int array[])
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid parameter in function ModeInt(int array[]). It should be at least one element.");
      return(0);
   }
   
   int buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   int maxValue = 0;
   
   int startIndex = 0;
   int startValue = buffer[0];
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] > startValue)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = buffer[startIndex];
         }
         
         startIndex = i;
         startValue = buffer[i];
      }
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = buffer[startIndex];
   }
   
   return (maxValue);
}
 
double ModeDouble(double array[], double interval)
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid first parameter in function ModeDouble(double array[], double interval). It should be at least one element.");
      return(0);
   }
   
   if (interval <= 0) 
   {
      Print("Invalid second parameter in function ModeDouble(double array[], double interval). It should be > 0 .");
      return(0);
   }
   
   double buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   double maxValue = 0;
   
   int startIndex = 0;
   double startValue = buffer[0];
   
   double sum = startValue;
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] >= startValue + interval)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = (sum)/max;
         }
         
         startIndex = i;
         startValue = buffer[i];
         sum = 0;
      }
      sum += buffer[i];
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = (sum)/max;
   }
 
   return (maxValue);
}
 
TheXpert писал (а) >>

Мой вариант моды:


Уважаемый TheXpert, Ваш код выглядит очень компактно. Что, конечно же, являет собой жирный плюс! Спасибо.

 
Как и обещал выкладываю свой вариант функции.
В прикрепленном файле эксперт в котором используется функция. За основу взял эксперта AI.
Не успел сделать проверку работы функции по времени. Т.е я считаю, что после истечения ну например 8 минут нужно заново проверять сигнал.
Добавлена генерация ошибок торгового сервера, что позволит детально изучать работу функции и выявлять ошибки.
int errTest[] = {0, 128, 0, 142, 0, 143, 0, 4, 132};
errTest - последовательность в которой генерируются ошибки, 0 ошибки нет. Накидал последовательность от балды никакого подвоха в них искать не нужно.


Жду критики :)

Файлы:
 
ShestkoFF писал (а) >>
Как и обещал выкладываю свой вариант функции.
В прикрепленном файле эксперт в котором используется функция. За основу взял эксперта AI.
Не успел сделать проверку работы функции по времени. Т.е я считаю, что после истечения ну например 8 минут нужно заново проверять сигнал.
Добавлена генерация ошибок торгового сервера, что позволит детально изучать работу функции и выявлять ошибки.
errTest - последовательность в которой генерируются ошибки, 0 ошибки нет. Накидал последовательность от балды никакого подвоха в них искать не нужно.


Жду критики :)

На функцию мне в принципе по боку, можно сказать одно :), не буду оригинален и скажу как всегда :) -- слишком перегружена.

В итоге советник из 5 КБ чистого и понятного кода превратился в 32 килобайтную бандуру, колупаться в которой у меня, допустим, нет ни малейшего желания.


Есть вопросы по коду.

1. Если Вы дизаблите работу эксперта, то он больше работать не будет, пока не перезапустят. Почему не сделать выжидание относительно большого промежутка времени?

2. Нейросеть -- во-первых она никогда не выдает сигнал флет. Во-вторых -- как можно надеяться, что она что-то оптимизирует, если у нее нет порога??? отсутствием порога Вы убиваете ее и без того малую эффективность(линейная все-таки) процентов на 80.



ЗЫЖ: Не обижайтесь, я тут критиком в этом топике подрабатываю :) .

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