[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 656

 
artmedia70:
Из-за чего может происходить переполнение стека? При открытии позиции с большим размером тейка (тейк высчитывается от волатильности и умножается на 100, размер получился 41*100), в журнал записывается stack overflow и... будь здоров. Больше не открывается ни одна позиция, пока эта не закроется, а эта есс-но не закрывается из-за огромного тейка... И советник вообще уже не работает корректно, т.к. он должен закрывать все позиции при достижении заранее заданного общего профита открытых позиций... Но этого не происходит, хотя эта одна позиция уже давно в огромном профите, пунктов, этак порядка двух тысяч... Как бороться с этим? Ведь нельзя быть застрахованным от такой ситуации, когда открытые позы дружно переполнят стек и всё покатится кувырком...


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

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

 start() то же функция - возможно там у тебя много переменных

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

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

ЗЫ: по крайней мере так во всех языках программирования - думаю и в mql тоже самое 

 
IgorM:


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

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

start() то же функция - возможно там у тебя много переменных

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

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

ЗЫ: по крайней мере так во всех языках программирования - думаю и в mql тоже самое

Игорь, ты ж в курсе, что я пока избегаю пользовать массивы... У меня в коде всего парочка массивов - массив ордеров до тика и массив ордеров после тика. Они у меня в глобальной области переменных заданы. Забавно, что код открытия этих позиций я перенёс в другое место советника и ошибка исчезла. Похоже был рекурсивный вызов функций открытия ордеров, хотя я не стал над этим сильно ломать голову. Просто решил, что в коде проверки на достижение общей прибыли и закрытия всех позиций не уместно будет размещать открытие сразу после закрытия... Нагородил, блин... :)
 
artmedia70:
Игорь, ты ж в курсе, что я пока избегаю пользовать массивы... У меня в коде всего парочка массивов - массив ордеров до тика и массив ордеров после тика. Они у меня в глобальной области переменных заданы. Забавно, что код открытия этих позиций я перенёс в другое место советника и ошибка исчезла. Похоже был рекурсивный вызов функций открытия ордеров, хотя я не стал над этим сильно ломать голову. Просто решил, что в коде проверки на достижение общей прибыли и закрытия всех позиций не уместно будет размещать открытие сразу после закрытия... Нагородил, блин... :)

я уже давно слепил себе шаблон для создания советника - у меня при выставлении ордера сразу выставляется признак (флаг) существования такого типа ордера и потом перед открытием нового ордера такого типа я всегда проверяю флаг - есть ли такой ордер, но я пишу советники с только с одним ордером
 
IgorM:

я уже давно слепил себе шаблон для создания советника - у меня при выставлении ордера сразу выставляется признак (флаг) существования такого типа ордера и потом перед открытием нового ордера такого типа я всегда проверяю флаг - есть ли такой ордер, но я пишу советники с только с одним ордером
Так ведь и у меня, да думаю у каждого, есть свои наработки, шаблоны и прочие полезности... Тут дело в другом. Я всё воюю с просадками, вот и кручу-верчу различные способы-методы-функции и прочее иже с ними. Ежели делать работу сугубо и строго по тренду, чёт-то совсем мало позиций открывается, если работать по нескольким ТФ, где присутствует на каждом свой тренд/флэт, то непонятно как отлавливать истощение тренда, если на одном, более старшем ТФ тренд уже перешел во флэт, а на младшем он ещё есть, но уже заканчивается. При открытии позы на младшем, велика вероятность того, что она даст просадку, не закрывшись вовремя. Сейчас пробую работать, начиная с 4-х часовых графиков, там определяемся с направлением и на всех младших работаем только в эту сторону. Момент перехода из тренда во флэт я вроде как определил более-менее, бум смотреть на результаты.
 
Craft:


    Да, действительно "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(…). Теперь ваш блок принятия торговых решений выглядит как надо:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

Соответственно нет теперь нужды в «старых» и «новых» вариантах, сделки открываются согласно заданным критериям (насколько я понял у вас трех баровый паттерн вершин/впадин сглаженного iCC). В файле исправленный вариант.

Файлы:
21_2.mq4  14 kb
 

Здраствуйте.

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

Как сделать так, чтоб каждая новая цена добавлялась в массив. 

 
zelek:

Здраствуйте.

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

Как сделать так, чтоб каждая новая цена добавлялась в массив. 


поконкретнее сформулируйте вопрос

если вам интересна текущая цена во время выставления ордера можно в коде который у Вас отвечает за выставление ордера добавить вызов функции, которая будет отвечать за запись текущей цены в глобальный массив с изменением счетчика индекса массива, который Вы потом можете посмотреть из любой точки кода

 

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

насколько производительнее МТ5 против МТ4 

 
IgorM:

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

насколько производительнее МТ5 против МТ4


GetTickCount поможет https://docs.mql4.com/ru/common/GetTickCount
 
DDFedor:

GetTickCount поможет https://docs.mql4.com/ru/common/GetTickCount


спс да оно - то что искал, ктонить замерял скорость однотипного кода для МТ4 и МТ5 ? 

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