Работа с оптимизатором

2 проблемы при работе с оптимизатором

  1. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23

    После большого перерыва решил вернуться к изучению OS Engine, поскольку сам C# знаю неплохо.

    При тестировании моей стратегии всё было в порядке, но при переходе к оптимизации возникли 2 проблемы, которые ввели меня в ступор.

    1) Как и требуется, для начала я создал свою папку MyBots в папке Robots средствами C#. Прописал своего робота в using и ещё в 2 местах в файле BotFactory. После тестирования, решил создать в этой папке ещё одного робота, как модификацию первого. И тут я заметил что первый робот оптимизируется, а второй - нет. Проходит несколько минут и полоса прогресса остаётся на нуле. Через некоторое время пришла в голову мысль, что, как это бывает, где-то какой-то лишний символ, и поэтому всё валится. Но с третьим роботом в той же папке история повторилась. Не поверите, но первый робот скопированный во второй дал тот же результат, более того робот из стандартного набора, тоже не оптимизируется. Но с этим ещё как-то можно было жить, поскольку один рабочий файл у меня был.

    Вторая проблема была посерьёзней.

    2) Проходы моего робота на всех наборах параметров показывали одинаковые результаты. На открытии и закрытии всех позиций следующий код

    bool f = true;

                while (f)

                {

                    f = false;

                    try

                    {

                        sw = new StreamWriter(@"C:\Users\Professional\Documents\results_OS.txt", true);

                        sw.WriteLine(label +" "+ cand+". IntDefoult: " + Sma1Lenght.ValueIntDefolt +

                            " Int: " + Sma1Lenght.ValueInt + " SMA: " + sma1_L);

                        sw.WriteLine(label + " " + cand + ". DecimalDefoult: " + Sma2Koeff.ValueDecimalDefolt +

                            " Decimal: " + Sma2Koeff.ValueDecimal + " SMA: " + sma2_L);

                        sw.WriteLine(label + " " + cand + ". DecimalDefoult: " + Sma3Koeff.ValueDecimalDefolt +

                            " Decimal: " + Sma3Koeff.ValueDecimal + " SMA: " + sma3_L);

                        sw.Close();

                    }

                    catch

                    {

                        f = true;

                    }

                }

    выдавал неизменные значения sma1_L, sma2_L, sma3_L независимо от параметров, во время открытия и закрытия сделок хотя считал я их, как

    sma1_L = Sma1Lenght.ValueInt;

    sma2_L = (int)(Sma1Lenght.ValueInt * Sma2Koeff.ValueDecimal);

    sma3_L = (int)(Sma1Lenght.ValueInt * Sma2Koeff.ValueDecimal * Sma3Koeff.ValueDecimal);

    в конструкторе.

    Не знаю, насколько в данном случае это важно, но эти sma - public.

    Понимаю, что скорее всего сам дурак. Но, где ошибка, хоть убейте, не пойму.

    P.S. А первая проблема, как мне кажется, скорее всего баг OS Engine.

    SeMiTr
    15.02.2022 21:49
    #1
  2. IgorB

    Регистрация:
    13.10.21
    Сообщения:
    41
    Был на сайте:
    30.07.23

    Здравствуйте. По поводу оптимизации роботов, возможно проблема в namespace. По поводу результатов оптимизации, совершенно не понятно, причем тут StreamWriter и открытие, закрытие позиций. 

    IgorB
    16.02.2022 12:34
    #2
  3. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23
    Цитата: IgorB

    Здравствуйте. По поводу оптимизации роботов, возможно проблема в namespace. По поводу результатов оптимизации, совершенно не понятно, причем тут StreamWriter и открытие, закрытие позиций. 

    Начёт namespace, уже я не понял. Все файлы лежат в одной папке MyBots, и namespace  во всех файлах OsEngine.Robots.MyBots. Или что-то другое имелось в виду?

    А по поводу 2-го вопроса. Я решил посмотреть данные из середины работы программы, чтобы наверняка увидеть нужные мне переменные. Поэтому - во время сделок и через StreamWriter. Собственно, переменная label отвечает за напавление и открытие/закрытие сделок, а cand - время свечи. Если для того, чтобы разобраться в моей проблеме, мало данных могу подредактировать её, чтобы не палить алгоритм, но отразить суть проблемы.

    SeMiTr
    16.02.2022 14:43
    #3
  4. IgorB

    Регистрация:
    13.10.21
    Сообщения:
    41
    Был на сайте:
    30.07.23

    Вроде бы в namespace все нормально. 

    Нужно проверить что бы все имена у роботов были уникальны и возвращали эти же уникальные имена, все были добавлены в botFactory со своими именами в советующие места.

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

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

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

    Я сам в оптимизаторе прогнал кучу роботов, пару раз встречал ошибку, когда процесс не запускается, проблема была в том, что где-то был невнимателен, при написании кода.

    IgorB
    16.02.2022 15:28
    #4
  5. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23
    Цитата: IgorB

    Вроде бы в namespace все нормально. 

    Нужно проверить что бы все имена у роботов были уникальны и возвращали эти же уникальные имена, все были добавлены в botFactory со своими именами в советующие места.

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

    Цитата: IgorB
    Если вы самостоятельно не сможете найти ошибку, то мы можем помочь разобраться. Вникать в чужой код это время и будет стоить 7000р.

    Жалко 7000р. поскольку в своей жизни я писал гораздо большие коды, и думаю, что такие непонятки возникают из-за того, что OS Engine -  для меня новая платформа. Обычно я  ищу ошибки с помощью отладочной информации сужая область где может быть ошибка. А здесь, вроде как, и сужать уже некуда. И, вопрос, как использовать отладочную информацию в OS Engine, если логи в оптимизации использовать нельзя, точки останова выбрасывают исключния, и даже файлы использовать не желательно?

    SeMiTr
    17.02.2022 16:45
    #5
  6. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23

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

     

     

    SeMiTr
    18.03.2022 20:24
    #6
  7. IgorB

    Регистрация:
    13.10.21
    Сообщения:
    41
    Был на сайте:
    30.07.23

    Здравствуйте. Параметр по умолчанию используется в тестере. В оптимизаторе используется 3 значения – минимальное, максимальное и шаг.

    Все эти параметры равны тем значениям, которые прописаны в коде и устанавливаются при создании робота 1 раз. Если потом их изменить, то они будут перезаписаны. Это легко посмотреть в отладке присвоив переменной значение параметра в событии ParametrsChangeByUser, затем поставить точку останова на эту присвоение, изменить параметр в настройках, когда зайдет в отладку сравнить значения. 

    Скользящие средние чаще всего используют параметр для расчета длины. Соответственно в отладке нужно посмотреть меняется это значение при изменении настроек или нет.

    IgorB
    19.03.2022 02:01
    #7
  8. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23

    Всё забываю сказать спасибо. Спасибо! Вы мне тогда очень помогли!

    SeMiTr
    18.04.2022 17:54
    #8
  9. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23

    Немного отредактровал сообщение. Просьба оставить второе.

    Писал-писал, и понял что чего-то не понимаю.

    Вот куски кода:

    public MyAlligator(string name, StartProgram startProgram) : base(name, startProgram)

            {

               isOptMode = false;

                ...

                arrSma1 = new int[] { 20, 30, 45, 65, 100, 150, 220 };

                arrSmaK = new decimal[] { 1.2M, 1.34M, 1.5M, 1.75M, 2, 2.5M, 3, 4, 5, 7, 10};

                arrSmaS = new int[] { 10, 20, 30, 50 }; 

                Sma1Lenght = CreateParameter("Sma1Lenght", 3, 0, 6, 1);

                Sma2Koeff = CreateParameter("Sma2Koeff", 3, 0, 10, 1);

                Sma3Koeff = CreateParameter("Sma3Koeff", 3, 0, 10, 1);

                kOpen = CreateParameter("kOpen", 0, 0, 3, 1);

                kClose = CreateParameter("kClose", 0, 0, 3, 1);

                _sma1 = new MyMovingAverage(_name + "Ma1", false);

                _sma1.ColorBase = Color.Yellow;

                _sma1 = (MyMovingAverage)_tab.CreateCandleIndicator(_sma1, "Prime");

                _sma2 = new MyMovingAverage(_name + "Ma2", false);

                _sma2.ColorBase = Color.Red;

                _sma2 = (MyMovingAverage)_tab.CreateCandleIndicator(_sma2, "Prime");

                _sma3 = new MyMovingAverage(_name + "Ma3", false);

                _sma3.ColorBase = Color.Brown;

                _sma3 = (MyMovingAverage)_tab.CreateCandleIndicator(_sma3, "Prime");

                if (isOptMode == false)

                    SMAsT();

                else

                    SMAsO();

                ...

                 ParametrsChangeByUser += MyAlligator_ParametrsChangeByUser;

           }

      private void SMAsO()

            {

                _sma1.Lenght = arrSma1[Sma1Lenght.ValueInt];

                _sma2.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueInt]);

                _sma3.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueInt] * arrSmaK[Sma3Koeff.ValueInt]);

                _sma1.ColorBase = Color.Yellow;

                _sma2.ColorBase = Color.Red;

                _sma3.ColorBase = Color.Brown;

                kO = arrSmaS[kOpen.ValueInt];

                kC = arrSmaS[kOpen.ValueInt];

         }  

    private void SMAsT()

            {

                

                _sma1.Lenght = arrSma1[Sma1Lenght.ValueIntDefolt];

                _sma2.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueIntDefolt]);

                _sma3.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueIntDefolt] * arrSmaK[Sma3Koeff.ValueIntDefolt]);

     

                _sma1.ColorBase = Color.Yellow;

                _sma2.ColorBase = Color.Red;

                _sma3.ColorBase = Color.Brown;

                kO = arrSmaS[kOpen.ValueIntDefolt];

                kC = arrSmaS[kOpen.ValueIntDefolt];

            }

    private void MyAlligator_ParametrsChangeByUser()

            {

                if (isOptMode == false)

                    SMAsT();

                else

                    SMAsO();

            }

    И как бы я не менял в тестере параметры, что в коде, что в запущенной программе, они не меняются, и остаются в виде 1,1,1 (по крайней мере первые 3). Если код слишком сложный для понимания могу попробовать сократить.

     

    SeMiTr
    09.06.2022 20:03
    #9
  10. Алексей Ван Команда форума

    Регистрация:
    02.02.13
    Сообщения:
    1172
    Был на сайте:
    19.04.24
    Цитата: SeMiTr

    Немного отредактровал сообщение. Просьба оставить второе.

    Писал-писал, и понял что чего-то не понимаю.

    Вот куски кода:

    public MyAlligator(string name, StartProgram startProgram) : base(name, startProgram)

            {

               isOptMode = false;

                ...

                arrSma1 = new int[] { 20, 30, 45, 65, 100, 150, 220 };

                arrSmaK = new decimal[] { 1.2M, 1.34M, 1.5M, 1.75M, 2, 2.5M, 3, 4, 5, 7, 10};

                arrSmaS = new int[] { 10, 20, 30, 50 }; 

                Sma1Lenght = CreateParameter("Sma1Lenght", 3, 0, 6, 1);

                Sma2Koeff = CreateParameter("Sma2Koeff", 3, 0, 10, 1);

                Sma3Koeff = CreateParameter("Sma3Koeff", 3, 0, 10, 1);

                kOpen = CreateParameter("kOpen", 0, 0, 3, 1);

                kClose = CreateParameter("kClose", 0, 0, 3, 1);

                _sma1 = new MyMovingAverage(_name + "Ma1", false);

                _sma1.ColorBase = Color.Yellow;

                _sma1 = (MyMovingAverage)_tab.CreateCandleIndicator(_sma1, "Prime");

                _sma2 = new MyMovingAverage(_name + "Ma2", false);

                _sma2.ColorBase = Color.Red;

                _sma2 = (MyMovingAverage)_tab.CreateCandleIndicator(_sma2, "Prime");

                _sma3 = new MyMovingAverage(_name + "Ma3", false);

                _sma3.ColorBase = Color.Brown;

                _sma3 = (MyMovingAverage)_tab.CreateCandleIndicator(_sma3, "Prime");

                if (isOptMode == false)

                    SMAsT();

                else

                    SMAsO();

                ...

                 ParametrsChangeByUser += MyAlligator_ParametrsChangeByUser;

           }

      private void SMAsO()

            {

                _sma1.Lenght = arrSma1[Sma1Lenght.ValueInt];

                _sma2.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueInt]);

                _sma3.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueInt] * arrSmaK[Sma3Koeff.ValueInt]);

                _sma1.ColorBase = Color.Yellow;

                _sma2.ColorBase = Color.Red;

                _sma3.ColorBase = Color.Brown;

                kO = arrSmaS[kOpen.ValueInt];

                kC = arrSmaS[kOpen.ValueInt];

         }  

    private void SMAsT()

            {

                

                _sma1.Lenght = arrSma1[Sma1Lenght.ValueIntDefolt];

                _sma2.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueIntDefolt]);

                _sma3.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueIntDefolt] * arrSmaK[Sma3Koeff.ValueIntDefolt]);

     

                _sma1.ColorBase = Color.Yellow;

                _sma2.ColorBase = Color.Red;

                _sma3.ColorBase = Color.Brown;

                kO = arrSmaS[kOpen.ValueIntDefolt];

                kC = arrSmaS[kOpen.ValueIntDefolt];

            }

    private void MyAlligator_ParametrsChangeByUser()

            {

                if (isOptMode == false)

                    SMAsT();

                else

                    SMAsO();

            }

    И как бы я не менял в тестере параметры, что в коде, что в запущенной программе, они не меняются, и остаются в виде 1,1,1 (по крайней мере первые 3). Если код слишком сложный для понимания могу попробовать сократить.

     

    Нормальный код. В целом понятно.

    После того как поменяете настройки. Вызовите у индикатора метод перестройки. Rebuid чтоли. Не помню. Вызовете точку и найдите.

    Алексей Ван
    14.06.2022 16:09
    #10
  11. SeMiTr

    Регистрация:
    23.06.20
    Сообщения:
    12
    Был на сайте:
    08.04.23

    Опять же давно собирался написать, но выбрался только сейчас.

    И в отладчике и в тестере помогает одгна и та же функция, основанная на ValueInt (или Value<другой тип данных>)

    К примеру так

    private void SMA_New()

            { 

                _sma1.Lenght = arrSma1[Sma1Lenght.ValueInt];

                _sma2.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueInt]);

                _sma3.Lenght = (int)(_sma1.Lenght * arrSmaK[Sma2Koeff.ValueInt] * arrSmaK[Sma3Koeff.ValueInt]);

     

                _sma1.ColorBase = Color.Yellow;

                _sma2.ColorBase = Color.Red;

                _sma3.ColorBase = Color.Brown;

                kO = arrSmaS[kOpen.ValueInt];

                kC = arrSmaS[kOpen.ValueInt];

            }

    SeMiTr
    18.07.2022 13:47
    #11