Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1803

 
Artyom Trishkin #:

В вашем коде при одной открытой позиции другая уже не откроется по противоположному сигналу. Т.е., сначала, при поступлении сигнала, нужно проверить есть ли противоположная позиция и закрыть её.

Но, повторюсь - всё такое сильно ограничивает возможности доработки стратегий.

Нужно уходить от привязки к наличию/отсутствию ордеров (особенно в четвёрке - там за ордера приняты и отложенные ордера (что верно), и позиции (что не правильно)).

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

Вообще, правильно - это иметь в наличии функции для подсчёта ордеров и позиций (одна функция, заполняющая структуру при изменении количества ордеров и позиций), функции открытия/закрытия позиций, функции установки ордеров и сигнальные функции. Плюс - уметь сравнивать данные позиции (открытой или закрытой) с какими-либо величинами.

Из этого набора можно составить любую стратегию.

Артем, там стратегия предусматривает один ордер в рынке пока не закроется по TP или SL.
 
MakarFX #:

Твой код

(Открылся бар и ордеров нет)

проверили сигнал - сигнала нет

... ждем следующий бар

Ты повторил ту же ошибку, что и прошлый раз

P.S.

это

должно выполняться после открытия ордера

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

Но есть одно но. И ты тоже вроде всё учёл. Поступил сигнал, функция bSignalSell или bSignalBuy отправила команду в очередь на открытие ордера и вернула true (первый момент). Второй момент, это то что никакой ордер еще не открылся (команда ждет своей очереди в терминале). Далее, когда очередь  команды подходит, она отправляется на сервер (это еще время). На сервере она выполняется. Или сервер отказывает в выполнении по одной из целого ряда возможных причин (подробнее смотри в документации). Или она не дошла (помехи, плохая связь и прочие баги сети). А твой робот думает, что открыл ордер и обновляет время открытия бара. Прекрасно. Но этого ордера в итоге  не оказалось в списке открытых ордеров. Таким образом, представь, что у тебя в списке 0 ордеров, а робот "думает": всё в порядке я вошел в рынок. В итоге, на протяжении целого бара, после неудачного входа, есть сигнал но эксперт не "видит" его и ничего не делает. Возможна такая ситуация? Возможна! Так что и твой код не супер рабочий. Думай лучше. Или пусть  законопослушный гражданин подумает. А я, к сожалению, сейчас не могу. Работаю над одним очень интересным проектом. Да и создавать правильного полностью рабочего эксперта со всеми механизмами имеет смысл только для хорошей, прибыльной, торговой системы. А просто погонять робота на тестере и убедиться что это очередной сливатор депозита можно хоть с моим, хоть с твоим, вариантом. Тут уже без разницы.

 
законопослушный гражданин #:

Я только сейчас заметил

bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
Open[1] и Close[1]

Индекс 1.

dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0);

В то время как MA у вас с индексом 0! То есть, она гуляет на протяжении всего бара и может выйти за пределы Open и Close. Поэтому, МА лучше сделать также с индексом 1

dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 1);

Тогда все сигналы будут браться исключительно на сформированном баре и робот будет полностью соответствовать торговой системе с сигналами по ценам открытия. Таким образом, роботу будет достаточно отследить момент открытия бара (данный код я уже добавил) и войти по самому новому сформированному бару. Он будет более надежным. И не нужно будет извращаться, как был вынужден сделать Makar из-за изначально неправильного алгоритма входа.

 
Mihail Matkovskij #:

Я только сейчас заметил

Индекс 1.

В то время как MA у вас с индексом 0! То есть, она гуляет на протяжении всего бара и может выйти за пределы Open и Close. Поэтому, МА лучше сделать также с индексом 1

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

В этом и суть сигнала.

Текущая МА заходит в тело предыдущей свечи и в зависимости от того какая свеча(UP/DN) такой и сигнал.

 
MakarFX #:

В этом и суть сигнала.

Текущая МА заходит в тело предыдущей свечи и в зависимости от того какая свеча(UP/DN) такой и сигнал.

В таком случае MA следует брать с индексом 1 на младшем тайм фрейме. Тогда, не нужно будет извращаться. В пределах Open и Close старшего ТФ будет несколько (или множество) баров на младшем ТФ. Ты же знаешь, зачем придумали тайм фреймы? Если нет, то начни изучение данного вопроса с истории возникновения японских свечей. Скажу кратко, суть в упрощении технического анализа. А с приходом цифровой эры еще и упрощение дискретизации торговых систем.

 
Mihail Matkovskij #:

В таком случае MA следует брать с индексом 1 на младшем тайм фрейме. Тогда, не нужно будет извращаться. В пределах Open и Close старшего ТФ будет несколько (или множество) баров на младшем ТФ. Ты же знаешь, зачем придумали тайм фреймы? Если нет, то начни изучение данного вопроса с истории возникновения японских свечей. Скажу кратко, суть в упрощении технического анализа. А с приходом цифровой эры еще и упрощение дискретизации торговых систем.

Я не пойму почему ты на меня взъелся. Человек пишет свою стратегию так, как он ее видит и этот человек не я.

Я лишь ответил на его вопрос: "Как избежать многократного открытия на одном баре?"

Что мне изучать я сам знаю, а если не знаю, то спрашиваю. Сейчас я никого ни о чем не спрашивал.

 
MakarFX #:

Я не пойму почему ты на меня взъелся. Человек пишет свою стратегию так, как он ее видит и этот человек не я.

Я лишь ответил на его вопрос: "Как избежать многократного открытия на одном баре?"

Что мне изучать я сам знаю, а если не знаю, то спрашиваю. Сейчас я никого ни о чем не спрашивал.

Странно. Я пытаюсь разобраться в вопросе, а ты говоришь о каком-то выяснении отношений. Я общаюсь исключительно по теме программирования. Если тебя что-то задело, не обижайся. Я уже 15 лет пишу программы. Ты говоришь, что мой код работает неправильно, по твоему мнению. Но я не обижаюсь, а пытаюсь объяснить тебе то как на самом деле всё устроено в автоматических торговых системах. Получается разговор исключительно технического характера. А ты мне о каких-то обидах говоришь ... :)

 
Mihail Matkovskij #:

Странно. Я пытаюсь разобраться в вопросе, а ты говоришь о каком-то выяснении отношений. Я общаюсь исключительно по теме программирования. Если тебя что-то задело, не обижайся. Я уже 15 лет пишу программы. Ты говоришь, что мой код работает неправильно, по твоему мнению. Но я не обижаюсь, а пытаюсь объяснить тебе то как на самом деле всё устроено в автоматических торговых системах. Получается разговор исключительно технического характера. А ты мне о каких-то обидах говоришь ... :)

Так и я тебе объяснил, в чем твой код ошибочный(в данном случае), а ты говоришь надо советник переделывать)
 
Mihail Matkovskij #:

 Я уже 15 лет пишу программы.

Есть предложение. Дай свой телеграмм в личку.

 
MakarFX #:
Так и я тебе объяснил, в чем твой код ошибочный(в данном случае), а ты говоришь надо советник переделывать)

В данном случае, его нужно переделать, чтобы не извращаться. Поскольку, код который я добавил как раз рассчитан на робота с сигналами по ценам открытия, как я уже говорил. Я подумал: странно получается. А потом нашел причину. Если всё изначально сделать правильно, то в будущем не будет особых проблем. Таким образом, всегда нужно искать причину а не бороться с её следствием.