[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 270

 
drknn:


1. Чтоб решить что именно должна возвратить обычная функция, я должен знать, зачем основному коду именно такая величина. Напрмер, если нужно принять решение об окрытии бай-ордера при наличии сигнала, я напишу функцию, которая возвратит количество уже открытых бай-ордеров. В зависимости от того сколько их там, код будет принимать решение следуя вложенной в код логике. Я не знаю, какая логика обработки кода возврата вложена в терминал. Сегодня просматривал статью про создание семафора и наткнулся на код возврата (-2). Удивился, задал тут вопрос. Только и всего. ( https://www.mql5.com/ru/articles/1412 - статья тут).

2. Терминал игнорирует возвращаемые значения. Это точно? Если это так, то тогда опять возникает законный вопрос, почему при создании советника/индикатора/скрипта разработчик вложил в шаблон именно int, ведь логичнее было вложить туда void - тогда терминалу и игнорировать ни чего бы не пришлось - мы бы тогда выиграли 1 такт процессорного времени? Может всё же есть какая-то логика, в том, ЧТО возвращать в ретурне из функций int init(), int deinit() и int start()? По моему, Рош где-то кому-то это уже объяснял - там помнится было описание когда нужно возвращать ноль, а когда (-1). Вот это-то объяснение я и искал. Жаль найти не удалось...

P.S.

return(-2) автор статьи использует в своих целях. Но факт остаётся фактом - иногда функция start() завершается кодом возврата величины, отличной от нуля. И это делает далеко не 1 человек. Вот эту то логику и хотелось бы понять.

1. Ничего не могу добавить. Что хотите, то возвращайте.

2. Терминал игнорирует, а Ваш код не игнорирует, если так построен. При системном вызове игнорируются и параметры и возврщаемое значение. Это и так понятно. Куда оно возвращается в таком случае?

О создание шаблона можно только догадываться. Наверняка, разработчики исходили из умолчательного INT.

 
okvseok:

как можно понять эти строки:

Напишите вот так и посмотрите в журнал:

//---- return orders volume

if(buys>0){
 Print("buys = ",buys);
 return(buys);
}
else{
 Print("-sells = ",-sells);
 return(-sells);// это эквивалентно команде return(sells*(-1));
}
 

Помогите советом пож.

Я использую несколько индикаторов, в которых фигурирует в глобальных переменных дата

extern bool   shiftdata           = false;
extern string ShiftHistory        = "02.06.2012 00:00";

каждый раз меняя дату в истории прихотидся менять ее во всех индикаторах.

Написал индикатор, который передает через iCustom зачение сдвига в int bars.

Но проблема в том, что передается дата без изменения, та которая скомпелированна (02.07.2012), а при ее изменениях руками (02.06.2012) не передается!!!

ПОЧЕМУ и ЧТО ДЕЛАТЬ????

//+------------------------------------------------------------------+
//|                                                        iTime.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
extern string BLOK_______1        = "Работа с историей";
extern string ShiftHistory        = "02.07.2012 00:00";
extern string PERIOD              = "D1";
//---
double buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0,buffer);
   SetIndexStyle(0,DRAW_ARROW,0,0);
   SetIndexEmptyValue(0,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
int  counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
int i,period,limit,bs,barn;

if(PERIOD=="MN1") period=PERIOD_MN1;
else
if(PERIOD=="W1")  period=PERIOD_W1;
else
if(PERIOD=="D1")  period=PERIOD_D1;
else 
if(PERIOD=="H4")  period=PERIOD_H4;
else
if(PERIOD=="H1")  period=PERIOD_H1;
else
if(PERIOD=="M30") period=PERIOD_M30;
else
if(PERIOD=="M15") period=PERIOD_M15;
else
if(PERIOD=="M5")  period=PERIOD_M5;
else
if(PERIOD=="M1")  period=PERIOD_M1;
else
period=PERIOD_D1;

bs=iBarShift(Symbol(),period,StrToTime(ShiftHistory));
barn=iBars(Symbol(),period);
limit=barn-100;

if(limit>bs)
for(i=barn-1; i>=0; i--)
{
if (i==bs) buffer[i]=bs;
} RefreshRates();
return(0);
}

Вот приемник

for(int y=barn-100; y>=0; y--)
{
int bbb,st=iCustom(Symbol(),PERIOD,"iTime",0,y);
if(st>0) bbb=st;
}
 Comment(bbb);

Comment пишет сдвиг 16. А при 02.06.2012 должно быть 48

Прошу помочь советом!

 

помогите как в эксперте определить последние хай и лоу (пики) зигзага

double zz1;
int start()
{
zz1=iCustom(NULL,0,"ZigZag", 12, 5, 3, 0, 1);
MessageBox("zz1="+zz1,"zz1");
return(0);
}
выходят одни "0.00000"

 
spek:

помогите как в эксперте определить последние хай и лоу (пики) зигзага

double zz1;
int start()
{
zz1=iCustom(NULL,0,"ZigZag", 12, 5, 3, 0, 1);
MessageBox("zz1="+zz1,"zz1");
return(0);
}
выходят одни "0.00000"

double ZZ[10000]={0.0};  //массив для значений ZigZag
double zz1[10000]={0.0};

//-----
int init()
{

}
return(0);
//---
int start()
{
int q=1;   //ПОПРАВИЛ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

for(int i=1; i<=1000; i++)
{
zz1[i]=iCustom(NULL,0,"ZigZag", 12, 5, 3, 0, i);
if(zzl[i]>0) { ZZ[q]=zzl[i];  q++; }
//MessageBox("zz1="+zz1,"zz1");
Comment(ZZ[1],"  ",ZZ[2]);

return(0);
}
 

Народ обьясните пожалуйста как (точнее где) индикатор "mikahekin" меняет отображаемый буфер, неделю голову ломаю а понять немогу.

Хочу пихнуть туда "Alert()" чтоб говорил когда тренд развернулся.

//+------------------------------------------------------------------+
//|                                                    mikahekin.mq4 |
//|                        Copyright 2004, MetaQuotes Software Corp. |
//|                                                http://www.sasara |
//|                              Modified by: Ronald Verwer/ROVERCOM |
//+------------------------------------------------------------------+
#property copyright "Copyright 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property  indicator_chart_window
#property  indicator_buffers 4
#property  indicator_color1  Silver
#property  indicator_color2  Yellow
#property  indicator_color3  Red
#property  indicator_color4  Blue
#property  indicator_width1 3
#property  indicator_width2 3

//---- input parameters
extern int KPeriod=3;
extern int DPeriod=3;
extern int JPeriod=7;

double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
double HighesBuffer[];
double LowesBuffer[];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
        IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 3);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 3);
   SetIndexStyle(2,DRAW_ARROW, 0, 1);
   SetIndexStyle(3,DRAW_ARROW, 0, 1);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
   SetIndexDrawBegin(4,10);
   SetIndexDrawBegin(5,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
   SetIndexBuffer(2,ind_buffer3);
   SetIndexBuffer(3,ind_buffer4);
   SetIndexBuffer(4, HighesBuffer);
   SetIndexBuffer(5, LowesBuffer);
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("mikahekin");
   SetIndexLabel(0,"Open");
   SetIndexLabel(1,"Close");
   SetIndexLabel(2,"High");
   SetIndexLabel(3,"Low");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k,j;
   int    counted_bars=IndicatorCounted();
   double price;
   
//----
   if(Bars<=10) return(0);
//---- initial zero
   if(counted_bars<0) return (-1);
//---- minimums  counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=Low[k];
         if(min>price) min=price;
         k--;
        }
      LowesBuffer[i]=min;
      i--;
     }
//---- maximums counting
   i=Bars-DPeriod;
   if(counted_bars>DPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double max=-100000;
      j=i+DPeriod-1;
      while(j>=i)
        {
         price=High[j];
         if(price>max) max=price;
         j--;
        }
      HighesBuffer[i]=max;
      i--;
     }
//---- mikahekin calcaulation
   i=Bars-JPeriod;
   if(counted_bars>JPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      double sumopen=0.0;
      double sumclose=0.0;
      double close=0.0;
      double open=0.0;
      double high=0.0;
      double low=0.0;

      for(k=(i+JPeriod-1);k>=i;k--)
         {
         sumclose+=Close[k];
         close=sumclose/JPeriod;
         sumlow+= LowesBuffer[k];
         low= sumlow/JPeriod;
         sumopen+=Open[k];
         open=sumopen/JPeriod;
         sumhigh+=HighesBuffer[k];
         high=sumhigh/JPeriod;
         }
         
      ind_buffer1[i]=open;
      ind_buffer2[i]=close;
      ind_buffer3[i]=high;
      ind_buffer4[i]=low;

      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
З.Ы. В mql4 я немного лучше чем в балете но...
 
Zhunko:

1. Ничего не могу добавить. Что хотите, то возвращайте.

2. Терминал игнорирует, а Ваш код не игнорирует, если так построен. При системном вызове игнорируются и параметры и возврщаемое значение. Это и так понятно. Куда оно возвращается в таком случае?

О создание шаблона можно только догадываться. Наверняка, разработчики исходили из умолчательного INT.


Пришёл тик, терминал вызывает функцию start() советника. Вы утверждаете, что значение, возвращаемое этой функцией, терминалу безразлично. Это где-нибудь задокументировано?
 
KoKoS:

Народ обьясните пожалуйста как (точнее где) индикатор "mikahekin" меняет отображаемый буфер, неделю голову ломаю а понять немогу.

Хочу пихнуть туда "Alert()" чтоб говорил когда тренд развернулся.

З.Ы. В mql4 я немного лучше чем в балете но...


Строки

#property  indicator_color1  Silver
#property  indicator_color2  Yellow

говорят о том, что первые два буффера и есть показатель смены тренда. Там ведь сверху свеч идут красные значки, а снизу синие. Как показатель преломления тренда работает только комбинация жёлтый-серый. Для них соответственно будет:

//---- indicator buffers mapping
   SetIndexBuffer(0,ind_buffer1);// для серого цвета
   SetIndexBuffer(1,ind_buffer2);// для жёлтого цвета
Там, в значениях этих буфферов и копайте.
 
Народ, подскажите по поводу передачи даты через iCustom. Передает тока скомпелированное значение, как передать по буферу измененое на глобальном уровне? Когда меняю дату передается все равно прежнее знаяение.
extern bool   shiftdata           = false;
extern string ShiftHistory        = "02.06.2012 00:00";

Индикатор выложил чуть выше.....

Или оно не как не меняется?????

Мастера скажите пож.

 

Помогите, пожалуйста, если кто из вас сможет, прописать код на такое условие:

"если, ордер был закрыт по TakeProfit, после пересечения скользящей средней, то не открывать больше сделки в эту сторону, пока цена не пересечет скользящую среднюю в обратную сторону".

Заранее спасибо за помощь!

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