Проблема с получением рыночной информации

 

Добрый день.

При написании мултивалютного советника столкнулся с проблемой получения данных при испоьзовании стандартных функций типа iLowest , iLow, iHighest, iHigh.

Для установки СЛ на наименьшем/наибольшем лоу/хай с последних Н баров написал фунцию

double GetStop(int dir,int i, int set)
{
  RefreshRates();
  string symbol=symbols[i];
  int digits=MarketInfo(symbol,MODE_DIGITS);
  Print("calculate SL "+IntegerToString(dir)+" "+symbol+" "+IntegerToString(set));
  int k=0;
  double price=0;
  if(set==1 || set==2)
  {
    if(Type_SL_JVS1==jvs1sl1) 
    {
      price=GetSLBand(dir,symbol,SL_TF_JVS1);
      Print(symbol+" SL bund "+DoubleToStr(price,digits));
    }
    else
    {
      if(dir==0)
      {
        k=iLowest(symbol,SL_TF_JVS1,MODE_LOW,SL_Number_Candles_JVS1,1);
        
        price=iLow(symbol,SL_TF_JVS1,k);
        Print(symbol+" SL buy "+IntegerToString(k)+" "+DoubleToStr(price,digits));
        if(price==0)
        {
          Print("error sfter call iLow  "+IntegerToString(GetLastError()));
        }
      }  
      else
      {
        k=iHighest(symbol,SL_TF_JVS1,MODE_HIGH,SL_Number_Candles_JVS1,1);
        
        price=iHigh(symbol,SL_TF_JVS1,k);
        Print(symbol+" SL sell "+IntegerToString(k)+" "+DoubleToStr(price,digits));
        if(price==0)
        {
          Print("error sfter call iHigh  "+IntegerToString(GetLastError()));
        }
      }
    }
  }
  return(price);
}

В некоторых случаях функция возвращала значение 0, добавил распечатку и выяснилось что в некоторых сучаях функции iLowest  и iHighest возвращают -1 (минус 1) , тогда добавил вычисление наибольшего/наименьшего "в ручную" путем перебора Н значений и если бы это не помогло приписал брать значение с первого закрытого бара и стало

  RefreshRates();
  string symbol=symbols[i];
  int digits=MarketInfo(symbol,MODE_DIGITS);
  Print("calculate SL "+IntegerToString(dir)+" "+symbol+" "+IntegerToString(set));
  int k=0;
  double price=0;
  if(set==1 || set==2)
  {
    if(Type_SL_JVS1==jvs1sl1) 
    {
      price=GetSLBand(dir,symbol,SL_TF_JVS1);
      Print(symbol+" SL bund "+DoubleToStr(price,digits));
    }
    else
    {
      if(dir==0)
      {
        k=iLowest(symbol,SL_TF_JVS1,MODE_LOW,SL_Number_Candles_JVS1,1);
        if(k<=0) k=GetNumberHighLowBar(symbol,SL_TF_JVS1,SL_Number_Candles_JVS1,1);
        if(k<=0) k=1;
        price=iLow(symbol,SL_TF_JVS1,k);
        Print(symbol+" SL buy "+IntegerToString(k)+" "+DoubleToStr(price,digits));
        if(price==0)
        {
          Print("error sfter call iLow  "+IntegerToString(GetLastError()));
        }
      }  
      else
      {
        k=iHighest(symbol,SL_TF_JVS1,MODE_HIGH,SL_Number_Candles_JVS1,1);
        if(k<=0) k=GetNumberHighLowBar(symbol,SL_TF_JVS1,SL_Number_Candles_JVS1,2);
        if(k<=0) k=1;
        price=iHigh(symbol,SL_TF_JVS1,k);
        Print(symbol+" SL sell "+IntegerToString(k)+" "+DoubleToStr(price,digits));
        if(price==0)
        {
          Print("error sfter call iHigh  "+IntegerToString(GetLastError()));
        }
      }
    }
  }
  return(price);

 К сожалению и это не помогло, функция снова возвратила 0.

Массив инструментов готовится при запуске программы и продится проверка на наличие инструмента в Market Watch, таймфрейм и колличество баров задаются в инпуте программы.

Что может быть причиной и что можна сделать что исправить проблему?

Спасибо

 

Похоже на то, что Вы своего советника гоняли в тестере. Попробуйте на демосчёте, предварительно подгрузив историю по всем задействованным торговым инструментам по всех таймфреймах.