artmedia70: Из-за чего может происходить переполнение стека? При открытии позиции с большим размером тейка (тейк высчитывается от волатильности и умножается на 100, размер получился 41*100), в журнал записывается stack overflow и... будь здоров. Больше не открывается ни одна позиция, пока эта не закроется, а эта есс-но не закрывается из-за огромного тейка... И советник вообще уже не работает корректно, т.к. он должен закрывать все позиции при достижении заранее заданного общего профита открытых позиций... Но этого не происходит, хотя эта одна позиция уже давно в огромном профите, пунктов, этак порядка двух тысяч... Как бороться с этим? Ведь нельзя быть застрахованным от такой ситуации, когда открытые позы дружно переполнят стек и всё покатится кувырком...
стек не может переполняться просто числом которое вышло за пределы диапазона типа - будет другая ошибка
стек могут переполнить данные которые передаются в функцию или рекурсивный вызов функций без выхода из нее
start() то же функция - возможно там у тебя много переменных
стек это область памяти где сохраняются промежуточные значения (локальные переменные) функции, возможно ты сам разрушаешь стек если пользуешься динамическими массивами и не правильно проконтролировал диапазон массива, т.е записал данные не в массив а просто область памяти, которая идет сразу за массивом
попробуй часть массивов вынести в глобальные переменные - т.е. вынеси в самый верх советника
ЗЫ: по крайней мере так во всех языках программирования - думаю и в mql тоже самое
стек не может переполняться просто числом которое вышло за пределы диапазона типа - будет другая ошибка
стек могут переполнить данные которые передаются в функцию или рекурсивный вызов функций без выхода из нее
start() то же функция - возможно там у тебя много переменных
стек это область памяти где сохраняются промежуточные значения (локальные переменные) функции, возможно ты сам разрушаешь стек если пользуешься динамическими массивами и не правильно проконтролировал диапазон массива, т.е записал данные не в массив а просто область памяти, которая идет сразу за массивом
попробуй часть массивов вынести в глобальные переменные - т.е. вынеси в самый верх советника
ЗЫ: по крайней мере так во всех языках программирования - думаю и в mql тоже самое
Игорь, ты ж в курсе, что я пока избегаю пользовать массивы... У меня в коде всего парочка массивов - массив ордеров до тика и массив ордеров после тика. Они у меня в глобальной области переменных заданы. Забавно, что код открытия этих позиций я перенёс в другое место советника и ошибка исчезла. Похоже был рекурсивный вызов функций открытия ордеров, хотя я не стал над этим сильно ломать голову. Просто решил, что в коде проверки на достижение общей прибыли и закрытия всех позиций не уместно будет размещать открытие сразу после закрытия... Нагородил, блин... :)
artmedia70: Игорь, ты ж в курсе, что я пока избегаю пользовать массивы... У меня в коде всего парочка массивов - массив ордеров до тика и массив ордеров после тика. Они у меня в глобальной области переменных заданы. Забавно, что код открытия этих позиций я перенёс в другое место советника и ошибка исчезла. Похоже был рекурсивный вызов функций открытия ордеров, хотя я не стал над этим сильно ломать голову. Просто решил, что в коде проверки на достижение общей прибыли и закрытия всех позиций не уместно будет размещать открытие сразу после закрытия... Нагородил, блин... :)
я уже давно слепил себе шаблон для создания советника - у меня при выставлении ордера сразу выставляется признак (флаг) существования такого типа ордера и потом перед открытием нового ордера такого типа я всегда проверяю флаг - есть ли такой ордер, но я пишу советники с только с одним ордером
я уже давно слепил себе шаблон для создания советника - у меня при выставлении ордера сразу выставляется признак (флаг) существования такого типа ордера и потом перед открытием нового ордера такого типа я всегда проверяю флаг - есть ли такой ордер, но я пишу советники с только с одним ордером
Так ведь и у меня, да думаю у каждого, есть свои наработки, шаблоны и прочие полезности... Тут дело в другом. Я всё воюю с просадками, вот и кручу-верчу различные способы-методы-функции и прочее иже с ними. Ежели делать работу сугубо и строго по тренду, чёт-то совсем мало позиций открывается, если работать по нескольким ТФ, где присутствует на каждом свой тренд/флэт, то непонятно как отлавливать истощение тренда, если на одном, более старшем ТФ тренд уже перешел во флэт, а на младшем он ещё есть, но уже заканчивается. При открытии позы на младшем, велика вероятность того, что она даст просадку, не закрывшись вовремя. Сейчас пробую работать, начиная с 4-х часовых графиков, там определяемся с направлением и на всех младших работаем только в эту сторону. Момент перехода из тренда во флэт я вроде как определил более-менее, бум смотреть на результаты.
Да, действительно "0", а как быть, подскажите - не получается и так и эдак (и равные периоды задавал) пробовал в обоих вариантах (новом и старом) Print("NormalizeDouble(c1b_1..., ноли выдаёт (показывает значение только c1b[i], все остальные включая c1s[i] - нули), помогите довести один из вариантов до рабочего состояния или хоть подсказкой поделитесь, кто увидит недочёт?
Новый:
Старый:
Целиком:
Юрий, на будущие, если код повторяетсяхотя бы дважды, его нужно выделять в метод, и не потребуется кучи массивов, загромождающих код. Вот вам такой метод:
//+------------------------------------------------------------------+double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
double array[];
int loop_array;
ArrayResize(array,ma_period + ma_shift);
for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+
Я думаю с параметрами все ясно, вносите данные и варьируя параметром ma_shift получаете нужный вам сдвиг. Замечу, что этот метод можно использовать как шаблон, просто меняйте методы доступа к индикаторам i…(…) или iCustom(…). Теперь ваш блок принятия торговых решений выглядит как надо:
Соответственно нет теперь нужды в «старых» и «новых» вариантах, сделки открываются согласно заданным критериям (насколько я понял у вас трех баровый паттерн вершин/впадин сглаженного iCC). В файле исправленный вариант.
Подскажите пожалуйста код, чтоб записать в массив цены со времени открытия ордера.
Как сделать так, чтоб каждая новая цена добавлялась в массив.
поконкретнее сформулируйте вопрос
если вам интересна текущая цена во время выставления ордера можно в коде который у Вас отвечает за выставление ордера добавить вызов функции, которая будет отвечать за запись текущей цены в глобальный массив с изменением счетчика индекса массива, который Вы потом можете посмотреть из любой точки кода
Из-за чего может происходить переполнение стека? При открытии позиции с большим размером тейка (тейк высчитывается от волатильности и умножается на 100, размер получился 41*100), в журнал записывается stack overflow и... будь здоров. Больше не открывается ни одна позиция, пока эта не закроется, а эта есс-но не закрывается из-за огромного тейка... И советник вообще уже не работает корректно, т.к. он должен закрывать все позиции при достижении заранее заданного общего профита открытых позиций... Но этого не происходит, хотя эта одна позиция уже давно в огромном профите, пунктов, этак порядка двух тысяч... Как бороться с этим? Ведь нельзя быть застрахованным от такой ситуации, когда открытые позы дружно переполнят стек и всё покатится кувырком...
стек не может переполняться просто числом которое вышло за пределы диапазона типа - будет другая ошибка
стек могут переполнить данные которые передаются в функцию или рекурсивный вызов функций без выхода из нее
start() то же функция - возможно там у тебя много переменных
стек это область памяти где сохраняются промежуточные значения (локальные переменные) функции, возможно ты сам разрушаешь стек если пользуешься динамическими массивами и не правильно проконтролировал диапазон массива, т.е записал данные не в массив а просто область памяти, которая идет сразу за массивом
попробуй часть массивов вынести в глобальные переменные - т.е. вынеси в самый верх советника
ЗЫ: по крайней мере так во всех языках программирования - думаю и в mql тоже самое
стек не может переполняться просто числом которое вышло за пределы диапазона типа - будет другая ошибка
стек могут переполнить данные которые передаются в функцию или рекурсивный вызов функций без выхода из нее
start() то же функция - возможно там у тебя много переменных
стек это область памяти где сохраняются промежуточные значения (локальные переменные) функции, возможно ты сам разрушаешь стек если пользуешься динамическими массивами и не правильно проконтролировал диапазон массива, т.е записал данные не в массив а просто область памяти, которая идет сразу за массивом
попробуй часть массивов вынести в глобальные переменные - т.е. вынеси в самый верх советника
ЗЫ: по крайней мере так во всех языках программирования - думаю и в mql тоже самое
Игорь, ты ж в курсе, что я пока избегаю пользовать массивы... У меня в коде всего парочка массивов - массив ордеров до тика и массив ордеров после тика. Они у меня в глобальной области переменных заданы. Забавно, что код открытия этих позиций я перенёс в другое место советника и ошибка исчезла. Похоже был рекурсивный вызов функций открытия ордеров, хотя я не стал над этим сильно ломать голову. Просто решил, что в коде проверки на достижение общей прибыли и закрытия всех позиций не уместно будет размещать открытие сразу после закрытия... Нагородил, блин... :)
я уже давно слепил себе шаблон для создания советника - у меня при выставлении ордера сразу выставляется признак (флаг) существования такого типа ордера и потом перед открытием нового ордера такого типа я всегда проверяю флаг - есть ли такой ордер, но я пишу советники с только с одним ордером
я уже давно слепил себе шаблон для создания советника - у меня при выставлении ордера сразу выставляется признак (флаг) существования такого типа ордера и потом перед открытием нового ордера такого типа я всегда проверяю флаг - есть ли такой ордер, но я пишу советники с только с одним ордером
Да, действительно "0", а как быть, подскажите - не получается и так и эдак (и равные периоды задавал) пробовал в обоих вариантах (новом и старом) Print("NormalizeDouble(c1b_1..., ноли выдаёт (показывает значение только c1b[i], все остальные включая c1s[i] - нули), помогите довести один из вариантов до рабочего состояния или хоть подсказкой поделитесь, кто увидит недочёт?
Новый:
Старый:
Целиком:
Юрий, на будущие, если код повторяется хотя бы дважды, его нужно выделять в метод, и не потребуется кучи массивов, загромождающих код.
Вот вам такой метод:
Я думаю с параметрами все ясно, вносите данные и варьируя параметром ma_shift получаете нужный вам сдвиг. Замечу, что этот метод можно использовать как шаблон, просто меняйте методы доступа к индикаторам i…(…) или iCustom(…). Теперь ваш блок принятия торговых решений выглядит как надо:
Соответственно нет теперь нужды в «старых» и «новых» вариантах, сделки открываются согласно заданным критериям (насколько я понял у вас трех баровый паттерн вершин/впадин сглаженного iCC). В файле исправленный вариант.
Здраствуйте.
Подскажите пожалуйста код, чтоб записать в массив цены со времени открытия ордера.
Как сделать так, чтоб каждая новая цена добавлялась в массив.
Здраствуйте.
Подскажите пожалуйста код, чтоб записать в массив цены со времени открытия ордера.
Как сделать так, чтоб каждая новая цена добавлялась в массив.
поконкретнее сформулируйте вопрос
если вам интересна текущая цена во время выставления ордера можно в коде который у Вас отвечает за выставление ордера добавить вызов функции, которая будет отвечать за запись текущей цены в глобальный массив с изменением счетчика индекса массива, который Вы потом можете посмотреть из любой точки кода
как проверить производительность советника - хотелось бы просто вывести время выполнения кода в миллисекундах
насколько производительнее МТ5 против МТ4
как проверить производительность советника - хотелось бы просто вывести время выполнения кода в миллисекундах
насколько производительнее МТ5 против МТ4
GetTickCount поможет https://docs.mql4.com/ru/common/GetTickCount
GetTickCount поможет https://docs.mql4.com/ru/common/GetTickCount
спс да оно - то что искал, ктонить замерял скорость однотипного кода для МТ4 и МТ5 ?