Проперти не может подстроиться под параметры. Вот уже и не сказочно )
))
смысл моего предложения - дать возможность указывать в индикаторе сколько ему нужно истории для расчетов. а каким образом это будет удобно реализовать разработчикам это их, всеми уважаемое, дело.
а каким образом " оставлять доступное пространство перед запрошенным промежутком" ? делаю тест эксперта , где используется пользовательский индикатор, с 2021 г , на реальном данный индикатор прорисовывается корректно на данном промежутке времени, а на тестре индикатор строится как будто стартует с нуля . и соответственно некорректно результаты..
У вас проблема иметь лишние гарантированные данные?
Всем доброго времени суток. Подскажите, пожалуйста, выполняется ли функция Sleep() в режиме тестирования эксперта (тестировании на реальных тиках, естественно)?
SuhanovDM94 #: Всем доброго времени суток. Подскажите, пожалуйста, выполняется ли функция Sleep() в режиме тестирования эксперта (тестировании на реальных тиках, естественно)?
Выполняется - время Тестера изменяется на соответствующую величину.
Wizard #: Можно как то узнать размер того самого тика в mql5, после которого (на котором) была открыта позиция?
Оказывается, что можно. Цикл for вставляется в отдельную функцию, в функцию OnTick() или на свое усмотрение. Интересно мнение других. Например мне то нужно для создания сверхточной системы. Поэтому пишу без библиотек, включая функции для открытия, закрытия позиций. Кто бы что не говорил, библиотеки mqh замедляют работу, например, компиляция происходит в 1,5 раза дольше. Лучше писать в одном файле все. А стиль, ООП или процедурное, тут не играет роли. MQL5 никогда не станет языком уровня C++, ну никак, он ограничен. Смысл в библиотеках...
#define EXPERT_MAGIC 261// MagicNumber экспертаinputstring Symbol_T = "XAUUSD"; // глобальная переменная для задаваемого символа
..............
for(int i = PositionsTotal()-1; i >= 0; i--)
{
if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == Symbol_T && PositionGetInteger(POSITION_MAGIC) == EXPERT_MAGIC)
{
int attempts = 0; // счетчик попытокbool success = false; // флаг успешного выполнения копирования тиковMqlTick tick_array[]; // массив для приема тиков//--- сделаем 3 попытки получить тикиwhile(attempts < 3)
{
//--- замерим время старта перед получением тиковuint start = GetTickCount();
//--- дата, по которую запрашиваются тики (время открытия позиции)datetime Time_Open = (datetime)PositionGetInteger(POSITION_TIME);
//--- дата, с которой запрашиваются тики (достаточно взять на 30 секунд раньше открытия позиции)datetime Time_Start = (datetime)(Time_Open-30);
//--- запросим тиковую историю с момента Time_Start до момента Time_Openint received = CopyTicksRange(Symbol_T, tick_array, COPY_TICKS_ALL, Time_Start*1000, Time_Open*1000);
if(received != -1)
{
//--- выведем информацию о количестве тиков и затраченном времениPrintFormat("%s: received %d ticks in %d ms", Symbol_T, received, GetTickCount()-start);
//--- если тиковая история синхронизирована, то код ошибки равен нулюif(GetLastError()==0)
{
success = true;
break;
}
elsePrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", Symbol_T, received, GetTickCount()-start, _LastError);
}
//--- считаем попытки
attempts++;
//--- пауза в 1 секунду в ожидании завершения синхронизации тиковой базыSleep(1000);
}
//--- не удалось получить запрошенные тики от самого начала истории с трех попыток if(!success)
{
PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", Symbol_T);
//return; (вставить, если цикл находится внутри функции типа void)
}
//--- узнаем количесто элементов в массивеint ticks = ArraySize(tick_array);
//--- выведем bid последнего тика в массиве перед самым открытием позицииdouble last_bid_before_priceopen = tick_array[ticks-1].bid;
Print("BID последнего тика: ", tick_array[ticks-1].bid);
//--- выведем ask последнего тика в массиве перед самым открытием позицииdouble last_ask_before_priceopen = tick_array[ticks-1].ask;
Print("ASK последнего тика: ", tick_array[ticks-1].ask);
//--- узнаем цену, по которой была открыта позицияdouble Position_PriceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
//--- вычислим размер последнего тика, на котором была открыта позиция (для BUY позиции открытие было по цене ASK)double size_last_tick_ASK = NormalizeDouble(fabs(Position_PriceOpen - last_ask_before_priceopen), _Digits);
}
elseif((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
//--- вычислим размер последнего тика, на котором была открыта позиция (для SELL позиции открытие было по цене BID)double size_last_tick_BID = NormalizeDouble(fabs(last_bid_before_priceopen - Position_PriceOpen), _Digits);
}
}
}
Как достал этот баг - есть индикатор, есть эскперт работающий от него. Меняется индикатор . перекомпилируется. Изменения индикатора наглядно видны на графике Эксперт прогоняется в тестере- но как будто ничего и не менял. Тот же самый результат.
Вот если перезаггрузить терминал и прогнать тестер после этого, то он уже увидит новый код.
Что за шаманство - не понятно
Удалил ex5 индикатора. Тестер продолжает прогоняться как ни в чём не бывало. Ну откуда он берет файл для исполнения????
Проперти не может подстроиться под параметры. Вот уже и не сказочно )
))
смысл моего предложения - дать возможность указывать в индикаторе сколько ему нужно истории для расчетов. а каким образом это будет удобно реализовать разработчикам это их, всеми уважаемое, дело.
а каким образом " оставлять доступное пространство перед запрошенным промежутком" ? делаю тест эксперта , где используется пользовательский индикатор, с 2021 г , на реальном данный индикатор прорисовывается корректно на данном промежутке времени, а на тестре индикатор строится как будто стартует с нуля . и соответственно некорректно результаты..
Всем доброго времени суток. Подскажите, пожалуйста, выполняется ли функция Sleep() в режиме тестирования эксперта (тестировании на реальных тиках, естественно)?
Выполняется - время Тестера изменяется на соответствующую величину.
Выполняется - время Тестера изменяется на соответствующую величину.
Большое спасибо!
Можно как то узнать размер того самого тика в mql5, после которого (на котором) была открыта позиция?
Оказывается, что можно. Цикл for вставляется в отдельную функцию, в функцию OnTick() или на свое усмотрение. Интересно мнение других. Например мне то нужно для создания сверхточной системы. Поэтому пишу без библиотек, включая функции для открытия, закрытия позиций. Кто бы что не говорил, библиотеки mqh замедляют работу, например, компиляция происходит в 1,5 раза дольше. Лучше писать в одном файле все. А стиль, ООП или процедурное, тут не играет роли. MQL5 никогда не станет языком уровня C++, ну никак, он ограничен. Смысл в библиотеках...
Как достал этот баг - есть индикатор, есть эскперт работающий от него. Меняется индикатор . перекомпилируется. Изменения индикатора наглядно видны на графике Эксперт прогоняется в тестере- но как будто ничего и не менял. Тот же самый результат.
Вот если перезаггрузить терминал и прогнать тестер после этого, то он уже увидит новый код.
Что за шаманство - не понятно
Удалил ex5 индикатора. Тестер продолжает прогоняться как ни в чём не бывало. Ну откуда он берет файл для исполнения????
3184
Странное поведение в индикаторе.
Цикл for заходит в тело, не на каждом тике, а только один раз на новой свече.
Но i == 0 и заданное условие это позволяет i>=0
при тике на том же баре limit = 0
значит первое значение i = -1, а условие i>=0
поэтому и не заходит в цикл.
при тике на том же баре limit = 0
значит первое значение i = -1, а условие i>=0
поэтому и не заходит в цикл.
Спасибо, проглядел единичку.
Но теперь индикаторный буфер IndBuff[i] мозги делает, array out of range.
Что ему надо? Почему он не аллоцируется под начальный i=limit ?