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

 

Подскажите, пожалуйста, как запросить данные из Program.mqh?

есть такой код

//--- Определение точек
double stS=0,opS=0,stB=0,opB=0;
   if(ObjectsTotal(0,0,OBJ_TREND)>0)
      {
      stS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE1)+5*Point,Digits-1);
      opS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE2)-5*Point,Digits-1);
      stB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE1)-5*Point,Digits-1);
      opB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE2)+5*Point,Digits-1);
      }
как запросить данные точек в советнике?
 
MakarFX:

Подскажите, пожалуйста, как запросить данные из Program.mqh?

есть такой код

как запросить данные точек в советнике?

Всё, что нужно для получения объекта с любого графика это, имя объекта и идентификатор графика:

#property script_show_inputs

//--- input parameters
input long     chartID = 0;
input string   name = "OrderS";
input int      subwin = 0;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
//---
  double stS = 0, opS = 0, stB = 0, opB = 0;
  if(ObjectsTotal(chartID, subwin, OBJ_TREND) > 0) {
    stS = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE1) * Point, Digits);
    opS = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE2) * Point, Digits);
    stB = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE1) * Point, Digits);
    opB = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE2) * Point, Digits);
    Print("stS: ", stS, "; opS: ", opS, "; stB: ", stB, "; opB: ", opB, ".");
  }
}

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

Документация по MQL5: Операции с графиками / ChartID
Документация по MQL5: Операции с графиками / ChartID
  • www.mql5.com
Операции с графиками / ChartID - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mihail Matkovskij:

Всё, что нужно для получения объекта с любого графика это, имя объекта и идентификатор графика:

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

Вы меня не поняли...

выше указанный код находится в файле Program.mqh =>OnTimerEvent

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

Отсюда и вопрос: Как запросить данные из Program.mqh?

void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//--- Индикатор выполнения
   static int count1=0;
//--- Пауза между обновлением элементов
   static int count2=0;
   if(count2<200)
     {
      count2+=TIMER_STEP_MSC;
      return;
     }
//--- Обнулить счётчик
   count2=0;
//--- Определение точек
double stS=0,opS=0,stB=0,opB=0;
   if(ObjectsTotal(0,0,OBJ_TREND)>0)
      {
      stS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE1)+5*Point,Digits-1);
      opS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE2)-5*Point,Digits-1);
      stB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE1)-5*Point,Digits-1);
      opB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE2)+5*Point,Digits-1);
      }
  }
 
MakarFX:

Вы меня не поняли...

выше указанный код находится в файле Program.mqh =>OnTimerEvent

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

Отсюда и вопрос: Как запросить данные из Program.mqh?

Никто не мешает объявить переменные,

double stS = 0, opS = 0, stB = 0, opB = 0;

в public области класса CProgram и без проблем обращаться к ним из эксперта.

MakarFX:

Вы меня не поняли...

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

 
Mihail Matkovskij:

А к советнику подключен файл Program.mqh?...

Если да, то никто не мешает объявить переменные,

в глобальной области класса CProgram и без проблем получить обращаться к ним из эксперта.

файл Program.mqh подключе...

сейчас попробую объявить переменные гобально

 
MakarFX:

файл Program.mqh подключе...

сейчас попробую объявить переменные гобально

Отредактировал: https://www.mql5.com/ru/forum/160683/page1199#comment_17172497, поскольку Вы изначально меня запутали...

 
Mihail Matkovskij:

Никто не мешает объявить переменные,

в public области класса CProgram и без проблем получить обращаться к ним из эксперта.

не работает

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
  if (program.stS<0)::Print("ERROR");
  }


 
MakarFX:

не работает


Нужен исходник или код класса CProgram. Иначе, дела не будет...

Я имел в виду, сделать вот так:

class CProgram : ... {
...
public:
  double stS, opS, stB, opB;
...
Троеточия, это то, чего я не знаю о Вашем классе :)
 
Mihail Matkovskij:

Нужен исходник или код класса CProgram. Иначе, дела не будет...

Я имел в виду, сделать вот так:

Троеточия, это то, чего я не знаю о Вашем классе :)

Спасибо!!! Все получилось.

Я по незнанию поставил

public:
  double stS=0, opS=0, stB=0, opB=0;

убрал нули и все получилось.

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

 
MakarFX:

Спасибо!!! Все получилось.

Я по незнанию поставил

убрал нули и все получилось.

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

Еще одно. Желательно сделать инициализацю:

CProgram::CProgram():
  stS(0), opS(0), stB(0), opB(0)
{
  ...
}

Иначе, до тика таймера эксперт может получить случайные данные в переменных, если чтение производится в OnTick().