Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
Так в этом и нет ни какой необходимости, смысл выполнять какие-то действия, если полученный результат не будет использоваться. Должно быть условие на частичное закрытие, если оно выполнилось, перед самой ф-цией закрытия - собрали все тикеты в массив А. Если ордер удачно закрыли - снова собрали все тикеты, но в массив В. Перебираем тикеты в массиве В на предмет совпадения тикета с массивом в А, если нет совпадения - это и есть новый тикет ордера.

При этом нет ни каких проблем если советник работал в одном терминале и затем его запустили в другом, например, на VPS, все работает, а вот с глобальными нужны еще телодвижения.
Мне не дали дописать свою мысль до конца. Поэтому так получилось. Я не сомневался ни на секунду, что у тебя не каждый тик идёт проверка.
 

vladradon

Программист
Время открытия вновь открываемого ордера будет равно времени открытия изначального ордера.
Мой сеточник торгует на 8ми парах, и нормально справляется.
Дружище, ты, возможно не все понял (без обид) - мои разработки торгуют на любом количестве пар (их можно регулировать в настройках).
 

Вложения

  • FX34_0.set
    10,7 КБ · Просмотры: 18
  • ReadmeFX34.txt
    8,3 КБ · Просмотры: 23
  • FxRadon3.4.ex4
    174,5 КБ · Просмотры: 31
Последнее редактирование:

vlad_123

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

Я привел пример, чтобы проиллюстрировать работоспособность предложенного мной метода.

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

Для него и был приведен код.
На скольки парах он будет работать - абсолютно фиолетово.

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

vladradon

Программист
А если сразу 2 ордера закроется за один тик и ты будешь искать только самый большой тикет? ошибка.
В советнике есть параметр TimeWait, который если не нулевой, то запрещает открывать советникам с других пар указанное время в секундах, но только если торгуешь мультивалютно.
 

MrGreen86

Гуру форума
Даже в МТ5 при асинхронном выполнении OrderSendAsync() маловероятно чтобы получились позиции с одинаковым временем открытия. А уж в МТ4 пока отправлен приказ, пока получен ответ... Даже сетка должна быть по одной цене и далеко не факт что время совпадёт. Сервер тоже выполняет распоряжения по очереди. В общем надо проверять. В тестере такая вероятность выше. И если в тестере не будет наблюдаться такая проблема, то такой вариант имеет право на жизнь.
Всё остальное на любителя. Я никого ни к чему не призывал.

"маловероятно" - не приемлимо для програмного кода.
Маловероятно что windows уйдет в синий экран и вся ваша работа пойдет по изветсному месту. Маловероятно что система защиты АЭС кританет в нужный момент....
У нормальных брокеров а не всяких там Ins.. (красные) исполнение очень быстрое, закрыть и открыть несколько ордеров в одну секунду по одному инструмент не проблема. а если это 2 отложки на одной цене так и подавно.
Подобное решение не приемлемо. Его нельзя использовать.
Мы работаем с финансами, тут любая ошибка может вылиться в десятки тысяч $. очень важна точность.
 
Последнее редактирование:

MrGreen86

Гуру форума
А если сразу 2 ордера закроется за один тик и ты будешь искать только самый большой тикет? ошибка.
:D

:laugh:
я уже этот вопрос раза 2 выше пояснил. Каким образом у вас будет 2 частично закрытых ордера одновременно с одним меджиком?
Ставите двух советников с одним меджиком на один инструмент при этом оба могут делать частичное закрытие? серьезно? :)
Один советник работает в одном потоке и поиск максимального тикета (с тем же magic и symbol) сразу после частичного закрытия гарантированно дает верный результат. Если частичные закрытия делаются подряд, то между ними и следует искать максимальный тикет.
 
Последнее редактирование:

vladradon

Программист
Один советник работает в одном потоке и поиск максимального тикета (с тем же magic и symbol) сразу после ПЕРВОГО частичного закрытия гарантированно дает верный результат.
Только после частичного закрытия меджик уже не важен, а тикет генерируется автоматом и командами его не получишь.;)
Я имею ввиду тикет нового ордера от которого был отгрызан кусок....
 

MrGreen86

Гуру форума
Только после частичного закрытия меджик уже не важен, а тикет генерируется автоматом и командами его не получишь.;)
Я имею ввиду тикет нового ордера от которого был отгрызан кусок....

тикеты ордеров всегда последовательны. т.е. огрызок будет иметь наибольший тикет из всех, это гарантированно.
меджик важен, так как огрызок унаследует его от родителя.
 

vladradon

Программист
тикеты ордеров всегда последовательны. т.е. огрызок будет иметь наибольший тикет из всех, это гарантированно.
меджик важен, так как огрызок унаследует его от родителя.
А ты точно не путаешь те тикеты, которые задаются тестером или оптимизатором (они идут с 0 и последовательно) с теми, что генерирует брокер?;)
 

mobidik

-----
А ты точно не путаешь те тикеты, которые задаются тестером или оптимизатором (они идут с 0 и последовательно) с теми, что генерирует брокер?;)

Хоть вопрос адресован не мне, но отвечу: брокер выполняет заявки всех трейдеров по порядку, ставит в очередь и каждая новая заявка, а в данном случае, каждый новый открытый ордер имеет тикет на 1 больше от предыдущего. Брокер не "генерирует", а ведет строгий учет ордеров всех своих клиентов.
 

vladradon

Программист
Хоть вопрос адресован не мне, но отвечу: брокер выполняет заявки всех трейдеров по порядку, ставит в очередь и каждая новая заявка, а в данном случае, каждый новый открытый ордер имеет тикет на 1 больше от предыдущего. Брокер не "генерирует", а ведет строгий учет ордеров всех своих клиентов.
Если торговля мультивалютная и ордера открываются и модернизируются по нескольким парам параллельно, как ты сможешь их учитывать?
 

mobidik

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

Как минимум: тикет, символ, время - более чем достаточно.

Вот мне интересно: а что ты видел два одинаковых тикета ордеров с разным символом? :D
 

vladradon

Программист
Вот мне интересно: а что ты видел два одинаковых тикета ордеров с разным символом?
Я на этот счет даже не заморачивался - вопрос стоит в том, как вычислить ордер с новым тикетом, который сгенерирован брокером и продолжить его курировать. У меня это получилось и работает, а здесь (на этом форуме) я вижу только вариации непроверенных версий.
 
Последнее редактирование:

MrGreen86

Гуру форума
Если торговля мультивалютная и ордера открываются и модернизируются по нескольким парам параллельно, как ты сможешь их учитывать?

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

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

Я вам дал вариант решения этой задачи. Очень простая функция которая даст вам номер тикета "огрызка". Это не "непроверенная вариация" а рабочий вариант который успешно работает в десятках советников.

Код:
int get_max_ticket(string symbol, int magic) {
   int k,max_ticket=-1;
   for(k=OrdersTotal()-1;k>=0;k--) {
      if(!OrderSelect(k,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderMagicNumber()!=magic) continue;
      if(OrderSymbol()!=symbol) continue;
      if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
      }
   return(max_ticket);
   }

Также mobidik предлагал тоже рабочее решение с двумя массивами тикетов.
Вы сбросили закрытую библиотеку. Делать выводы по вашему варианту невозможно.
 
Последнее редактирование:

vladradon

Программист
Я на этот счет даже не заморачивался - вопрос стоит в том, как вычислить ордер с новым тикетом, который сгенерирован брокером и продолжить его курировать. У меня это получилось и работает, а здесь (на этом форуме) я вижу только вариации непроверенных версий.
Кстати, в своем последнем сове я использовал один вариант определения измененного ордера (мультивалютый вариант торговли с функцией частичного закрытия) а другой вариант в сове-трале виртуальный трал на любое количество ордеров - короче 2 варианта и оба рабочие и пока, уважаемые коллеги, ваши варианты гораздо сложнее и далеки от моих. Хотя твой вариант, Саш, с запоминанием в массивы текущие данные, у меня работает уже больше года, но не в таком варианте, как ты предлагал и в свой вариант я добавил вариант частичного закрытия буквально меньше месяца назад. Вот так... как-то...
 
Верх