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

eevviill2

Местный знаток
А зачем он нужен, если этого ордера уже нет и не будет в рынке - его уже курировать не нужно. - Нужен ордер, который с уменьшенным лотом занял его место с автоматически сгенерированным тикетом самим брокером.;):nda:
Я обошел этот момент.:)
Дык.
Последний закрывшийся ордер. Там есть коментарий к ордеру где пишется тикет:D
 

vladradon

Программист
Хинт - новый ордер будет по той же паре и с теми же временем и ценой открытия

Хинт - новый ордер будет по той же паре и с теми же временем и ценой открытия
И как ты по времени сможешь отследить этот вновь открытый ордер?:not-bad:
А если торгуешь на 10-ти парах и сигнал параллельно пришел сразу по нескольким...
 
Последнее редактирование:

vladradon

Программист
Дык.
Последний закрывшийся ордер. Там есть коментарий к ордеру где пишется тикет
Все-таки можешь, если захочешь...;):D
Но есть еще варианты...
Весь смысл в том, чтобы вычислить новый ордер и прописать для него все уровни стоплоссов (виртуальных).
 
Последнее редактирование:

mobidik

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

1) Перед частичным закрытием: собираешь все тикеты открытых ордеров в массив А.
2) Производишь частичное закрытие ордера.
3) Снова собираешь тикеты всех открытых ордеров в другой массив - В.
4) Сравниваешь два массива: В с А, тикет, которого нет в массиве А и есть новый ордер.
5) Зная тикет - делаешь с ним что пожелаешь.
 

vladradon

Программист
1) Перед частичным закрытием: собираешь все тикеты открытых ордеров в массив А.
2) Производишь частичное закрытие ордера.
3) Снова собираешь тикеты всех открытых ордеров в другой массив - В.
4) Сравниваешь два массива: В с А, тикет, которого нет в массиве А и есть новый ордер.
5) Зная тикет - делаешь с ним что пожелаешь.
Это довольно сложный вариант и он один из первых, от которого я отказался. У меня так совпало, что я свою функцию решил модернизировать в плане отгрызывания от минусовых ордеров не уходя в минус и тут заказ поступил на виртуальный трал с несколькими уровнями стоплоссов и процентным закрытием по каждому уровню. Конечно, нужна обкатка, для тестов встроил в 3 своих сова - сам трал работает без вопросов, но положительных моментов нет. Я имею ввиду не работу моих сов и трала - нет улучшений в итоге, либо нужно точно настраивать.
 
Последнее редактирование:

mobidik

-----
Это довольно сложный вариант и он один из первых, от которого я отказался.

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

MrGreen86

Гуру форума
1) Перед частичным закрытием: собираешь все тикеты открытых ордеров в массив А.
2) Производишь частичное закрытие ордера.
3) Снова собираешь тикеты всех открытых ордеров в другой массив - В.
4) Сравниваешь два массива: В с А, тикет, которого нет в массиве А и есть новый ордер.
5) Зная тикет - делаешь с ним что пожелаешь.

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

и в комментарии у него будет указан тикет родительского ордера, это тоже можно использовать в определенных решениях. например если используется ступенчатое закрытие и нужно посчитать сколько у ордеров "родителей".
В комментарии у ордеров будет так:
у родительского 567890 : "to #567891"
у нового частичного 567891: "from #567890"
если новый частичный ордер закрыть то его комментарий изменится на "to #xxxxxx"
 

mobidik

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

А как быть, если сразу частично закрывается два и более ордеров, например, в сетке, мало ли...

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

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

если используется ступенчатое закрытие и нужно посчитать сколько у ордеров "родителей".
В комментарии у ордеров будет так:
у родительского 567890 : "to #567891"
у нового частичного 567891: "from #567890"
если новый частичный ордер закрыть то его комментарий изменится на "to #xxxxxx"

Вот с этим, соглашусь, так проще отыскать "родителя", нежели перебирать и фильтровать ордера по времени и лотности.
 

vladradon

Программист
решенее работает, но можно проще.
зная что тикеты присваиваются последовательно просто ордер с самым большим тикетом и будет новым ордером. С другими советниками не перепутается так как меджик он сохранит от "родительского" ордера.

и в комментарии у него будет указан тикет родительского ордера, это тоже можно использовать в определенных решениях. например если используется ступенчатое закрытие и нужно посчитать сколько у ордеров "родителей".
В комментарии у ордеров будет так:
у родительского 567890 : "to #567891"
у нового частичного 567891: "from #567890"
если новый частичный ордер закрыть то его комментарий изменится на "to #xxxxxx"
Так как этот ордер вычислить?))) Какой алгоритм?
 

MrGreen86

Гуру форума
А как быть, если сразу частично закрывается два и более ордеров, например, в сетке, мало ли...
советник закрыл и тут же отловил новый ордер.
можно просто функцией.
int get_max_ticket(string symbol, int magic) ...

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

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

я понимаю о чем вы говорите. часто у брокеров не пишется как закрылся ордер в коммертарии, у других пишется "[sl]". Какое то время у брокера на "Al" такой косяк был, но они воспринимали это как ошибку и обещали исправить, не сразу но исправили.
Но я не встречал разного написания комментариев у брокеров при частичном закрытии. Подозреваю что это как то зашито в серверной части и брокер не может на это повлиять.

Так как этот ордер вычислить?))) Какой алгоритм?
очень простой функцией сразу после частичного закрытия.

Код:
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

-----
MrGreen86,
Хочу услышать Ваше мнение как прогера: мне тут было заявлено, что предложенный мной вариант поиска тикета нового ордера с помощью массивов, что описал выше, в принципе не возможен и не будет работать. Вот такое категоричное заявление мне было сделано. Прошу Вас высказать свою точку зрения по предложенному мной варианту, а так же высказать свое мнение по поводу: что дольше будет обрабатываться: парочка массивов, скажем, размером в 100 или такое же наличие глобальных переменных (F3) с и без созданием горизонтальных линий на графике.
Заранее спасибо.
 

MrGreen86

Гуру форума
MrGreen86,
Хочу услышать Ваше мнение как прогера: мне тут было заявлено, что предложенный мной вариант поиска тикета нового ордера с помощью массивов, что описал выше, в принципе не возможен и не будет работать. Вот такое категоричное заявление мне было сделано. Прошу Вас высказать свою точку зрения по предложенному мной варианту, а так же высказать свое мнение по поводу: что дольше будет обрабатываться: парочка массивов, скажем, размером в 100 или такое же наличие глобальных переменных (F3) с и без созданием горизонтальных линий на графике.
Заранее спасибо.
Глупости, все будет работать, не вижу никаких проблем для этого.
с массивами будет проще и удобней. Не надо гадить в глобалках сотнями записей. Если не делать лишних ArrayResize и правильно провести сравнение с предварительный сортировкой то все будет летать.
 

mobidik

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

Спасибо.
что и требовалось услышать: все будет работать, с массивами будет проще и удобней, все будет летать.

PS.
Все мои аргументы были такими же, но отвергнуты оппонентом, уверен, что он увидит и прочтет Ваш ответ.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
MrGreen86,
Хочу услышать Ваше мнение как прогера: мне тут было заявлено, что предложенный мной вариант поиска тикета нового ордера с помощью массивов, что описал выше, в принципе не возможен и не будет работать. Вот такое категоричное заявление мне было сделано. Прошу Вас высказать свою точку зрения по предложенному мной варианту, а так же высказать свое мнение по поводу: что дольше будет обрабатываться: парочка массивов, скажем, размером в 100 или такое же наличие глобальных переменных (F3) с и без созданием горизонтальных линий на графике.
Заранее спасибо.
Если я правильно помню описание алгоритма, то ничего плохого в этом нет. Работать будет "на ура", только если не на каждом тике переписывать и сравнивать массивы.
Что касается времени открытия первого и последующих потомков его от частичного закрытия... Я как-то не задумывался об этом, но если это так, то это, на мой взгляд, самый удобный вариант.
Просто закрываешь часть ордера, читаешь время открытия и ищешь среди открытых, ордер с таким-же временем. Он и будет потомком...
Надо будет проверить...
 

MrGreen86

Гуру форума
Если я правильно помню описание алгоритма, то ничего плохого в этом нет. Работать будет "на ура", только если не на каждом тике переписывать и сравнивать массивы.
Что касается времени открытия первого и последующих потомков его от частичного закрытия... Я как-то не задумывался об этом, но если это так, то это, на мой взгляд, самый удобный вариант.
Просто закрываешь часть ордера, читаешь время открытия и ищешь среди открытых, ордер с таким-же временем. Он и будет потомком...
Надо будет проверить...

а если будет два ордера с таким же временем открытия? ошибка.
 

mobidik

-----
Если я правильно помню описание алгоритма, то ничего плохого в этом нет. Работать будет "на ура", только если не на каждом тике переписывать и сравнивать массивы.

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

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

vladradon

Программист
Это рабочий пока тестовый вариант если кто-то хочет проверить. Мне нужен номер счета (реального или демо и какого брокера мне не важно):
 

Вложения

  • VTrailingLib2.ex4
    21,6 КБ · Просмотры: 16
  • VTrailing1.2.mq4
    19,1 КБ · Просмотры: 21

vladradon

Программист
Я буду очень признателен, если кто-то меня переплюнет!:please:;)
 

vlad_123

Местный знаток
И как ты по времени сможешь отследить этот вновь открытый ордер?:not-bad:
А если торгуешь на 10-ти парах и сигнал параллельно пришел сразу по нескольким...

Время открытия вновь открываемого ордера будет равно времени открытия изначального ордера.
Мой сеточник торгует на 8ми парах, и нормально справляется.

Вот кусок кода:
Код:
      mySaveOpenDateTime = OrderOpenTime();
      mySaveOpenPrice = OrderOpenPrice();

      <частично закрываем selected ордер с номером myCurrTicket>

      RefreshRates();
      myCurrTicket = -1;
      for (int i=0; i<OrdersTotal(); i++) {
         if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
         if (mySaveOpenDateTime != OrderOpenTime()) continue;
         if (!DoublesAreEqual(mySaveOpenPrice, OrderOpenPrice())) continue;
         myCurrTicket = OrderTicket();
         i = OrdersTotal();//выходим из цикла
      }

После этого в myCurrTicket - номер нового частично закрытого ордера.
 

AlexeyVik

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