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

 
yiduwi:

Помогите, как узнать первую координату времени линии тренда?

long  ObjectGetInteger( 
   long     chart_id,         // идентификатор графика 
   string   object_name,      // имя объекта 
   int      prop_id,          // идентификатор свойства 
   int      prop_modifier=0   // модификатор свойства, если требуется 
   );
 

Почему нельзя делать так объявил глобально переменную и массив и хочу сразу присвоить в массив значение из переменной.

int yo=6;
int masss[4]={0,0,yo,0};

И с функциями такая же беда если аргументу присвоить переменную ругается 

void Fulr(int ty=yo){}
 
Seric29:

Почему нельзя делать так объявил глобально переменную и массив и хочу сразу присвоить в массив значение из переменной.

И с функциями такая же беда если аргументу присвоить переменную ругается 

Документация по MQL5: Основы языка
Документация по MQL5: Основы языка
  • www.mql5.com
Язык MetaQuotes Language 5 (MQL5) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные экспертные системы, предназначенные для...
 
Alekseu Fedotov:

Благодарю.

 
Artyom Trishkin:

Нормально видимо сказать нельзя. В с++ так делать можно, я думаю это связано с тем что mql4 работает через дескриптор т.е. не имеет прямого доступа к памяти, т.к. каждое значение имеет адрес и если получить доступ к этому адресу можно узнать что там есть, это делает mql4 чрезмерно статическим и ограничивает многие возможности в особенности работу с массивами.

 

Есть ли возможность в советнике сделать два таймера? Я почему-то думал OnTimer() вызывается в отдельном потоке. Но попробовал добавить бесконечный цикл в OnInit(), а перед этим установил таймер, только цикл и работал, OnTimer() не вызывался.

Мне нужно два независимых действия выполнять постоянно по таймеру. Каждый со своим интервалом. Как это можно реализовать, не подскажете?

 
leonerd:

Есть ли возможность в советнике сделать два таймера? Я почему-то думал OnTimer() вызывается в отдельном потоке. Но попробовал добавить бесконечный цикл в OnInit(), а перед этим установил таймер, только цикл и работал, OnTimer() не вызывался.

Мне нужно два независимых действия выполнять постоянно по таймеру. Каждый со своим интервалом. Как это можно реализовать, не подскажете?

Например: считаете в таймере до ста и выполняете первый код, считаете до 150 и выполняете второй код. Но по-хорошему - класс мультитаймера нужно себе сделать.
 
Artyom Trishkin:

В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти на MQL5 - языки очень похожи.

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

Надеюсь, что к решению вопросов подтянутся другие опытные участники нашего форума, и ветка будет интересна всем.

Добрый день. Для самообучения и наработки практического опыта пишу пробный советник. Сейчас он умеет принимать сигнал от индикатора и есть функция для открытия BUY и SELL позиций ( Open_BUY_SELL() ). Эту функцию я слепил из скриптов, опубликованных в CodeBase.

ВОПРОС - могу ли я попросить кого-либо из ГУРУ этой ветки посмотреть получившийся код на предмет корявости. ???

Особые сомнения и опасеня у меня вызывают вот эти места:

    m_trade         = new CTrade();
    m_symbol        = new CSymbolInfo();   
    m_position_info = new CPositionInfo();   
    m_account       = new CAccountInfo();
    
    m_symbol.Name(Symbol());
    m_symbol.RefreshRates();

Уместно ли писать это внутри функции? Стоит ли перенести это в OnInit()? Функцию я сделал из двух скриптов, файлы приколоты к посту

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

CTrade         *m_trade;
CSymbolInfo    *m_symbol;
CPositionInfo  *m_position_info; 
CAccountInfo   *m_account;

Это место тоже смущает, если я правильно понимаю - объекты одних и тех же классов дублируют друг друга. Просто одни объявления остались от работы с индикатором, а другие от переделки скриптов в функцию.


Функцию с сигналом пока не связал, хочется сначала разобраться и подчистить код. Понимаю что где-то накосячил, а опыта и знаний, что-бы понять где именно и как сделать правильно, ещё не хватает.

Прошу поддержки.

 

Приложенные файлы - Советник, два скрипта и индикатор.

Компилятор не ругается, ошибок искать не придётся, только стратегически/тактические соображения нужны, на предмет - можно ли так делать и если сделано неверно, то как надо было. 

Плиз.

Файлы:
 
Artyom Trishkin:
Но по-хорошему - класс мультитаймера нужно себе сделать.

нельзя усложнять простые задачи! ... сказал Я, который от нефиг делать даже ф-цию определения нового бара в класс обернул ))))

по сабжу:

leonerd:

Есть ли возможность в советнике сделать два таймера? Я почему-то думал OnTimer() вызывается в отдельном потоке. Но попробовал добавить бесконечный цикл в OnInit(), а перед этим установил таймер, только цикл и работал, OnTimer() не вызывался.

Мне нужно два независимых действия выполнять постоянно по таймеру. Каждый со своим интервалом. Как это можно реализовать, не подскажете?


#property strict
//--- input parameters
input int      Timer1=13;
input int      Timer2=21;
static int timer1=0,timer2=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if((timer1++)>Timer1) { timer1 = 0; Print("Timer №1"); }
   if((timer2++)>Timer2) { timer2 = 0; Print("Timer №2"); }
  }
//+------------------------------------------------------------------+
Причина обращения: