Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1511

 
Vitaly Muzichenko:

Ну у меня другая цель преследовалась помимо экономии.

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

Небольшая вырезка, код немного усечён, но логика понятна:

Индикатор

// Открыть позиции
   // Открыть позицию Buy
   if(sparam==prefix+"_openBuy") {
     BroadcastEvent(gMagic,edLots,_symbol);
     ObjectSetInteger(0,prefix+"_openBuy",OBJPROP_STATE,false);
     ChartRedraw();
   }
   // Открыть позицию Sell
   if(sparam==prefix+"_openSell") {
     BroadcastEvent(gMagic,edLots,_symbol);
     ObjectSetInteger(0,prefix+"_openSell",OBJPROP_STATE,false);
     ChartRedraw();
   }

//===============================================================================================
//------------------ Функция посылает сообщение всем открытым графикам -------------------------+
//===============================================================================================
void BroadcastEvent(long lparam,double dparam,string sparam) {
 ushort eventID=9784-CHARTEVENT_CUSTOM;
 long currChart=ChartFirst(); 
 int i=0; 
  while(i<CHARTS_MAX)                // у нас наверняка не больше CHARTS_MAX открытых графиков 
   { 
    EventChartCustom(currChart,eventID,lparam,dparam,sparam); 
    currChart=ChartNext(currChart); // на основании предыдущего получим новый график 
    if(currChart==-1) break;        // достигли конца списка графиков 
    i++;                            // не забудем увеличить счетчик 
   } 
 }

Советник

// -- Получим нажатие кнопки с индикатора
// Открыть позицию
 if(id==9784)     
  {
   if(UseSound) PlaySound("tick.wav");
   OpenPosition(sparam,OP_BUY,dparam,0,0,"comm",(int)lparam,clrNONE);
  }
 
Aleksei Stepanenko:

А где индикатор-то? Прикрепите, пожалуйста, его сюда, чтобы не бродить по веткам форума.

индикатор
Файлы:
 
Да, я ещё подумывал записать советником ChartID своего графика в глобальную переменную терминала, тогда все индикаторы знают, куда отправлять событие. Точечно без  BroadcastEvent.
 
Aleksei Stepanenko:
Да, я ещё подумывал записать советником ChartID своего графика в глобальную переменную терминала, тогда все индикаторы знают, куда отправлять событие. Точечно без  BroadcastEvent.

Глоб.переменная - тот-же файл, с ним терминал работает напряжённо и убивает диск, да и чекать его потиково - нецелесообразно, тот-же цикл, только в профиль :)

 
frank2020:
индикатор
И что вы хотите получить из этого индикатора?
 
frank2020:
индикатор

Если что, взят отсюда

Ищу канальные индикаторы для MT5
Ищу канальные индикаторы для MT5
  • 2017.03.28
  • www.mql5.com
Все привет, ищу любые канальные индикаторы, которых нет по умолчанию в MT5 Нужны для оптимизации ТС (какой их индикаторов покажет устойчивые резуль...
 
Vitaly Muzichenko:

Глоб.переменная - тот-же файл, с ним терминал работает напряжённо и убивает диск, да и чекать его потиково - нецелесообразно, тот-же цикл, только в профиль :)

Не, не. Один раз при запуске советника, он пишет номер своего графика в глобальную переменную. Далее один раз при запуске индикатор читает эту переменную, и далее каждый раз при создании объекта отправляет событие только на график с советником.
 
Vitaly Muzichenko:

Глоб.переменная - тот-же файл, с ним терминал работает напряжённо и убивает диск, да и чекать его потиково - нецелесообразно, тот-же цикл, только в профиль :)

тот же файл если принудительно флушить, в остальное время во многом из ram идет работа

 

Вообще нормальный передатчик между советниками/индикаторами получается:

приемник:

int OnInit()
   {
   GlobalVariableSet("A",ChartID());
   return(INIT_SUCCEEDED);
   }

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 
   {
   if(id==CHARTEVENT_CUSTOM+777)
      {
      printf("Сообщение принято: "+sparam);
      }
   }

передатчик:

int OnInit()
   {
   long a=(long)GlobalVariableGet("A");
   EventChartCustom(a,777,0,0,"Превед медвед!");
   return(INIT_SUCCEEDED);
   }

Без нагрузки на процессор.

 
Aleksei Stepanenko:

Вообще нормальный передатчик между советниками/индикаторами получается:

не нормальный, по 8 байт замучаешься передавать что-нибудь

хотя будет работать - @fxsaber библу делал, кажется TypeToByte использует, чтобы обмен организовать более сложными структурами


ЗЫ: коллизии как обрабатывать будешь? - имхо, все дороги ведут в БД по обмену данными, 90% работы за тебя делают и очень качественно