Как совместить функцию в OnTick и OnChartEvent ??? возможно ли?

 

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

but();

в 

void OnTick()
  {
//---

  }

при условии что это всё должно находиться в:

OnChartEvent

И я не могу понять как это осуществить, кидаю but(); в OnChartEvent но тогда не правильная работа, нужно и туда и туда
Кому не сложно пожалуйста помогите)))

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//Если мышка в границах реагирования то реагируем
   if(id==CHARTEVENT_MOUSE_MOVE && lparam>=X1 && lparam<=X2 && dparam>=Y1 && dparam<=Y2)
     {
      if(!ShowMenu){CreateMenu();}//Если меню нет на чарте то создаём его
     }
//Если мышка вне границ реагирования то проверяем
   if(id==CHARTEVENT_MOUSE_MOVE && (lparam<X1 || lparam>X2 || dparam<Y1 || dparam>Y2))
     {
      if(ShowMenu){DeleteMenu();}//Если меню есть на чарте то удаляем
     }
//Реагируем на нажатие на объекты     
   if(id==CHARTEVENT_OBJECT_CLICK && sparam==Prefix+"M1")
     {
               but();
      ChangeMenu(sparam);
     }
   if(id==CHARTEVENT_OBJECT_CLICK && sparam==Prefix+"M2")
     {
      ChangeMenu(sparam);
     }
   if(id==CHARTEVENT_OBJECT_CLICK && sparam==Prefix+"M3")
     {
      ChangeMenu(sparam);
     }
  }


void but()
  {
......
  }
 
Dmitry Ivkin:

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

в 

при условии что это всё должно находиться в:

И я не могу понять как это осуществить, кидаю but(); в OnChartEvent но тогда не правильная работа, нужно и туда и туда
Кому не сложно пожалуйста помогите)))


Вы бы рассказали что делает but();. В теории язык не запрещает использовать её и в OnTick()  и в OnChartEventt() одновременно.

 
Sergey Kolemanov:

Вы бы рассказали что делает but();. В теории язык не запрещает использовать её и OnTick()  и OnChartEventt() одновременно.

Спасибо за ответ, не знаю правильно вы меня поняли или нет, мне нужно чтобы код:

but();   - панель управления ордерами

находилась в 

OnChartEventt() 

т.к вся эта панель открывается через кнопку на экране

но она не корректно работает т.к должна находиться в:

OnTick() 

и я спрашиваю, как сделать так чтобы она была и так и там(не просто туда и сюда вставить, а именно 1 раз использовалась but(); в OnChartEventt() и сразу же в OnTick() 

Не знаю поняли вы меня или нет)) пожалуйста ответьте.
Спасибо

 
сделайте отдельно условия для "свернуть" и отдельно для "развернуть". То есть, если кнопка нажата - делаем это (разворачиваем всю панель и элементы в ней), если не нажата - удаляем нужные элементы если они есть
 
Вот пример моего советника, панели сворачиваются/разворачиваются:
Файлы:
EURUSDM1_.png  89 kb
EURUSDM1__.png  68 kb
 
Dmitry Ivkin:

Спасибо за ответ, не знаю правильно вы меня поняли или нет, мне нужно чтобы код:

находилась в 

т.к вся эта панель открывается через кнопку на экране

но она не корректно работает т.к должна находиться в:

и я спрашиваю, как сделать так чтобы она была и так и там(не просто туда и сюда вставить, а именно 1 раз использовалась but(); в OnChartEventt() и сразу же в OnTick() 

Не знаю поняли вы меня или нет)) пожалуйста ответьте.
Спасибо

К сожалению, Вы не многословен). Как же Вас понять, если Вы толком ничего не объяснили... А да, ещё код выложили, где стандартный шаблон советника и названия функций, которые непонятно что выполняют. Здесь нет телепатов, хотите чтоб помогли, покажите код и дайте внятное описание проблемы.

Теперь по теме: если правильно понял, Вашу функцию лучше разбить на несколько функций, каждая из которых будет заниматься "своим делом".

 

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

Иными словами, либо не правильно работает сама панель управления, либо она работает но не работают кнопки :)))
ребят помогите пожалуйста разобраться

 

 
//+------------------------------------------------------------------+
void OnTick()
  {
   but();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void but()
  {
   proverca_sl_tp_ti();
   proverca_br_tr();
   if(ObjectFind(0,prefix+"TradeLine")!=0) // Если не создан обьект управления
      ButtonCreate(0,"TradeLine",0,5,15,90,7,0,"-------------------","Arial",10,clrBlack,C'236,233,216',clrNONE,false,false,true); // Создадим обьект управления меню

   int x0=(int)IntGetX ("TradeLine");
   int y0=(int)IntGetY ("TradeLine");

   ButtonCreate(0,"Lots",0,x0,y0+14,90,16,0,"LOTS "+DoubleToStr(glot,2),"Arial",10,clrBlack,C'236,233,216'); // Создадим кнопку лотов
   ButtonCreate(0,"Buy",0,x0,y0+34,90,16,0,"BUY","Arial",10,clrBlack,C'236,233,216');                        // Создадим кнопку Бай ордеров
   ButtonCreate(0,"Sel",0,x0,y0+54,90,16,0,"SELL","Arial",10,clrBlack,C'236,233,216');                       // Создадим кнопку Селл ордеров
   ButtonCreate(0,"BuyL",0,x0,y0+74,90,16,0,"BUY LIMIT","Arial",10,clrBlack,C'236,233,216');                 // Создадим кнопку Бай лимит ордеров
   ButtonCreate(0,"SelL",0,x0,y0+94,90,16,0,"SELL LIMIT","Arial",10,clrBlack,C'236,233,216');                // Создадим кнопку Селл лимит ордеров
   ButtonCreate(0,"BuyS",0,x0,y0+114,90,16,0,"BUY STOP","Arial",10,clrBlack,C'236,233,216');                 // Создадим кнопку Бай стоп ордеров
   ButtonCreate(0,"SelS",0,x0,y0+134,90,16,0,"SELL STOP","Arial",10,clrBlack,C'236,233,216');                // Создадим кнопку Селл стоп ордеров
   ButtonCreate(0,"ScreenShot",0,x0,y0+154,90,16,0,"SCREENSHOT","Arial",9,clrBlack,C'236,233,216');          // Создадим кнопку Скриншотов
   ButtonCreate(0,"TimeT",0,x0,y0+174,90,16,0,"Time","Arial",9,clrBlack,C'236,233,216');          // Создадим кнопку Скриншотов
   ChartRedraw(0);

   if(but_stat(prefix+"TimeT")==true)
      tim();
   else
      obj_del("clock");

   if(but_stat(prefix+"LOTS")==true) // Если нажата кнопка лотов
     {
      for(int i=0; i<=20; i++)
        {
         ButtonCreate(0,StringConcatenate("lot",i),0,x0+105,y0+15+20*i,50,18,0,DoubleToStr(wlot*(i+1),2),"Arial",10,clrBlack,C'236,233,216'); // Нарисуем 20 кнопок выбора лотов с лотами
         if(but_stat(StringConcatenate(prefix,"lot",i))==true) // Определим какая кнопка нажата
           {
            glot=wlot*(i+1);                                                                                  // Запомним лот кнопки
            button_off(StringConcatenate("lot",i));                                                           // Отожмем кнопку выбора лотов с выбранным лотом
            button_off("LOTS");                                                                               // Отожмем кнопку выбора лотов
           }
        }
     }
   else                                                                                                       // Иначе
   for(int xx=0; xx<=20; xx++)
              ObjectDelete(StringConcatenate(prefix,"lot",xx));                                               // Удалим все кнопки
   ChartRedraw(0);

   double Dist=NormalizeDouble(Stop_Limit*_Point,_Digits);
   if(but_stat(prefix+"Buy")==true) // Если нажата кнопка
      if(openorders(_Symbol,0,glot)==true) // откроем ордер
         button_off("Buy");                            // Переведем кнопку в отключенное состояние
   if(but_stat(prefix+"Sel")==true) // Если нажата кнопка
      if(openorders(_Symbol,1,glot)==true) // откроем ордер
         button_off("Sel");                            // Переведем кнопку в отключенное состояние
   if(but_stat(prefix+"BuyL")==true) // Если нажата кнопка
      if(openorders(_Symbol,2,glot,Ask-Dist)==true) // откроем орде
         button_off("BuyL");                           // Переведем кнопку в отключенное состояние
   if(but_stat(prefix+"SelL")==true) // Если нажата кнопка
      if(openorders(_Symbol,3,glot,Bid+Dist)==true) // откроем орде
         button_off("SelL");                           // Переведем кнопку в отключенное состояние
   if(but_stat(prefix+"BuyS")==true) // Если нажата кнопка
      if(openorders(_Symbol,4,glot,Ask+Dist)==true) // откроем орде
         button_off("BuyS");                           // Переведем кнопку в отключенное состояние
   if(but_stat(prefix+"SelS")==true) // Если нажата кнопка
      if(openorders(_Symbol,5,glot,Bid-Dist)==true) // откроем орде
         button_off("SelS");                           // Переведем кнопку в отключенное состояние

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic || Magic==-1)
            if(OrderSymbol()==_Symbol)
              {
               x=y=0;ChartTimePriceToXY(0,0,(OrderOpenTime()),OrderOpenPrice(),x,y);  // Вернем в пикселях координаты цены и времени открытия ордера
               if(ObjectFind(StringConcatenate(prefix+"Re",OrderTicket()))!=0)        // Если нет кнопки управления меню ордеров
                  ButtonCreate(0,StringConcatenate("Re",OrderTicket()),0,x,y,ButX+5,BuyY,0,"< >","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,true,true,0,"Move the menu");     // Создадим обьект
               SetX(StringConcatenate(prefix+"Re",OrderTicket()),y);                                                                                                                     // Кнопка всегда должна быть на уровне цены открытия ордера
               int x2=(int)IntGetX (StringConcatenate("Re",OrderTicket()));                                                                                                              // Запросим координаты Х обьекта управления меню ордеров
               int y2=(int)IntGetY (StringConcatenate("Re",OrderTicket()));                                                                                                              // Запросим координаты У обьекта управления меню ордеров
               ButtonCreate(0,StringConcatenate("Sl",OrderTicket()),0,x2+25,y2,ButX,BuyY,0,"Sl","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,false,true,0,"StopLoss");          // Создадим кнопку стоп лосса
               ButtonCreate(0,StringConcatenate("Tp",OrderTicket()),0,x2+45 ,y2,ButX,BuyY,0,"Tp","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,false,true,0,"TakeProfit");       // Создадим кнопку тейк профита
               ButtonCreate(0,StringConcatenate("Br",OrderTicket()),0,x2+65 ,y2,ButX,BuyY,0,"Br","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,false,true,0,"Breakeven");        // Создадим кнопку безубытка
               ButtonCreate(0,StringConcatenate("Tr",OrderTicket()),0,x2+85 ,y2,ButX,BuyY,0,"Tr","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,false,true,0,"Ttrailing Stop");   // Создадим кнопку трейлинг стопа
               ButtonCreate(0,StringConcatenate("Ti",OrderTicket()),0,x2+105,y2,ButX,BuyY,0,"Ti","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,false,true,0,"Time Close");       // Создадим кнопку для времени жизни ордера
               ButtonCreate(0,StringConcatenate("Xx",OrderTicket()),0,x2+125,y2,ButX,BuyY,0,"X","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,false,true,0,"Close Order");       // Создадим кнопку закрытия/удаления ордера
              }
// --- Создадим переменные 
   int tik=-1,typ=-1;
   string nameX="",nameTP="",nameSL="",nameBR="",nameTR="",nameTI="";
   double op=0;
   for(int i=OrdersTotal()-1; i>=0; i--)                                                               // Цикл перебора ордеров
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                                                     // Разбор ордера на части
         if(OrderMagicNumber()==Magic || Magic==-1)                                                    // Проверка на мейджик номер
            if(OrderSymbol()==_Symbol)                                                                 // Проверка на символ ордера
              {
               tik=OrderTicket();                                                                      // Запомним тиккет
               typ=OrderType();                                                                        // Запомним тип ордера
               op=OrderOpenPrice();                                                                    // Запомним цену открытия ордера
               nameX =StringConcatenate(prefix,"Xx",tik);                                              // Создадим имя для кнопки закрытие ордеров
               nameTP=StringConcatenate(prefix,"Tp",tik);                                              // Создадим имя для кнопки тейк профита
               nameSL=StringConcatenate(prefix,"Sl",tik);                                              // Создадим имя для кнопки стоп лосса
               nameBR=StringConcatenate(prefix,"Br",tik);                                              // Создадим имя для кнопки безубытка
               nameTR=StringConcatenate(prefix,"Tr",tik);                                              // Создадим имя для кнопки трейлинг стопа
               nameTI=StringConcatenate(prefix,"Ti",tik);                                              // Создадим имя для кнопки закрытия по времени
               if(ObjectGetInteger(0,nameX,OBJPROP_STATE)==true) closeorders(tik);                     // Если нажата кнопка крестик закроем или удалим ордер

               if(typ==0 )
                 {
                  if(but_stat(nameTP)==true)                                                           // Если нажата кнопка тейк профит
                     obj_cre(StringConcatenate("tp",tik),(Ask+tp),clrGreen);                           // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("tp",tik));                                             // Удалим метку

                  if(but_stat(nameSL)==true)                                                           // Если нажата кнопка стоп лосса
                     obj_cre(StringConcatenate("sl",tik),(Bid-sl),clrRed);                             // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("sl",tik));                                             // Удалим метку
                 }
               if(typ==1 )
                 {
                  if(but_stat(nameTP)==true)                                                           // Если нажата кнопка тейк профит
                     obj_cre(StringConcatenate("tp",tik),(Bid-tp),clrGreen);                           // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("tp",tik));                                             // Удалим метку

                  if(but_stat(nameSL)==true)                                                           // Если нажата кнопка стоп лосса
                     obj_cre(StringConcatenate("sl",tik),(Ask+sl),clrRed);                             // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("sl",tik));                                             // Удалим метку
                 }
                 
               if(typ==2 || typ==4)
                 {
                  if(but_stat(nameTP)==true)                                                           // Если нажата кнопка тейк профит
                     obj_cre(StringConcatenate("tp",tik),(op+tp),clrGreen);                           // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("tp",tik));                                             // Удалим метку

                  if(but_stat(nameSL)==true)                                                           // Если нажата кнопка стоп лосса
                     obj_cre(StringConcatenate("sl",tik),(op-sl),clrRed);                             // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("sl",tik));                                             // Удалим метку
                 }
               if(typ==3 || typ==5)
                 {
                  if(but_stat(nameTP)==true)                                                           // Если нажата кнопка тейк профит
                     obj_cre(StringConcatenate("tp",tik),(op-tp),clrGreen);                           // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("tp",tik));                                             // Удалим метку

                  if(but_stat(nameSL)==true)                                                           // Если нажата кнопка стоп лосса
                     obj_cre(StringConcatenate("sl",tik),(op+sl),clrRed);                             // Высавим метку
                  else                                                                                 // Иначе
                  obj_del(StringConcatenate("sl",tik));                                             // Удалим метку
                 }




                 
               if(but_stat(nameBR)==true) // Если нажата кнопка безубытка
                 {
                  if(((Ask-br)>op) && typ==0) obj_cre(StringConcatenate("br",tik),op,clrGreen);        // Высавим метку безубытка
                  if(((Bid+br)<op) && typ==1) obj_cre(StringConcatenate("br",tik),op,clrGreen);        // Высавим метку безубытка
                 }
               else obj_del(StringConcatenate("br",tik));                                              // Удалим метку безубытка

               if(but_stat(nameTR)==true) // Если нажата кнопка трейлинг стопа
                 {
                  if(((Ask-tr)>op) && typ==0) obj_cre(StringConcatenate("tr",tik),op,clrGreen);        // Высавим метку трейлинг стопа
                  if(((Bid+tr)<op) && typ==1) obj_cre(StringConcatenate("tr",tik),op,clrGreen);        // Высавим метку трейлинг стопа
                 }
               else obj_del(StringConcatenate("tr",tik));                                              // Удалим метку трейлинг стопа

               if(but_stat(nameTI)==true)                                                              // Если нажата кнопка время жизни ордера
                  obj_cre_v_line(StringConcatenate("ti",tik),clrGreen);                                // Высавим метку
               else                                                                                    // Иначе
               obj_del(StringConcatenate("ti",tik));                                                // Удалим метку
              }

   his_del_obj();         // Функция удаляет обьекты закрытых или удаленных ордеров

   uroven();              // Функция для перетаскивания ордеров
  }

 
Помогите пожалуйста вот этот пример занести в кнопку, при условии чтобы сама панель корректно работала как и сейчас
 
Dmitry Ivkin:
Помогите пожалуйста вот этот пример занести в кнопку, при условии чтобы сама панель корректно работала как и сейчас

В коде который Вы прикрепили выше присутствует кнопка сворачивания/разворачивания панели? Если да какое у неё имя?

Ещё проверьте все места где Вы создаёте имя объекту с помощью StringConcatenate(...), например:

if(ObjectFind(StringConcatenate(prefix+"Re",OrderTicket()))!=0)        // Если нет кнопки управления меню ордеров
                  ButtonCreate(0,StringConcatenate("Re",OrderTicket()),0,x,y,ButX+5,BuyY,0,"< >","Arial",8,clrBlack,C'236,233,216',clrNONE,false,false,true,true,0,"Move the menu");     // Создадим обьект

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

 
Sergey Kolemanov:

В коде который Вы прикрепили выше присутствует кнопка сворачивания/разворачивания панели? Если да какое у неё имя?

Ещё проверьте все места где Вы создаёте имя объекту с помощью StringConcatenate(...), например:

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

Спасибо, да вы правы) но на эти ошибки сейчас нет толку, пожалуйста помогите с главной проблемой
Могли бы вы добавить

void but()
  {
///
  }

в кнопку

Понимаете проблема состоит в том что кнопка работает правильно только в OnChartEventt()
а панель ( тобишь 
but();) правильно работает только если находится в OnTick()

и вот незадача я не знаю как из неё выйти

Пожалуйста подскажите хоть что-нибудь

Причина обращения: