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

 
LSM:
Отредактировал свой вопрос, добавил код. Там идет цикл. Не понятно что я получу когда это происходит в цикле.
Все там понятно,
к примеру, в цикле индикатор пересчитал 15ю.   5минутную свечу
при этом взял значение с 15+1.  16той  15минутной свечи.


 
LSM:

Отвечу на свой же вопрос, вдруг кому пригодится )

Так правильно.
 

Доброго дня.

Подскажите плз, пришла идея, а с какой стороны подойти пока " не догоняю".

Есть индикатор, к нему открыл доступ для определенного перечня номеров счетов из CSV файла размещенного на сервере.

Можно ли технически написать сообщение для конкретного счета из перечня, чтобы оно выводилось на график у этого конкретного пользователя.

Например, в CSV указываю номер счета и пишу текст например "Hello..." и пользователь его видит на графике? Если такое вообще возможно, то в какую сторону "копать"? Спасибо...

 

Добрый день. Не могли бы помочь с пониманием кое-каких особенностей синтаксиса mql4? Есть идея написать советник для торговли по тренду, который бы, например, входил в длинную со стопом в 150 пунктах от уровня открытия ордера и тейком в 50, и далее, если цена доходила до tp, открывалась новая покупка со стопом в 150, а тейкпрофитом - 50, а если выбивало по stop loss, осуществлялась бы продажа с таким же соотношением риск/прибыль, как в случаях с лонгами. Была предпринята попытка написать код с такой логикой, но успехом она не увенчалась, так как советник вообще никаких сделок не совершает при тестировании.

double b, difference;
int ticket;

int OnInit()
{
   b=Bid;
   return(b);
}

void OnTick()
{
   difference = Bid-b;
   if(OrdersTotal()==0)
   {
      if(difference==150*Point)
      {
         ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,Ask-150*Point,Ask+50*Point,0);
         if(difference==0){b=Bid+150*Point;}
            if(ticket<0)
            {
               Print("lose");
            }
      }
      if(difference==200*Point){b=Bid-150*Point;}

      if(difference==-150*Point)
      {
         ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Bid+150*Point,Ask-50*Point,0);
         if(difference==0){b=Bid-150*Point;}
            if(ticket<0)
            {
               Print("lose");
            }
      }
      if(difference==-200*Point){b=Bid+150*Point;}
   }
}
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 ( MQL5 ), среда разработки MetaEditor и...
 
MosheDayan:

Доброго дня.

Подскажите плз, пришла идея, а с какой стороны подойти пока " не догоняю".

Есть индикатор, к нему открыл доступ для определенного перечня номеров счетов из CSV файла размещенного на сервере.

Можно ли технически написать сообщение для конкретного счета из перечня, чтобы оно выводилось на график у этого конкретного пользователя.

Например, в CSV указываю номер счета и пишу текст например "Hello..." и пользователь его видит на графике? Если такое вообще возможно, то в какую сторону "копать"? Спасибо...

Посылать на сервер post-запрос с номером счёта

IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN)

На сервере сверять пришедший номер со всеми строками в файле CSV, и если есть совпадение, то с этой строки файла посылать в ответе в терминал сообщение. Осталось прочесть ответ от сервера в терминале, и вывести его на график.

Вообще, такие вещи проще реализовывать на MySQL, чем на файле.

 
Maxim235v34:
И да, если не сложно, подскажите способ уменьшения расстояния между строк на этом форуме.

Пишите сначала в текстовый файл (в блокноте) - потом копируйте через буфер обмена. Получится так

double b, difference;
int ticket;

int OnInit()
{
   b=Bid;
   return(b);
}

void OnTick()
{
   difference = Bid-b;
   if(OrdersTotal()==0)
   {
      if(difference==150*Point)
      {
         ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,Ask-150*Point,Ask+50*Point,0);
         if(difference==0){b=Bid+150*Point;}
            if(ticket<0)
            {
               Print("lose");
            }
      }
      if(difference==200*Point){b=Bid-150*Point;}

      if(difference==-150*Point)
      {
         ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Bid+150*Point,Ask-50*Point,0);
         if(difference==0){b=Bid-150*Point;}
            if(ticket<0)
            {
               Print("lose");
            }
      }
      if(difference==-200*Point){b=Bid+150*Point;}
   }
}
прочитайте про функцию OnInit() - поставьте на нее курсор и нажмите F1. Впереди стоит слово int - значит функция возвращает целое значение. а Вы пытаетесь вернуть значение типа double. Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала и ему это значение вряд ли нужно
 
LRA:

Пишите сначала в текстовый файл (в блокноте) - потом копируйте через буфер обмена. Получится так

Спасибо. Буду знать.

прочитайте про функцию OnInit() - поставьте на нее курсор и нажмите F1. Впереди стоит слово int - значит функция возвращает целое значение. а Вы пытаетесь вернуть значение типа double. Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала и ему это значение вряд ли нужно
Тогда каким обработчиком события с каким типом надо пользоваться, чтобы реализовать задуманное - 
зафиксировать значение цены в начале работы программы, относительно которого будут выполняться будущие вычисления?
Попробовал удалить всё, что было в int OnInit, и прописать в void OnTick в самом начале, добавив переменную varStart, следующее:
if(varStart==0)
   {
      b=Bid;
      varStart=1;
   }
Результат не изменился.
 

Есть функция с поинтером:


  TickReturn *returntick(int period, int timeposition)
   {
      TickReturn *returntick = new TickReturn();
      MqlRates rates[];
      MqlTick last_tick;
      
      if(SymbolInfoTick(symbol,last_tick)){}
      else Print("SymbolInfoTick() failed, error = ",GetLastError());
      
      //int timeposition=0;
      ArraySetAsSeries(rates,true);
      ArrayResize(rates,1);
      int copied=CopyRates(symbol,period,timeposition,1,rates);
      
      returntick.curtime = rates[0].time;
      returntick.open = rates[0].open;
      returntick.close = rates[0].close;
      returntick.high = rates[0].high;
      returntick.low = rates[0].low;
      returntick.priceask = last_tick.ask;
      returntick.pricebid = last_tick.bid;
      
      return(returntick);

   } 

Я еще в другой функции вызываю:


string timeis = returntick(period, 1).curtime;

А как почистить память за ней?

На delete(TickReturn); у меня ошибка operand excepted.

 
hamsteruser:

Есть функция с поинтером:


Я еще в другой функции вызываю:


А как почистить память за ней?

На delete(TickReturn); у меня ошибка operand excepted.


Если я правильно читаю Ваш код, то  TickReturn - это класс. Вы создали указатель на переменную с типом этого класса. а уничтожаете... сам класс??? Уничтожать нужно указатель, причем предварительно проверить что он существует и является динамическим.

 
Алексей Барбашин:

Если я правильно читаю Ваш код, то  TickReturn - это класс. Вы создали указатель на переменную с типом этого класса. а уничтожаете... сам класс??? Уничтожать нужно указатель, причем предварительно проверить что он существует и является динамическим.


*returntick тоже не уничтожается. Меня просто выхлоп торгового терминала запутал. Пишет про неочищенную память.

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