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

 
honest_knave:

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

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

Именно поэтому я предложил проверять первый символ 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, на случай неудачи).

Ого! Я не знал об этом.

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

Большое спасибо.

 

Я использую OrderTicket() для других объектов, теперь я вижу, когда я нажимаю на этот объект - заказ закрывается.
Мне понравился ваш метод, но похоже он влияет на другие объекты.

Другие объекты называются подобным образом, вот один из них.

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

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

 
Max Enrik:

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

Другие объекты называются подобным образом, вот один из них.

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

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

Более элегантное решение - изменить систему именования.

Тем не менее, вы все равно можете убрать номер заказа. Это просто зависит от точного формата именования.

Но прежде всего, каков OBJPROP_TEXT кнопки? Имеют ли какие-либо другие объекты такой же OBJPROP_TEXT?

 
honest_knave:

Более элегантное решение - изменить систему именования.
Тем не менее, вы все равно можете убрать номер заказа. Это просто зависит от точного формата именования.
Но прежде всего, каков OBJPROP_TEXT кнопки? Имеют ли другие объекты такой же OBJPROP_TEXT?

Да! Я знаю, что могу изменять имена объектов Button (также я использую Prefix), если я изменю имена кнопок, я смогу изменить много вещей, например, удалить систему и другие вещи, которые все связаны друг с другом.

Ниже приведены имена кнопок и HLine.

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

(конечно, имена объектов немного отличаются, но метод тот же).

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

 

Рынок закрыт

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

if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"close order button",0)>=0)

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

//--- 2-й раз редактировалось

Эй! Мужик!

Спасибо большое. Пока никаких проблем. Корректно работает!

 

#Кроссовер Объекты - Открыть

Я несколько раз сталкивался с этой проблемой, иногда проходил, иногда сдавался, сейчас не хотелось бы сдаваться еще раз.
У меня есть 2 объекта " HLine и Button " они пересекаются, то есть когда я нажимаю на один из них, оба выбираются, что не очень хорошо для меня. ( Ширина BUTTON = 20, ширина HLINE = как вы знаете )

Вопрос: Как я могу сделать так, чтобы при нажатии на BUTTON объект HLINE не выбирался, пока они пересекаются, пожалуйста?
( Я могу легко выбрать HLINE, где они не пересекаются )

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

(Я работаю над этим, любой хороший комментарий будет лучше, пожалуйста).

 

#Прибыль в пунктах - Открыто |#Прибыль в пунктах - Закрыто на данный момент - я решил эту проблему

Мистер Уильям- Я использую ваши " Pip, Point ... " коды расчета.
Теперь я пытаюсь получить прибыль в пипсах с помощью следующих кодов. У меня есть 2 ордера, один из них показывает правильно ( OP_BUY ), второй не показывает правильно - 399 - фактический 400 ( OP_SELL ).

Вопрос: Подскажите, пожалуйста, что я делаю неправильно при расчете прибыли в пунктах?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

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

( в последний день я проверил форумы на разных сайтах - это не принесло мне пользы )

 

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

Выпущен MetaTrader 4 Build 574 с обновленным языком MQL4 и рынком приложений

whroeder1, 2014.01.27 14:11

  1. Не пишите такой нечитабельный, непонятный код.
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    Делайте читабельный, упрощайте и всегда ставьте скобки, когда смешиваете ands/ors.
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. Как насчет случая, когда StartHour == EndHour (т.е. все 24?) Смотрите мой код и избегайте 24-часового обертывания.

Один из удивительных примеров оператора " if " для сложного условия от господина Уильяма.
Просто
спасибо!


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

 

Пожалуйста, кто-нибудь помогите мне, мне очень трудно решить эту проблему.

#296

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

 

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

(Сейчас я работаю над этим).

if(id==CHARTEVENT_OBJECT_CLICK && (StringFind(sparam,Button_1,0)>=0 || StringFind(sparam,Button_2,0)>=0))
  {
   ticketnumber=(int) StringSubstr(sparam,1);

   if(OrderSelect(ticketnumber,SELECT_BY_TICKET))
     {
      if(StringFind(sparam,Button_1,0)>=0)
        {
         // ...
        }

      if(StringFind(sparam,Button_2,0)>=0)
        {
         //...
        }

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

         update_1();
         update_2();
         update_3();
        }
     }
  }

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