советник - разные вопросы - страница 29

 
honest_knave:
Опубликуйте свой код, где вы получаете OrderTicket, чтобы сделать имя.

(Когда кому-то нужен код - я задерживаюсь, чтобы быстро его опубликовать - потому что я использую функции OBJECT_****, это мало отличается от документации объектов)

Приведенный ниже код находится в OnTick().

for(i=OrdersTotal()-1;i>=0;i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(Symbol()!=OrderSymbol()) continue;
   ObjectCreate(0,"#"+IntegerToString(OrderTicket())+" -"+"Object Button",OBJ_BUTTON,0,0,0);
  }

Теперь я пытаюсь вызвать этот объект через OnChartEvent(), как показано ниже.

if(id==CHARTEVENT_OBJECT_CLICK && sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
  {
   // when click this button - do something...
  }

Заранее спасибо.

 
он не находится внутри orderloop, поэтому он не будет знать OrderTicket().
 
Marco vd Heijden:
он не находится внутри orderloop, поэтому он не будет знать OrderTicket().
Так что, нет никаких шансов?
 
Max Enrik:
Так что, шансов нет?

Большинство вещей возможно. Но мне неясно, чего вы пытаетесь добиться. Что это за кнопка? Что вы хотите сделать, когда ее нажимают?

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

 
honest_knave:

Большинство вещей возможно. Но мне неясно, чего вы пытаетесь добиться. Что это за кнопка? Что вы хотите сделать, когда ее нажимают?

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


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

Я писал этот комментарий с мобильного устройства. Поэтому я начну исследовать этот вопрос спустя 10 часов. Спасибо за ваши комментарии.
 
Max Enrik:

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

Я писал этот комментарий с мобильного устройства. Поэтому я начну исследовать этот вопрос спустя 10 часов. Спасибо за ваши комментарии.

Иметь уникальный тег в именах объектов, который идентифицирует эти кнопки. Похоже, что вы используете "#".

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is one of your order buttons being clicked

Затем извлеките номер заказа либо из остальной части имени объекта, либо из текста кнопки.

На данном этапе нет необходимости использовать OrderTicket().

 

Его объекты идентифицируются по ордерному билету.

"#"+IntegerToString(OrderTicket())+" -"+"Object Button"

Таким образом, каждый объект имеет номер билета в его строковом имени, чтобы можно было найти, к какому ордеру принадлежит объект.

Это означает, что каждый объект будет содержать "#" в своем строковом имени.

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

Или он может просто

SELECT_BY_TICKET

Чтобы выбрать ордер внутри события графика.

Теперь было бы намного проще, если бы он просто передал объекту номер/имя билета и ничего больше.

ObjectCreate(0,"IntegerToString(OrderTicket()),OBJ_BUTTON,0,0,0);

Потому что тогда он может просто напрямую выбрать билет или сравнить номера.

 

Я в прошлый день пробовал цикл OrderSelect(). Теперь я попробую еще раз в ближайшее время.
Затем я буду глубоко изучать ваши последние комментарии.

Спасибо за ваше ценное время.

 

Я попробовал нижеприведенный код в моем файле test.mq4, так что нижеприведенный код работает отлично, и пока что я не сталкивался с какими-либо проблемами, но я все еще тестирую его.

Вопрос: Не могли бы вы улучшить приведенный ниже код, если он плох?

if(id==CHARTEVENT_OBJECT_CLICK)
  {
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;

      if(sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
        {
         if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE))
           {
            Print("# Error ",GetLastError());
           }
        }
     }
  }

Заранее спасибо.

(Я работаю над этим)

 

Беглый осмотр показывает, что это должно работать. Но эффективность можно повысить.

Подумайте о том, сколько различных объектов вы нарисовали на своем графике. Если вы щелкните *любой* из этих объектов, вы будете перебирать все ордера и пытаться найти совпадение. Многие объекты, вероятно, не имеют никакого отношения к ордерам. Это неэффективно.

Именно поэтому я предложил проверять первый символ sparam на "#". Это автоматически идентифицирует объект как имеющий отношение к заказу.

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

Пример:

Вы открываете заказ. Ему присвоен номер билета 12345

Создайте OBJ_BUTTON с именем"#12345".

Код в OnChartEvent() будет примерно таким (некомпилированный, непроверенный, поздно ночью...):

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is an order button
  {
   int ticket=(int)StringSubstr(sparam,1); // extract the ticket number
   if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order
     {
      if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order
        {
         Print("# Error ",GetLastError());
        }
     }
  }
(вероятно, вы захотите обработать и OrderSelect, на случай неудачи)
Причина обращения: