Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 659
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
вот еще нашел серьезный недочет, очень много вызовов CopyClose()
Не подскажете, как можно в цикле скопировать из массива валютных пар их котировки?
Это получается двойной массив должен быть, а MQL такое не поддерживает, типа%
MQL4 вроде работает с двухмерными динамичсекими массивами, первое измерение массива сами измените через ArayResize(), а второе передавайте в CopyClose()
ну или универсальное решение от разработчиков ибо в MQL5 не работают 2-хмерные динамические массивы, оберните одномерный массив в структуру и создайте массив таких структур.... разберетесь считайте, что почти класс написали, и это более оптимальнее - класс у которого метод сам подгружает данные и хранит в свойствах(полях) классаMQL4 вроде работает с двухмерными динамичсекими массивами, первое измерение массива сами измените через ArayResize(), а второе передавайте в CopyClose()
ну или универсальное решение от разработчиков ибо в MQL5 не работают 2-хмерные динамические массивы, оберните одномерный массив в структуру и создайте массив таких структур.... разберетесь считайте, что почти класс написали, и это более оптимальнее - класс у которого метод сам подгружает данные и хранит в свойствах(полях) классаСпасибо попробую
Еще вопрос по поводу индикатора, не знаю что еще тут делать
Нужно чтобы выводилась разница между закрытиями введенных пар, и скользящая средняя по ним
По итогу выводится просто разница, без МА, в чем проблема?
перебирать ордера нужно в цикле. а не на каждом тике... если точнее, то пришел тик и посчитали все свои ордера в цикле: for(j=0;j<OrderTotal;j++)
OrdersTotal() показывает сколько открыто ордеров (включая отложенные ордера, включая ордера по всем инструментам... вообще всего... вот сколько в терминале видите открытых ордеров вот столько ))))
нумерация ордеров как в массивах, от 0 до OrdersTotal()-1 - это последний ордер, а у Вас, наверное, вывод в журнал на каждом тике несуществующий тикет № [OrdersTotal()] или еще какая то информация, которую сложно угадать
Да я так и делаю - и хочу чтобы он прошёл все ордера. Сперва функция была немного другой, но упростил её максимально, в надежде найти причину и устранить. Полный последовательный перебор происходит только при редком появлении тиков или после того, как я удаляю советник с графика и новые тики не поступают.
Я всегда считал, что если советник вошёл в тело функции, то она уже не должна реагировать на другие тики,пока не выйдет из цикла, но, похоже это не так. Как обойти эту ситуацию?
int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}
А зачем вообще нужна информация по всем ордерам каждый тик? Не лучше ли ввести ограничения на просмотр ордеров, например, каждую новую минуту, пять минут, ..., час?
Проблема даже не в том, что мне нужна информация на каждый тик, а в том, что, если я понимаю правильно, цикл не успевает закончиться до прихода нового тика и новый тик каким то образом нарушает счет. Вот ещё раз приложу скриншот, чтобы Вам не искать предыдущий. Из него видно, советник досчитал до 52 и потом прыгнул на 93. Мне было трудно поверить, что это происходит из-за прихода новых тиков, но, пока, я не могу найти другую причину, т.к. при редком появлении тиков, счет заканчивается нормально, также как и последний цикл, после удаления советника с графика.
Код уже максимально упростил:
int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}
Откуда вы такое знаете? Это не так.
Пока не будут завершены все вычисления, начавшиеся с приходом тика, все последующие тики пропускаются.
Как я уже писал чуть выше, у меня такая же ситуация, только я её уже упростил до придела и пришёл к выводу, что я не только не могу сделать нормально какой то расчет, но просто последовательно перебрать ордера и вывести их номера в лог.
Я тоже всегда верил, что "Пока не будут завершены все вычисления, начавшиеся с приходом тика, все последующие тики пропускаются". Хотелось бы, чтобы оно так и было, но другую, кроме новых тиков, причину найти, пока, не могу.
Без кода никто не скажет.
Вот предельно упрощённый код, который имеет туже проблему - новые тики сбивают последовательный вывод номеров ордеров.
int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}
Вот предельно упрощённый код, который имеет туже проблему - новые тики сбивают последовательный вывод номеров ордеров.
int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}
Еще вопрос по поводу индикатора, не знаю что еще тут делать
Нужно чтобы выводилась разница между закрытиями введенных пар, и скользящая средняя по ним
По итогу выводится просто разница, без МА, в чем проблема?
Это круто!
Роман!
Я вот, например, успешный трейдер с 20-летним стажем.
Я вот не пойму, зачем Вам нужна "разница между закрытиями введенных пар, и скользящая средняя по ним".
Более того, а скользящую среднюю по этим разницам Вы умеете строить? - Фантастика!
А просто скользящую среднюю по котировкам строить умеете? - Тоже нет?
Так в чем проблема?
Вот предельно упрощённый код, который имеет туже проблему - новые тики сбивают последовательный вывод номеров ордеров.
int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}
вот этот код работает, сделайте по аналогии: