Непонятное поведение MQL4 функции.

 

Уважаемые форумляне, я недавно стал писать индикатор на MQL4, но заметил странную особенность, функции ведут себя очень странно.

Пожалуйста подскажите где потенциальная ошибка в коде кторый ниже:

Премного благодарен.


//+----------------------------------------------------------------------+
//| Swing-Point. mq4 |
//+----------------------------------------------------------------------+
#property copyright "Copyright © 2006, Ion Coliujco"

//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Navy

extern int PriceMode = PRICE_CLOSE;
extern int MAMode = MODE_SMA;
//---- buffers
double RevBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{

SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,RevBuffer);
SetIndexDrawBegin(0, 0);

return(0);
}
//+------------------------------------------------------------------+
int start()
{
double ZedM1Buffer[];
int m1factor = Period();

if (m1factor < PERIOD_M5) return (-1);

int counted_bars = IndicatorCounted();
if (counted_bars < 0) return(-1);

ArrayResize(ZedM1Buffer, m1factor);
ArraySetAsSeries(ZedM1Buffer, true);


int limit = Bars-counted_bars;

for (int i=1; i<limit; i++)
{

int from = i*m1factor;

double sigma = iStdDev(NULL,PERIOD_M1, m1factor, 0,MAMode, PriceMode, from);
double ma = iMA(NULL,PERIOD_M1,m1factor, 0, MAMode, PriceMode, from);

double mm = 0;


for (int shift=0; shift < m1factor; shift++)
{
//ZDESI pocemuto noli vsegda poetomu zaremil
//double value = GetPrice(NULL, PERIOD_M1, PriceMode, shift);

//sdesi normalino hotea stranno
double value = iClose(NULL, PERIOD_M1, from + shift);
ZedM1Buffer[shift] = (value - ma)/sigma;
}

//Sdesi toje nuli poetomu ocoshko indicatora vsegda pusta. .. PLS Podskajite, natolknite na pravilinii puti
RevBuffer[i] = iRSIOnArray(ZedM1Buffer, 0, m1factor, 0);
}


return(0);
}
//+------------------------------------------------------------------+
double GetPrice(string symbol, int timeframe, int Mode, int index)
{
double value = 0.0;

switch(Mode)
{
case PRICE_CLOSE:
value = iClose(symbol, timeframe, index);
break;
case PRICE_OPEN:
value = iOpen(symbol, timeframe, index);
break;
case PRICE_HIGH:
value = iHigh(symbol, timeframe, index);
break;
case PRICE_LOW:
value = iLow(symbol, timeframe, index);
break;
case PRICE_MEDIAN:
value =
(iHigh(symbol, timeframe, index)+iLow(symbol, timeframe, index))/2;
break;
case PRICE_TYPICAL:
value =
(iHigh(symbol, timeframe, index)+iLow(symbol, timeframe, index)+iClose(symbol, timeframe, index))/3;
break;
case PRICE_WEIGHTED:
value =
(iHigh(symbol, timeframe, index)+iLow(symbol, timeframe, index)+2*iClose(symbol, timeframe, index))/4;
break;
default:
value = iClose(symbol, timeframe, index);
}

return (value);
}

 
Как вставлять код MQL-4 в пост

и картинку с объянением непонятности, так быстрее помогут.
 
juan1977:

//ZDESI pocemuto noli vsegda poetomu zaremil
//double value = GetPrice(NULL, PERIOD_M1, PriceMode, shift);

//sdesi normalino hotea stranno
double value = iClose(NULL, PERIOD_M1, from + shift);
ZedM1Buffer[shift] = (value - ma)/sigma;

  1. Вот именно потому, что в функцию передаёшь параметр, оно и не работает. Можешь после строчки
    double value = GetPrice(NULL, PERIOD_M1, PriceMode, shift);
    написать
    Print(GetLastError());
    получишь ошибку 4106 - ERR_UNKNOWN_SYMBOL - неизвестный символ.
    Это если в iClose напрямую NULL написать - воспримет как текущий символ. А через свою функцию не выёживайся, пиши вот так:
    double value = GetPrice(Symbol(), PERIOD_M1, PriceMode, shift);
  2. По поводу второй ошибки - не знаю.
  3. Как вставлять код mql4 в пост.
 
dmitriy писал (а):
juan1977 писал (а):

//ZDESI pocemuto noli vsegda poetomu zaremil
//double value = GetPrice(NULL, PERIOD_M1, PriceMode, shift);

//sdesi normalino hotea stranno
double value = iClose(NULL, PERIOD_M1, from + shift);
ZedM1Buffer[shift] = (value - ma)/sigma;

  1. Вот именно потому, что в функцию передаёшь параметр, оно и не работает. Можешь после строчки
    double value = GetPrice(NULL, PERIOD_M1, PriceMode, shift);
    написать
    Print(GetLastError());
    получишь ошибку 4106 - ERR_UNKNOWN_SYMBOL - неизвестный символ.
    Это если в iClose напрямую NULL написать - воспримет как текущий символ. А через свою функцию не выёживайся, пиши вот так:
    double value = GetPrice(Symbol(), PERIOD_M1, PriceMode, shift);
  2. По поводу второй ошибки - не знаю.
  3. Как вставлять код mql4 в пост.
 

Bolishoe spasibo Dmitriy! Jali 4to ti ne s Kishineva, pivka bi vipili :)

 
А вот функция как перевести NULL в текущий символ

int num=myfunc(NULL,...);
...
int myfunc(string symbol,...)
{
  symbol=GetSymbol(symbol);
...
}
 
string GetSymbol(string symbol)
{ // function GetPeriod
   if(symbol==""||symbol=="0")
      return(Symbol());
   else
      return(symbol);
}

а ещё как писать по русски русскими буквами.

http://ourworld.compuserve.com/homepages/paulgor/screen_e.htm
 
if(sigma!=0)ZedM1Buffer[shift] = (value - ma)/sigma; Может равняться нулю, а но ноль делить нельзя
}

//Sdesi toje nuli poetomu ocoshko indicatora vsegda pusta. .. PLS Podskajite, natolknite na pravilinii puti
RevBuffer[i] = iRSIOnArray(ZedM1Buffer, 0, m1factor-1, 0); так будет работать, но вопрос возникает))) iMAonArray над простым массивом перворачивает его, а вот как RSI не знаю, наверно тоже, тогда надо применить к ZedM1Buffer функцию ArraySetAsSeries()
 
Integer писал (а):
if(sigma!=0)ZedM1Buffer[shift] = (value - ma)/sigma; Может равняться нулю, а но ноль делить нельзя
}

//Sdesi toje nuli poetomu ocoshko indicatora vsegda pusta. .. PLS Podskajite, natolknite na pravilinii puti
RevBuffer[i] = iRSIOnArray(ZedM1Buffer, 0, m1factor-1, 0); так будет работать, но вопрос возникает))) iMAonArray над простым массивом перворачивает его, а вот как RSI не знаю, наверно тоже, тогда надо применить к ZedM1Buffer функцию ArraySetAsSeries()

Integer premnogo blagodaren tebe. Uspehov vo vsem. V samom dele mne o4eni pomog :)
 
juan1977:

Bolishoe spasibo Dmitriy! Jali 4to ti ne s Kishineva, pivka bi vipili :)


А что у вас в Кишинёве сложности с руссоязычными клавиатурами? :)
 
elritmo писал (а):
juan1977 писал (а):

Bolishoe spasibo Dmitriy! Jali 4to ti ne s Kishineva, pivka bi vipili :)


А что у вас в Кишинёве сложности с руссоязычными клавиатурами? :)

Net, v Kishineve net problem ni s kakoi klaviaturoi ni s eazicom. Scoree vsego eto moi problemi. Po pravde govorea ne udalosi esce stro4iti na kirilitzu :) Izvinite konechno no eto fact :) No u4tem kak besplatnii urok...Spasibo vsem za pomosci!
Причина обращения: