[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 366

 
lottamer:


нет никаких галок. 

возможно отсутствие нормализации внутри советника дает такой эффект.

 

однако добившись появления вкладки входные параметры  , самой оптимизации не происходит. 

Тестер что-то делает, внизу видно текущее кол-во переборов (7/ 62), но по завершению во вкладках результаты оптимизации, и график оптимизации ПУСТОТА! 

галочка на параметре ессно стоит....

даже не знаю в какую сторону думать... 


Тестер не обеспечивает повторяемости результатов при неизменных данных, поскольку спред при тестировании меняется неведомо как. 

Лекарство:  https://www.mql5.com/ru/forum/119830

 
Chiripaha:

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

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

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


1. советник прибыльный. 

2. руками уже проверил - прибыльный на всем диапазоне параметра. просто хотел чуть расширить диапазон и сделать шаг поменьше.

 
tara:


Тестер не обеспечивает повторяемости результатов при неизменных данных, поскольку спред при тестировании меняется неведомо как. 

Лекарство:  https://www.mql5.com/ru/forum/119830



таки спред же плавающий? нельзя его фиксировать.

другое дело что он должен быть зацементирован на истории...

в общем результат плавает незначительно, и кол-во сделок не меняется...поэтому данный вопрос меня не сильно пугает...

 

другое дело что оптимизатор  нифига не работает! вот это бесит... 

вот что тестер пишет в журнале:

 



2013.05.29 12:20:10 There were 8 passes done during optimization, 8 results have been discarded as insignificant

 

 
tara:


Тестер не обеспечивает повторяемости результатов при неизменных данных, поскольку спред при тестировании меняется неведомо как. 

Лекарство:  https://www.mql5.com/ru/forum/119830

Может это и возможно, но у меня размер спреда вынесен в Инфо - и при изменении отображается. На тестере я не заметил, чтобы спред плавал. Он берет из МаркетИнфо текущего счета данные стандартные параметры и уже их не меняет.

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

 
lottamer:


2013.05.29 12:20:10 There were 8 passes done during optimization, 8 results have been discarded as insignificant

Ну, все правильно - Данные результаты были отметены как незначащие, незначительные (insignificant). - Поэтому и не отражает ни в результатах, ни на графике.
 
Chiripaha:
Ну, все правильно - Данные результаты были отметены как незначащие (insignificant). - Поэтому и не отражает ни в результатах, ни на графике.



видимо тут косяк глубже.

первый мой вопрос вчера был : как оптимизировать параметры находящиеся внутри пользовательской функции.

мне ответили - вынеси их в extern double 

я вынес.

и вот теперь оптимизатор выбрасывает результат...видимо я вынес их как-то неправильно.

вот код. это обычный модификатор стопа и тейка

вместо STOP и TAKE там раньше стояли числа 100 и 200 

я заменил числа на   STOP и TAKE

а в начале кода добавил

extern double  STOP = 100; 
extern double  TAKE = 200;

нет ли тут где-то ошибки?

(сам модификатор 100% рабочий)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

Пока смотрю код, но по ходу дела позволю несколько комментариев.

Вот эта строка вообще не имеет смысла:

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

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

Symbol()

Нужно будет подставлять иные значения заранее определенные, но никак не эту штатную функцию.

Так же и эта переменная лишняя

total=OrdersTotal();

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

Вот это:

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

вообще лучше сгруппировать - условие же одинаковое. Кстати, у Вас они написаны по структуре по-разному. - это к вопросу о потере структуры. Стиль написания должен быть единым - тогда видна структура и возможные ошибки сами вылазят как кочки после схода снега.

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

Из представленного Вами, принципиальных моментов я не выявил, что могло бы влиять на результат. Но!... Вы тут представили всего лишь одну функцию (довольно небрежно написанную, если не считать закомментированного перебора - это отражено в вопросе). Чтобы сказать вердикт - нужна не функция, а код программы, т.к. неизвестно, где и в чем кроется причина и ее нужно искать. Для этого прогу нужно запустить в тестере - посмотреть своими глазами на косяки проявляемые. Затем уже пробежаться по коду (или в обратном порядке) и поискать эту причину.

Как общее ощущение могу сказать, что у Вас, Олег, довольно много небрежностей (пофигизмов, я бы сказал). Это может приводить 1. К замусориванию используемой системы. 2. Потере структуры в результате этого замусоривания и сложности идентификации и выявления косяка. Поэтому могу посоветовать. - По возможности повыкидывайте весь "мусор" (лишнее) из кода - ошибку будет очевиднее найти. - Это классическая ошибка большинства вопрошающих о помощи - небрежность.

 
lottamer:


видимо тут косяк глубже.

первый мой вопрос вчера был : как оптимизировать параметры находящиеся внутри пользовательской функции.

мне ответили - вынеси их в extern double 

я вынес.

и вот теперь оптимизатор выбрасывает результат...видимо я вынес их как-то неправильно.

Нет, я думаю, Вы ошибаетесь. Тестер выбрасывает не из-за вынесенных параметров - а потому что результаты не проходят критериев значимости.

А вот то, что сама прога может содержать ошибку - это возможно. Тем более, косвенным образом на это указывают как раз нестабильные результаты. - Значит, что-то не так. В моей практике я такие проги до реала не допускаю. Потому что, раз что-то не так, значит, ситуация не контролируемая. И может вылезти все что угодно.

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

 
Chiripaha:

Пока смотрю код, но по ходу дела позволю несколько комментариев.

Вот эта строка вообще не имеет смысла:

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

Нужно будет подставлять иные значения заранее определенные, но никак не эту штатную функцию.

Так же и эта переменная лишняя

Т.к. внутри функции у Вас это применяется всего лишь единожды в переборе, который почему-то закомментирован, и только захламляет код. - Отсюда вопрос - А почему перебор по ордерам закомментировали?

Вот это

Вообще лучше сгруппировать - условие же одинаковое.

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

Как общее ощущение могу сказать, что у Вас, Олег, довольно много небрежностей (пофигизмов, я бы сказал). Это может приводить 1. К замусориванию используемой системы. 2. Потере структуры в результате этого замусоривания и сложности идентификации и выявления косяка. Поэтому могу посоветовать. - По возможности повыкидывайте весь "мусор" (лишнее) из кода - ошибку будет очевиднее найти. - Это классическая ошибка большинства вопрошающих о помощи - небрежность.


этот модификатор писал не я. 

я взял его готовым из библиотек.

поэтому и почистить не смогу. главное что он 100% рабочий.

а вот почему не оптимизируется параметр внутри него - вот это вопрос.....

принципиальных ошибок же нет!

остальной код рабочий.

поставьте любые условия по алгоритму. 

- купить 

-модифицировать

- закрыть

---------------------------

и попробуйте прооптимизировать параметр внутри моего МОДИФИКАТОРА ордера - т.е. стоп и тейк 

 
Chiripaha:

Нет, я думаю, Вы ошибаетесь. Тестер выбрасывает не из-за вынесенных параметров - а потому что результаты не проходят критериев значимости.

А вот то, что сама прога может содержать ошибку - это возможно. Тем более, косвенным образом на это указывают как раз нестабильные результаты. - Значит, что-то не так. В моей практике я такие проги до реала не допускаю. Потому что, раз что-то не так, значит, ситуация не контролируемая. И может вылезти все что угодно.

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

ну вот смотрите,

если я сейчас верну все назад , т.е. уберу внешние параметры  СТОП И ТЕЙК, а внутри функции пропишу вместо них числа, то советник прогнанный неделя за неделей в течение 10 недель , показывает четкие результаты. он делает ровно то что надо. проверял визуально сделку за сделкой.

И если я буду вручную менять параметры стопа и тейка - все будет работать и давать чуть другие результаты (это естественно )

 

а вот теперь почему, когда я выношу эти параметры наружу модификатора - оптимизатор считает их незначительными? 

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