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

 

Помогите пожалуйста, ошибка в мультивалютном советнике - почему то перестал формировать список валютных пар:

extern string  symbols        = "EURUSD.mm;GBPCHF.mm;EURAUD.mm;AUDCAD.mm;";
extern int     time_frame     = 60;
int i, j, LastError, TimeS[],symbnum;
string symb[];
void start()
  {
   for(j=0; j<symbnum; j++)  // перебор валютных пар подряд НАЧАЛО
     {
      RefreshRates();
      if(TimeS[j]!=iTime(symb[j],time_frame,0))    // открылся новый бар НАЧАЛО
        {

         TimeS[j]=iTime(symb[j],time_frame,0); // отметим что этот бар уже обработали
        }
     } 
  } 

void init()
  {
   string smbs[];
   int hFile = FileOpenHistory("symbols.raw",  FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
   if(hFile<0)
      return;
   int nSmb=FileSize(hFile)/1936;
   ArrayResize(smbs, nSmb);
   for(int i=0; i<nSmb; i++)
     {
      smbs[i] = FileReadString(hFile, 12);
      FileSeek(hFile, 1924, SEEK_CUR);
     }
   int k,mk;
   string buf;
   for(i=0; i<20; i++)
     {
      int dp=StringFind(symbols,";",mk);
      if(dp==-1)
        {
         buf=StringSubstr(symbols,mk,StringLen(symbols)-mk);
         if(buf!="")
           {
            for(k=0; k<nSmb; k++)
              {
               if(buf==smbs[k])
                 {
                  symbnum++;
                  ArrayResize(symb,symbnum);
                  symb[symbnum-1]=buf;
                  break;
                 }
              }
           }
         break;
        }
      buf=StringSubstr(symbols,mk,dp-mk);
      for(k=0; k<nSmb; k++)
        {
         if(buf==smbs[k])
           {
            symbnum++;
            ArrayResize(symb,symbnum);
            symb[symbnum-1]=buf;
            break;
           }
        }
      mk=dp+1;
     }
   ArrayResize(TimeS,symbnum);
   FileClose(hFile);
   return;
 }
Спасибо.
 
rabanik #:

Помогите пожалуйста, ошибка в мультивалютном советнике - почему то перестал формировать список валютных пар:


Вставляйте код правильно, иначе может не найтись желающих копаться в этой простыне.

Ну и неплохо было бы пояснить, что значит "почему то перестал формировать список валютных пар", что этому предшествовало?

 
PapaYozh #:


Вставляйте код правильно, иначе может не найтись желающих копаться в этой простыне.

Ну и неплохо было бы пояснить, что значит "почему то перестал формировать список валютных пар", что этому предшествовало?

Здравствуйте, исправил. Старый код, ему несколько лет, раньше работал сейчас перестал (возможно когда сменил ДЦ) .

 
rabanik #:

Здравствуйте, исправил. Старый код, ему несколько лет, раньше работал сейчас перестал (возможно когда сменил ДЦ) .

На вскидку я вижу, что переменная mk не инициализирована

   int k,mk;

, но используется

      int dp=StringFind(symbols,";",mk);

Её стоит проинициализировать:

   int k,mk=0;


Еще, не понятно, открывается ли файл

   int hFile = FileOpenHistory("symbols.raw",  FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
   if(hFile<0)
      return;

Выведите что-нибудь в журнал, в случае ошибки:

   int hFile = FileOpenHistory("symbols.raw",  FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
   if(hFile<0) {
      PrintFormat("%i:%s FileOpenHistory failed! ErrorCode=%i",__LINE__,__FUNCSIG__,GetLastError());
      return;
   }
 
PapaYozh #:

На вскидку я вижу, что переменная mk не инициализирована


, но используется


Её стоит проинициализировать:


Еще, не понятно, открывается ли файл

Выведите что-нибудь в журнал, в случае ошибки:

Спасибо!!!

Инициализировал, 

int k,mk=0;
   int hFile = FileOpenHistory("symbols.raw",  FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
   if(hFile<0)
      return;

hFile = 1. Открывается.

 
rabanik #:

Здравствуйте, исправил. Старый код, ему несколько лет, раньше работал сейчас перестал (возможно когда сменил ДЦ) .

А символы такие есть у этого нового ДЦ?

"EURUSD.mm;GBPCHF.mm;EURAUD.mm;AUDCAD.mm;";
 
PapaYozh #:

А символы такие есть у этого нового ДЦ?

Да, когда открываю терминал у меня именно НПБФХ такие символы с ".mm". Я открыл файл symbol.raw в текстовом редакторе и данные символы нашел, к примеру:  EURUSD.mm

 
rabanik #:

Да, когда открываю терминал у меня именно НПБФХ такие символы с ".mm". Я открыл файл symbol.raw в текстовом редакторе и данные символы нашел, к примеру:  EURUSD.mm

symbnum

Тоже используется без начальной инициализации.

 

Всем привет. Ребята подскажите где ошибка в коде и как исправить? уже двое суток ...сь и не знаю как решить проблему. Выдает такие ошибки - '0' - cannot convert enum.  '1' - cannot convert enum



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


input int TopBottomStrength = 10;

double TopBuffer[];
double BottomBuffer[];


int OnInit()
{
    ArrayResize(TopBuffer, 1000);
    ArrayResize(BottomBuffer, 1000);
    SetIndexBuffer(0, TopBuffer, INDICATOR_DATA);
    SetIndexBuffer(1, BottomBuffer, INDICATOR_DATA);
    SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 4, clrBlue);
    SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 4, clrRed);
    return(INIT_SUCCEEDED);
}

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[])
{
    int counted_bars = IndicatorCounted();
    if(counted_bars < 0) return(-1);
    if(counted_bars > 0) counted_bars--;

    for(int i = counted_bars; i < rates_total; i++)
    {
        int top_count = 0;
        int bottom_count = 0;
        for(int j = i - TopBottomStrength + 1; j <= i; j++)
        {
            if(high[j] > high[i])
            {
                top_count = 0;
                break;
            }
            if(high[j] == high[i])
            {
                top_count++;
            }
        }
        if(top_count == TopBottomStrength)
        {
            if(TopBuffer[i] != high[i]) {
                TopBuffer[i] = high[i];
                Alert(Symbol() + " Double Top formed at " + TimeToStr(time[i]));
            }
        }
        else
        {
            TopBuffer[i] = 0.0;
        }
        for(int k = i - TopBottomStrength + 1; k <= i; k++)
        {
            if(low[k] < low[i])
            {
                bottom_count = 0;
                break;
            }
            if(low[k] == low[i])
            {
                bottom_count++;
            }
        }
        if(bottom_count == TopBottomStrength)
        {
            if(BottomBuffer[i] != low[i]) {
                BottomBuffer[i] = low[i];
                Alert(Symbol() + " Double Bottom formed at " + TimeToStr(time[i]));
            }
        }
        else
        {
            BottomBuffer[i] = 0.0;
        }
    }
    int limit = rates_total - prev_calculated;
    for(int l = limit; l >= 0; l--)
    {
        if(TopBuffer[rates_total - l - 1] > 0.0 && (l == 0 || TopBuffer[rates_total - l] == 0.0)) {
             IndicatorSetDouble(0, l, TopBuffer[rates_total - l - 1]);
        }
        if(BottomBuffer[rates_total - l - 1] > 0.0 && (l == 0 || BottomBuffer[rates_total - l] == 0.0)) {
             IndicatorSetDouble(1, l, BottomBuffer[rates_total - l - 1]);
        }
    }
   
    return(rates_total);
}
 
jarikn #:

Всем привет. Ребята подскажите где ошибка в коде и как исправить? уже двое суток ...сь и не знаю как решить проблему. Выдает такие ошибки - '0' - cannot convert enum.  '1' - cannot convert enum



    for(int l = limit; l >= 0; l--)
    {
        if(TopBuffer[rates_total - l - 1] > 0.0 && (l == 0 || TopBuffer[rates_total - l] == 0.0)) {
             IndicatorSetDouble(INDICATOR_MINIMUM, l, TopBuffer[rates_total - l - 1]);
        }
        if(BottomBuffer[rates_total - l - 1] > 0.0 && (l == 0 || BottomBuffer[rates_total - l] == 0.0)) {
             IndicatorSetDouble(INDICATOR_MAXIMUM, l, BottomBuffer[rates_total - l - 1]);
        }
    }
IndicatorSetDouble

prop_id

[in]  Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_DOUBLE.

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