Вопрос по советнику на MQL4

 

Здравствуйте.

 Я делаю советника с двумя индикаторами (iMA двух разных периодов) код:

 

//+------------------------------------------------------------------+
//|                                                        уцкку.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

double IMA1BUF[];
double IMA2BUF[];

int OnInit()
  {
  
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  Blue
#property  indicator_width1  2




SetIndexBuffer(0,IMA1BUF);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2,clrBlue);
SetIndexBuffer(1,IMA2BUF);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2,clrRed);


   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  

double STOP=0.5;
double TAKE=1;

int MA1PER=100;
int MA2PER=20;

int MA1SHIFT=0;
int MA2SHIFT=-2;

ArraySetAsSeries(IMA1BUF,false);
ArraySetAsSeries(IMA2BUF,false);

int COUNTEDBARS;
int HISTORY=500;

int i;



IndicatorDigits(Digits);



COUNTEDBARS=IndicatorCounted();    // Количество просчитанных баров 
   i=Bars-COUNTEDBARS-1;              // Индекс первого непосчитанного
   if (i>HISTORY-1) i=HISTORY-1;
   
 
while(i>=0)                         // Цикл по непосчитанным барам
 {
 IMA1BUF[i]=iMA(_Symbol,PERIOD_CURRENT,MA1PER,MA1SHIFT,MODE_EMA,PRICE_CLOSE,i);
      i--;                             // Расчёт индекса следующего бара
 }
 
while(i>=0)                         // Цикл по непосчитанным барам
 {
 IMA2BUF[i]=iMA(_Symbol,PERIOD_CURRENT,MA2PER,MA2SHIFT,MODE_EMA,PRICE_CLOSE,i);
      i--;                             // Расчёт индекса следующего бара
 }

//---
return;   
  }
//+------------------------------------------------------------------+

 

Но отображается всего одна линия и только в тестере советника (он еще не доделан до конца, торговых функций в нем еще нет)):

 

 

 Как сделать что-бы две линии отображалось ? И почему вообще ни одной линии не отрисовывается если установить советник на чарт ?

 

Спасибо. 

 
Установи индикаторы на чарт, сохрани шаблон с именем советника и будет тебе счастье:)))
 

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

 

А шаблон будет на языке MQL4 написан ?  

 

p.s. Посмотрел - там формат шаблонов - TPL. Не подходит. Нужно что-бы советник сам рисовал. 

 
Robas1000:

Здравствуйте.

 Я делаю советника с двумя индикаторами (iMA двух разных периодов) код:


Тут какая-то помесь советника с индикатором. Я удивлен, что вообще компилируется )) Особенно вот этот перл. Надо делать или то или другое.

int OnInit()
  {
  
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  Blue
#property  indicator_width1  2

SetIndexBuffer(0,IMA1BUF);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2,clrBlue);
SetIndexBuffer(1,IMA2BUF);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2,clrRed);
 

Alexey Volchanskiy,

 Я хочу сделать так-же как в MT5 - там вполне нормально индикатор и советник (с "самописным" трейлинг стопом) работали. Переделываю сейчас советник с MT5 На MT4 и ... возникли эти проблеммы.

 

Обязательно в MT4 надо делать либо-либо ? Или нет ? Я не понимаю почему каждый раз придется всегда делать две работы - индикатор и советник, когда можно сделать все в одном.

 

MT5  мне нравится пока намного меньше чем MT4, - в нем нельзя выбирать размер спреда при тестировании, и из-за других факторов (шрифт у него большой какой-то в отличии от МТ4, историю не импортирует, спред на рубле-доллар по несколько рублей бывает). 

 

Спасибо. 

 
Robas1000:

Alexey Volchanskiy,

 Я хочу сделать так-же как в MT5 - там вполне нормально индикатор и советник (с "самописным" трейлинг стопом) работали. Переделываю сейчас советник с MT5 На MT4 и ... возникли эти проблеммы.

 

Обязательно в MT4 надо делать либо-либо ? Или нет ? Я не понимаю почему каждый раз придется всегда делать две работы - индикатор и советник, когда можно сделать все в одном.

 

MT5  мне нравится пока намного меньше чем MT4, - в нем нельзя выбирать размер спреда при тестировании, и из-за других факторов (шрифт у него большой какой-то в отличии от МТ4, историю не импортирует, спред на рубле-доллар по несколько рублей бывает). 

 

Спасибо. 

В индикаторе можно торговать, только особого смысла нет. Все индикаторы работают в одном потоке, а советники каждый в своем. Следовательно, советник в коде индикатора может тормозить. Я так понял, это у вас все наоборот - в  код советника помещен индикатор? Не уверен, можно ли в него впихнуть код индикатора, не пробовал. Но #property в OnInit() - это ненормально и они там явно не читаются. 

Отправил заявку в Сервис Деск 

СД 

 
Robas1000:

Alexey Volchanskiy,

 Я хочу сделать так-же как в MT5 - там вполне нормально индикатор и советник (с "самописным" трейлинг стопом) работали. Переделываю сейчас советник с MT5 На MT4 и ... возникли эти проблеммы.

 

Обязательно в MT4 надо делать либо-либо ? Или нет ? Я не понимаю почему каждый раз придется всегда делать две работы - индикатор и советник, когда можно сделать все в одном.

 

MT5  мне нравится пока намного меньше чем MT4, - в нем нельзя выбирать размер спреда при тестировании, и из-за других факторов (шрифт у него большой какой-то в отличии от МТ4, историю не импортирует, спред на рубле-доллар по несколько рублей бывает). 

 

Спасибо. 

Вообще непонятно зачем было писать кучу кода для стандартных индикаторов терминала. Просто вычисляешь какое нужно значение МА и используешь в советнике. А уж индикатор, если нужен пользователю пусть сам к графику прикрепит, в чем проблема то?
 
//+------------------------------------------------------------------+
//|                                                        уцкку.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  Blue
#property  indicator_width1  2

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+




int OnInit()
  {
  
double STOP=0.5;
double TAKE=1;






   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

double IMA1BUF[];
double IMA2BUF[];
int MA1PER=100;
int MA2PER=20;


int MA1SHIFT=0;
int MA2SHIFT=-2;

int limit=rates_total-prev_calculated;



ArraySetAsSeries(IMA1BUF,false);
ArraySetAsSeries(IMA2BUF,false);

SetIndexBuffer(0,IMA1BUF);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2,clrBlue);
SetIndexBuffer(1,IMA2BUF);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2,clrRed);
IndicatorDigits(Digits);




//---
   //---
   if(prev_calculated>0)
      limit++;
   for(int i=0; i<limit; i++)
     {
      IMA1BUF[i]=iMA(_Symbol,PERIOD_CURRENT,MA1PER,MA1SHIFT,MODE_EMA,PRICE_CLOSE,i);
      IMA2BUF[i]=iMA(_Symbol,PERIOD_CURRENT,MA2PER,MA2SHIFT,MODE_EMA,PRICE_CLOSE,i);
      
     }
//---
   return(rates_total);
  }

void OnTick()
  {
  
  

double STOP=0.5;
double TAKE=1;

int HISTORY=500;


return; 


}

//---
 
 
//+------------------------------------------------------------------+

 

Вышеприведенный код - никаких варнингов, никаких линий в тестере и в Metatrader 4 !!! 

 

В Metatrader 5 код из индикаторов и советника нормально работает !!!! 

 
Alexey Volchanskiy:

В индикаторе можно торговать, только особого смысла нет. 


 

В индикаторе торговать нельзя
 
Victor Nikolaev:
В индикаторе торговать нельзя
Точно, сейчас нельзя.  Вроде до 600-й версии было можно? Так пытались обойти запрет ДЦ на торговлю советниками, особенно для конкурсов.
 
Alexey Volchanskiy:
Точно, сейчас нельзя.  Вроде до 600-й версии было можно? Так пытались обойти запрет ДЦ на торговлю советниками, особенно для конкурсов.
Никогда нельзя было