2 проблемы при работе с оптимизатором
После большого перерыва решил вернуться к изучению 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.
Здравствуйте. По поводу оптимизации роботов, возможно проблема в namespace. По поводу результатов оптимизации, совершенно не понятно, причем тут StreamWriter и открытие, закрытие позиций.
Цитата: IgorB
Здравствуйте. По поводу оптимизации роботов, возможно проблема в namespace. По поводу результатов оптимизации, совершенно не понятно, причем тут StreamWriter и открытие, закрытие позиций.
Начёт namespace, уже я не понял. Все файлы лежат в одной папке MyBots, и namespace во всех файлах OsEngine.Robots.MyBots. Или что-то другое имелось в виду?
А по поводу 2-го вопроса. Я решил посмотреть данные из середины работы программы, чтобы наверняка увидеть нужные мне переменные. Поэтому - во время сделок и через StreamWriter. Собственно, переменная label отвечает за напавление и открытие/закрытие сделок, а cand - время свечи. Если для того, чтобы разобраться в моей проблеме, мало данных могу подредактировать её, чтобы не палить алгоритм, но отразить суть проблемы.
Вроде бы в namespace все нормально.
Нужно проверить что бы все имена у роботов были уникальны и возвращали эти же уникальные имена, все были добавлены в botFactory со своими именами в советующие места.
В тестере, через отладку проверить, что бы все данные по индикаторам приходили верно.
В оптимизаторе лучше не использовать StreamWriter, т.к. это занимает много времени и методы использующие многопоточность. Это может привести к разным ошибкам. В тестере таких ограничений нет.
Если вы самостоятельно не сможете найти ошибку, то мы можем помочь разобраться. Вникать в чужой код это время и будет стоить 7000р.
Я сам в оптимизаторе прогнал кучу роботов, пару раз встречал ошибку, когда процесс не запускается, проблема была в том, что где-то был невнимателен, при написании кода.
Цитата: IgorB
Вроде бы в namespace все нормально.
Нужно проверить что бы все имена у роботов были уникальны и возвращали эти же уникальные имена, все были добавлены в botFactory со своими именами в советующие места.
Да, спасибо! Дело оказалось в том, что я упустистил из виду, что возвращают данные стратегии.
Цитата: IgorB
Если вы самостоятельно не сможете найти ошибку, то мы можем помочь разобраться. Вникать в чужой код это время и будет стоить 7000р.
Жалко 7000р. поскольку в своей жизни я писал гораздо большие коды, и думаю, что такие непонятки возникают из-за того, что OS Engine - для меня новая платформа. Обычно я ищу ошибки с помощью отладочной информации сужая область где может быть ошибка. А здесь, вроде как, и сужать уже некуда. И, вопрос, как использовать отладочную информацию в OS Engine, если логи в оптимизации использовать нельзя, точки останова выбрасывают исключния, и даже файлы использовать не желательно?
Некоторое время должен был отвлечся от роботов. И сейчас, когда вернулся, заметил, что скользящие средние, при присвоении в коде значений с помощью переменных, задаваемых CreateParameter всегда берут значения параметров по умолчанию, что в оптимизаторе, что в тестере, независимо от того что установлено соответственно в оптимизаторе или тестере. Так и должно быть?
Здравствуйте. Параметр по умолчанию используется в тестере. В оптимизаторе используется 3 значения – минимальное, максимальное и шаг.
Все эти параметры равны тем значениям, которые прописаны в коде и устанавливаются при создании робота 1 раз. Если потом их изменить, то они будут перезаписаны. Это легко посмотреть в отладке присвоив переменной значение параметра в событии ParametrsChangeByUser, затем поставить точку останова на эту присвоение, изменить параметр в настройках, когда зайдет в отладку сравнить значения.
Скользящие средние чаще всего используют параметр для расчета длины. Соответственно в отладке нужно посмотреть меняется это значение при изменении настроек или нет.
Немного отредактровал сообщение. Просьба оставить второе.
Писал-писал, и понял что чего-то не понимаю.
Вот куски кода:
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
Немного отредактровал сообщение. Просьба оставить второе.
Писал-писал, и понял что чего-то не понимаю.
Вот куски кода:
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 чтоли. Не помню. Вызовете точку и найдите.
Опять же давно собирался написать, но выбрался только сейчас.
И в отладчике и в тестере помогает одгна и та же функция, основанная на 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];
}
ООО «ВАН ТЕХНОЛОГИИ»т: +7 953 769 56 45
* Торговля на финансовых рынках связана с риском, который лежит на Вас.
* Ничто из написанного на сайте o-s-a.net не является рекомендацией.
* Если Вы этого не понимаете, не читайте этот сайт, ничего не покупайте.