lukas1:
Вопрос в том, что расчет в соответствии с пунктом 2. нигде не
используется и мне кажется его можно пропустить. Ведь мы всё
равно повторно расчитывам уровни в пункте 6. Или я не прав?
Да, вы правы ;)
Но если ждать освобождения потока не придется, и обновлять ничего
не надо будет.
Не дождался ответа и выкинул из эксперта пункт 2. Но. 10 штук модифицированных
DoublePending_beta.mq4 не торгуют (на 10 графиках в одном терминале). Вставил первичный расчет - опять всё заработало.
Вопрос - какую функциональную задачу выполняет предварительный расчет(пункт
2), если потом эти данные пересчитываются?
lukas1:
Не дождался ответа и выкинул из эксперта пункт 2. Но. 10 штук модифицированных
DoublePending_beta.mq4 не торгуют (на 10 графиках в одном терминале). Вставил
первичный расчет - опять всё заработало.
Как именно они "не торгуют"? Какие ошибки возникают? Не
получется "поделить" торговый поток?
lukas1:
Вопрос - какую функциональную задачу выполняет предварительный
расчет(пункт 2), если потом эти данные пересчитываются?
Ни какой.
На самом деле, можно написать
if(RefreshRates()){// пересчитываем уровни Стоп Лосс и Тейк Профит
...
}
Тогда пересчет будет происходить только в случае появления
новых данных.
<Как именно они "не торгуют"? Какие ошибки возникают? Не
получется "поделить" торговый поток?> В начале открытия терминала ничего не происходит (по-видимому
это действует задержка 30 сек). Далее возникает ошибка # 146 от
нескольких экспертов, т.е. много таких. Однократно встречается
# 4107 (Неправильный параметр цены для торговой функции). Ну, и
в общем - эксперты не начинают устанавливать отложенные ордера,
а должны бы.
lukas1: Далее возникает ошибка # 146 от нескольких экспертов, т.е. много
таких.
Эксперты начинают торговать сразу после запуска?
Вы, случайно, не используете функцию TradeIsNotBusy() в функции init()
эксперта? Если да, то при каждом запуске каждого эксперта глобальная переменная-семафор
обнуляется, и все эксперты считают, что можно торговать.
Ура. Я разобрался. Отложил задачу на несколько дней... и разобрался.
Короче, проблемыа в торговле 11 экспертами на одном терминале
должна была решаться так:
1.// определяем необходимость входа в рынок 2.// рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота 3.// ждём освобождения торгового потока и занимаем его (если произошла
ошибка, 4.// выходим) 5.// обновляем рыночную информацию 6.// пересчитываем уровни Стоп Лосс и Тейк Профит 7.// открываем позицию
А пункт 2 был безусловным, потому что пункт 1 там где-то в начале и я его потерял (в
сущности). Если пункт 1 и 2 будет условием для перехода к пункту
3, то мы не будем непрерывно запрашивать освободился ли торговый
поток или нет. Т.е. во втором пункте появилось условие нухно нам что-то пересчитать или не нужно.
А, вообще-то огромное, человеческое Спасибо за информацию и
статью тоже.
Работаю на конкурсном счете (Демо, 57586). При попытке эксперта открыть позицию вылетают сообщения 133 и 146. Отключил советника, попытался поставить ордер вручную (Ф9). Все три кнопки неактивны, выпадающие меню в окне установки ордера - пустые. В чем причина? Я не работал продолжительно время, но никаких ограничений по уровню активности в Правилах нет.
Работаю на конкурсном счете (Демо, 57586). При попытке эксперта открыть позицию вылетают сообщения 133 и 146. Отключил советника, попытался поставить ордер вручную (Ф9). Все три кнопки неактивны, выпадающие меню в окне установки ордера - пустые. В чем причина? Я не работал продолжительно время, но никаких ограничений по уровню активности в Правилах нет.
ForexFox: Хотел спросить, а разве не поможет в решении этой проблемы следующее
: if(IsStopped()) { Print("Эксперт был остановлен пользователем!"); TradeIsBusy=0; return(-1); } и тогда, при ручном удалении эксперта, переменная обнулится
?
Переменная - одна на всех экспертов. Если её обнулять из каждого
эксперта, начнётся бардак ;) Например, если удалить с графика эксперт, который в данный момент
не торгует, он обнулит переменную, и несколько других экспертов
"подерутся" за торговый поток.
Тогда проблему можно решить немного по другому. Значение глобальной переменной, равное нулю принимаем за зелёный свет (так же как Вы и сказали), а неравное нулю - за красный. Неравное нулю - имеется ввиду не семафорная (переизбыточная) единица, а целое MAGICMA конкретного советника. Таким образом, "уходя", советник просто проверит: не оставил ли он после себя лишнего "мусора" (сравнив глобальную переменную торгового потока со своим MAGICMA), и если оставил, то "уберёт за собой", освобождая торговый поток другим, жаждущим поторговать советникам.
Ведь "Решается проблема просто - не надо удалять эксперта с графика, если он торгует ;)" - это не выход. А скорее вход. Вход в дебри леса, когда увеличивается риск сбоя из-за присутствия человеческого фактора. ;)
Тогда проблему можно решить немного по другому. Значение глобальной переменной, равное нулю принимаем за зелёный свет (так же как Вы и сказали), а неравное нулю - за красный. Неравное нулю - имеется ввиду не семафорная (переизбыточная) единица, а целое MAGICMA конкретного советника. Таким образом, "уходя", советник просто проверит: не оставил ли он после себя лишнего "мусора" (сравнив глобальную переменную торгового потока со своим MAGICMA), и если оставил, то "уберёт за собой", освобождая торговый поток другим, жаждущим поторговать советникам.
Ведь "Решается проблема просто - не надо удалять эксперта с графика, если он торгует ;)" - это не выход. А скорее вход. Вход в дебри леса, когда увеличивается риск сбоя из-за присутствия человеческого фактора. ;)
Согласен, красивое решение. Надо будет реализовать.
Вопрос в том, что расчет в соответствии с пунктом 2. нигде не используется и мне кажется его можно пропустить. Ведь мы всё равно повторно расчитывам уровни в пункте 6. Или я не прав?
Но если ждать освобождения потока не придется, и обновлять ничего не надо будет.
Не дождался ответа и выкинул из эксперта пункт 2. Но. 10 штук модифицированных DoublePending_beta.mq4 не торгуют (на 10 графиках в одном терминале). Вставил первичный расчет - опять всё заработало.
Вопрос - какую функциональную задачу выполняет предварительный расчет(пункт 2), если потом эти данные пересчитываются?
На самом деле, можно написать
Тогда пересчет будет происходить только в случае появления новых данных.
В начале открытия терминала ничего не происходит (по-видимому это действует задержка 30 сек). Далее возникает ошибка # 146 от нескольких экспертов, т.е. много таких. Однократно встречается # 4107 (Неправильный параметр цены для торговой функции). Ну, и в общем - эксперты не начинают устанавливать отложенные ордера, а должны бы.
Далее возникает ошибка # 146 от нескольких экспертов, т.е. много таких.
Вы, случайно, не используете функцию TradeIsNotBusy() в функции init() эксперта?
Если да, то при каждом запуске каждого эксперта глобальная переменная-семафор обнуляется, и все эксперты считают, что можно торговать.
1.// определяем необходимость входа в рынок
2.// рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота
3.// ждём освобождения торгового потока и занимаем его (если произошла ошибка,
4.// выходим)
5.// обновляем рыночную информацию
6.// пересчитываем уровни Стоп Лосс и Тейк Профит
7.// открываем позицию
А пункт 2 был безусловным, потому что пункт 1 там где-то в начале и я его потерял (в сущности). Если пункт 1 и 2 будет условием для перехода к пункту 3, то мы не будем непрерывно запрашивать освободился ли торговый поток или нет. Т.е. во втором пункте появилось условие нухно нам что-то пересчитать или не нужно.
А, вообще-то огромное, человеческое Спасибо за информацию и статью тоже.
Хотел спросить, а разве не поможет в решении этой проблемы следующее :
if(IsStopped())
{
Print("Эксперт был остановлен пользователем!");
TradeIsBusy=0;
return(-1);
}
и тогда, при ручном удалении эксперта, переменная обнулится ?
Например, если удалить с графика эксперт, который в данный момент не торгует, он обнулит переменную, и несколько других экспертов "подерутся" за торговый поток.
Тогда проблему можно решить немного по другому. Значение глобальной переменной, равное нулю принимаем за зелёный свет (так же как Вы и сказали), а неравное нулю - за красный. Неравное нулю - имеется ввиду не семафорная (переизбыточная) единица, а целое MAGICMA конкретного советника. Таким образом, "уходя", советник просто проверит: не оставил ли он после себя лишнего "мусора" (сравнив глобальную переменную торгового потока со своим MAGICMA), и если оставил, то "уберёт за собой", освобождая торговый поток другим, жаждущим поторговать советникам.
Ведь "Решается проблема просто - не надо удалять эксперта с графика, если он торгует ;)" - это не выход. А скорее вход. Вход в дебри леса, когда увеличивается риск сбоя из-за присутствия человеческого фактора. ;)
Благодарю за статью! Нужная и полезная.
Тогда проблему можно решить немного по другому. Значение глобальной переменной, равное нулю принимаем за зелёный свет (так же как Вы и сказали), а неравное нулю - за красный. Неравное нулю - имеется ввиду не семафорная (переизбыточная) единица, а целое MAGICMA конкретного советника. Таким образом, "уходя", советник просто проверит: не оставил ли он после себя лишнего "мусора" (сравнив глобальную переменную торгового потока со своим MAGICMA), и если оставил, то "уберёт за собой", освобождая торговый поток другим, жаждущим поторговать советникам.
Ведь "Решается проблема просто - не надо удалять эксперта с графика, если он торгует ;)" - это не выход. А скорее вход. Вход в дебри леса, когда увеличивается риск сбоя из-за присутствия человеческого фактора. ;)
Согласен, красивое решение. Надо будет реализовать.
Спасибо за идею ;)