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

 

Добрый день!

Возникла задача, на первый взгляд вроде бы и несложная, но что-то никак не получается. Есть массив, в котором значения всегда идут подряд (в одих случаях значения могут идти по возрастанию, в других случаях - по убыванию). Есть некий уровень (на рисунке красным цветом). Нужно найти два значения массива, наиболее близких к уровню красной линии. На рисунке а) это будут значения массива с индексами 0 и 1. На рисунке б) это будут значения массива с индексами 2 и 1. На рисунках в) и е) это будут значения массива с индексами 0 и 0. На рисунках г) и д) это будут значения массива с индексами 2 и 2.

Пожалуйста подскажите, как решить эту задачу. Заранее благодарен.

 
Roman.:

ТОгда вообще не парься - чисто перенеси код индюка в эксперта как есть на выполнение торговых критериев и все - далее в сове по этим перенесенным торговым условиям с этого индюка открываешь позы через советника и все...
Спасибо, разбираюсь :)
 
skyjet:
Спасибо, разбираюсь :)

Не за что... все проходили через ЭТО. :-)
 
drknn:

Сегодня суббота - выходной. Вы запускаете эксперта, происходит инициализация, но поскольку выходной и тика нет, функция старта не запускается (то есть Trade() не вызывается.). Для проверки правильности её работы нужно сунуть вызов этой функции в блок инициализации, ну или тестить в тестере.

После подстановки этой функции в Init() и добавлением проверочного кода Print(DayOfWeek()) выяснилось, что время берется серверное, а у сервера была пятница...

Заменил

if(DayOfWeek()==0 || DayOfWeek()==6)

на

  if(TimeDayOfWeek(TimeLocal())==0 || TimeDayOfWeek(TimeLocal())==6)

и заработало, как надо.

Спасибо.

 

Здравствуйте, товарищи!

Столкнулся с неожиданной проблемой.

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

Кто нибудь сталкивался? Подскажите

 

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

Помогите, пожалуйста, найти ошибку.

Ниже приведен проблемный участок в полном виде, вычлененный из советника.

extern int      MAGIC= 1; 

int start()
  {
//----
  int tt = 0;
  double SchBuyLots     = SchBuyLots_b(MAGIC);
  double SchSellLots    = SchSellLots_b(MAGIC);
  double SchBuyLots100  = SchBuyLots100_b();
  double SchSellLots100 = SchSellLots100_b();
  double SchBuyLimitLots    = SchBuyLimitLots_b(MAGIC);
  double SchSellLimitLots   = SchSellLimitLots_b(MAGIC);
  double SchBuyStopLots100  = SchBuyStopLots100_b();
  double SchSellStopLots100 = SchSellStopLots100_b();

  double dy=0;
  double dx=SchBuyLots+SchBuyLots100-SchSellLots-SchSellLots100;
  if (dx!=0) dy=MathAbs(dx);

  double zx=SchBuyLimitLots-SchSellLimitLots;

  if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;
 
  Alert (dy+zx,"---",SchSellStopLots100,"---",tt);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
// ----------------- SchBuyLots() ---------------------------------------------
//  Функция возвращает суммарный лот Бай-ордеров для Магика
//----------------------------------------------------------------
double SchBuyLots_b(int MAGIC) {
  double SchBuyLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){ 
      if(OrderType()==OP_BUY) {
        SchBuyLots=SchBuyLots+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLots);
}
// ----------------------------------------------------------------------------

// ----------------- SchSellLots() ---------------------------------------------
//  Функция возвращает суммарный лот Сейл-ордеров для Магика
//-----------------------------------------------------------------
double SchSellLots_b(int MAGIC) {
  double SchSellLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
      if(OrderType()==OP_SELL) {
        SchSellLots=SchSellLots+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLots);
}
// -------------------------------------------------------------------------------

// ----------------- SchBuyLots100() ---------------------------------------------
//  Функция возвращает суммарный лот Бай-ордеров для Магика 100
//--------------------------------------------------------------------------------
double SchBuyLots100_b() {
  double SchBuyLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_BUY) {
        SchBuyLots100=SchBuyLots100+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLots100);
}
// --------------------------------------------------------------------------------

// ----------------- SchSellLots100() ---------------------------------------------
//  Функция возвращает суммарный лот Сейл-ордеров для Магика 100
//---------------------------------------------------------------------------------
double SchSellLots100_b() {
  double SchSellLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_SELL) {
        SchSellLots100=SchSellLots100+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLots100);
}
// ----------------------------------------------------------------------------
// ----------------- SchBuyLimitLots() ------------------------------------------
//  Функция возвращает суммарный лот BuyLimit-ордеров для Магика
//------------------------------------------------------------------------------
double SchBuyLimitLots_b(int MAGIC) {
  double SchBuyLimitLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){ 
      if(OrderType()==OP_BUYLIMIT) {
        SchBuyLimitLots=SchBuyLimitLots+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLimitLots);
}
// ----------------------------------------------------------------------------

// ----------------- SchSellLimitLots() ----------------------------------------
//  Функция возвращает суммарный лот SellLimit-ордеров для Магика
//-----------------------------------------------------------------------------
double SchSellLimitLots_b(int MAGIC) {
  double SchSellLimitLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
      if(OrderType()==OP_SELLLIMIT) {
        SchSellLimitLots=SchSellLimitLots+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLimitLots);
}
// -------------------------------------------------------------------------------
// ----------------- SchBuyStopLots100() -----------------------------------------
//  Функция возвращает суммарный лот BuyStop-ордеров для Магика 100
//--------------------------------------------------------------------------------
double SchBuyStopLots100_b() {
  double SchBuyStopLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_BUYSTOP) {
        SchBuyStopLots100=SchBuyStopLots100+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyStopLots100);
}
// --------------------------------------------------------------------------------

// ----------------- SchSellStopLots100() -----------------------------------------
//  Функция возвращает суммарный лот SellStop-ордеров для Магика 100
//---------------------------------------------------------------------------------
double SchSellStopLots100_b() {
  double SchSellStopLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_SELLSTOP) {
        SchSellStopLots100=SchSellStopLots100+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellStopLots100);
}
// --------------------------------------------------------------------------------

Прошу обратить внимание на строку (практически в самом начале):

 if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;

По какой-то причине, при равенстве значений dy+zx и SchSellStopLots100 по отдельности (проверял с помощью аллертов) в данном выражении они перестают быть равны друг другу, и переменная tt принимает значение 1, а не 2.

Прошу Вас помочь найти недочёт.

Заранее благодарю.

 
Торговые условия с сервера на выходные поменялись... тестировать надо на отдельном терминале не подключенном к брокеру/сети, задавая специальной утилиткой нужный спред. Лучше поискать статьи по тестированию советников и как это правильно делать.
 
nemo811:

(проверял с помощью аллертов)

Проверять лучше через ND или разницы по модулю меньше некоторой дельты.
 
splxgf:
Проверять лучше через ND или разницы по модулю меньше некоторой дельты.

По какой-то причине сложение dy и zx давая число 0.3 (в моём конкретном тесте существующей рыночной ситуации) при сравнении с этим числом ему не равно. Т.е. складываю dy+zx получаю 0.3. Сравниваю dy+zx с 0.3 - они не равны.

Сравниваю dy и zx с числами, которые они возвращают - равенства работают как и должны.

Загадка.

Прошу помочь.

 
ramirez17:

Здравствуйте, товарищи!

Столкнулся с неожиданной проблемой.

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

Кто нибудь сталкивался? Подскажите

У тестера есть журнал. Там все написано. Здесь нет телепатов, чтобы читать журналы Вашего тестера на расстоянии.
Причина обращения: