Перестал работать советник

 

Здравствуйте! Нужна помощь:

Начал учится, что бы понять что к чему написал первого простейшего советника на основе стохастика. Скомпилировал, ошибок нет, запустил тест - работает. Пока курил комп самопроизвольно перезагрузился (что у меня случается примерно раз-два в неделю), после чего советник перестал вообще выставлять ордера, хотя в коде ничего не изменилось о_О. Прошерстил форум, погуглил, к сожалению, ничего подобного не нашёл. В чём может быть проблема? Прошу помочь. (Другие советники при этом работают нормально).

Код:

//+------------------------------------------------------------------+
//|                                                 ProbaSil_1.0.mq4 |
//|                                                            Ardov |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "Ardov"
#property link      "http://www.mql4.com"
#property version   "1.00"
#property strict 
//Настройки
extern int       TP=20; //Тейк-профит
extern int       SL=10; //Стоп-лосс
extern double    Lots=0.1; //Размер лота
extern int MxOrder=3; //Максимальное число ордеров
extern int period=1; //Таймфрейм
extern int Kperiod1=5; //К-период
extern int Dperiod1=5; //Д-период 
extern int slowing1=1; //Замедление
extern int ma_method1=3; //тип сглаживания
extern int sposob1=1; //способ расчета стохастика(1 вроде экспоненциальный)
extern int timeout=5; //Пауза между ордерами в минутах
extern double LimitUp=80; //Верхний сигнальный уровень
extern double LimitDn=20; //Нижний сигнальный уровень

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
int start()
   {
   int signal=0; //Торговый сигнал
   double ss1=0; //Сигнал стохастика
   int cnt=0; //Счётчик ордеров
   double p=Point; //Размер пункта
   while(cnt<MxOrder)//Если число ордеров, не превышает максимума
      {
         while(signal==0)//Поиск сигнала
          {
            ss1=iStochastic(Symbol(),period,Kperiod1,Dperiod1,slowing1,ma_method1,sposob1,MODE_MAIN,1);
            if(ss1>LimitUp)
            {
            signal=1;
            return(0);
            }
            if(ss1<LimitDn)
            {
            signal=2;
            return(0);
            }
         return(0);
         }
     ////Выставление ордеров
      if(signal == 1)
         {
         OrderSend(NULL,OP_BUY,Lots,Ask,1,(Ask-SL*p),(Ask+TP*p),"BUY",0,0,Blue);
         signal=0;
         cnt++;
         Sleep(timeout*60000);
         return(0);
         }
      if(signal == 2)
         {
         OrderSend(NULL,OP_SELL,Lots,Bid,1,(Bid+SL*p),(Bid-TP*p),"SELL",0,0,Red);
         signal=0;
         cnt++;
         Sleep(timeout*60000);
         return(0);
         }
      }
   return(0);
   }
   
 
alrane:

Здравствуйте! Нужна помощь:

Начал учится, что бы понять что к чему написал первого простейшего советника на основе стохастика. Скомпилировал, ошибок нет, запустил тест - работает. Пока курил комп самопроизвольно перезагрузился (что у меня случается примерно раз-два в неделю), после чего советник перестал вообще выставлять ордера, хотя в коде ничего не изменилось о_О. Прошерстил форум, погуглил, к сожалению, ничего подобного не нашёл. В чём может быть проблема? Прошу помочь. (Другие советники при этом работают нормально).

Код:

         while(signal==0)//Поиск сигнала
          {
            ss1=iStochastic(Symbol(),period,Kperiod1,Dperiod1,slowing1,ma_method1,sposob1,MODE_MAIN,1);
            if(ss1>LimitUp)
            {
            signal=1;
            return(0);
            }
            if(ss1<LimitDn)
            {
            signal=2;
            return(0);
            }
         return(0);
         }

Зачем этот поиск сигнала сделан в цикле? Функция Start() и так выполняется каждый тик.

И не надо использовать свой счетчик ордеров для этого существует стандартная функция OrdersTotal()

 
vitales:

Зачем этот поиск сигнала сделан в цикле? Функция Start() и так выполняется каждый тик.

И не надо использовать свой счетчик ордеров для этого существует стандартная функция OrdersTotal()

Согласен. Спасибо за Ваш ответ. Проблему правда это не решило.

Код подправил:

//+------------------------------------------------------------------+
//|                                                 ProbaSil_1.0.mq4 |
//|                                                            Ardov |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "Ardov"
#property link      "http://www.mql4.com"
#property version   "1.00"
#property strict 
//Настройки
extern int       TP=20; //Тейк-профит
extern int       SL=10; //Стоп-лосс
extern double    Lots=0.1; //Размер лота
extern int MxOrder=3; //Максимальное число ордеров
extern int period=1; //Таймфрейм
extern int Kperiod1=5; //К-период
extern int Dperiod1=5; //Д-период 
extern int slowing1=1; //Замедление
extern int ma_method1=3; //тип сглаживания
extern int sposob1=1; //способ расчета стохастика(1 вроде экспоненциальный)
extern int timeout=5; //Пауза между ордерами в минутах
extern double LimitUp=80; //Верхний сигнальный уровень
extern double LimitDn=20; //Нижний сигнальный уровень

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
int start()
   {
   int signal=0; //Торговый сигнал
   double ss1=0; //Сигнал стохастика
   double p=Point; //Размер пункта
   while(OrdersTotal()<MxOrder)//Если число ордеров, не превышает максимума
      {
            ss1=iStochastic(Symbol(),period,Kperiod1,Dperiod1,slowing1,ma_method1,sposob1,MODE_MAIN,1);
            if(ss1>LimitUp)
            {
            signal=1;
            return(0);
            }
            if(ss1<LimitDn)
            {
            signal=2;
            return(0);
            }
     ////Выставление ордеров
      if(signal == 1)
         {
         OrderSend(NULL,OP_BUY,Lots,Ask,1,(Ask-SL*p),(Ask+TP*p),"BUY",0,0,Blue);
         signal=0;
         Sleep(timeout*60000);
         return(0);
         }
      if(signal == 2)
         {
         OrderSend(NULL,OP_SELL,Lots,Bid,1,(Bid+SL*p),(Bid-TP*p),"SELL",0,0,Red);
         signal=0;
         Sleep(timeout*60000);
         return(0);
         }
      }
   return(0);
   }
   
 
int start()
   {
   int signal=0; //Торговый сигнал
   double ss1=0; //Сигнал стохастика
   double p=Point; //Размер пункта
   if(OrdersTotal()<MxOrder)//Если число ордеров, не превышает максимума
      {
            ss1=iStochastic(Symbol(),period,Kperiod1,Dperiod1,slowing1,ma_method1,sposob1,MODE_MAIN,1);
            if(ss1>LimitUp)
            {
            signal=1;
            //return(0);
            }
            if(ss1<LimitDn)
            {
            signal=2;
            //return(0);
            }
     ////Выставление ордеров
      if(signal == 1)
         {
         OrderSend(NULL,OP_BUY,Lots,Ask,1,(Ask-SL*p),(Ask+TP*p),"BUY",0,0,Blue);
         signal=0;
         Sleep(timeout*60000);
         return(0);
         }
      if(signal == 2)
         {
         OrderSend(NULL,OP_SELL,Lots,Bid,1,(Bid+SL*p),(Bid-TP*p),"SELL",0,0,Red);
         signal=0;
         Sleep(timeout*60000);
         return(0);
         }
      }
   return(0);
   }

?

 
alrane:

Согласен. Спасибо за Ваш ответ. Проблему правда это не решило.

Код подправил:


Вот пример , пробуйте.

//--------------------------------------------------------------------
// callstohastic.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                       // Спец. функция start
  {
   double M_0, M_1,               // Значение MAIN на 0 и 1 барах
          S_0, S_1;               // Значение SIGNAL на 0 и 1барах
//--------------------------------------------------------------------
                                  // Обращение к функции техн.индикат.
   M_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,  0);// 0 бар
   M_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,  1);// 1 бар
   S_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);// 0 бар
   S_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);// 1 бар
//--------------------------------------------------------------------
                                  // Анализ ситуации
   if( M_1 < S_1 && M_0 >= S_0 )  // Зеленая пересекает красную снизу
      Alert("Пересечение снизу вверх. ПОКУПКА."); // Сообщение 
   if( M_1 > S_1 && M_0 <= S_0 )  // Зеленая пересекает красную свеху
      Alert("Пересечение сверху вниз. ПРОДАЖА."); // Сообщение 
      
   if( M_1 > S_1 && M_0 > S_0 )   // Зелёная выше красной
      Alert("Продолжаем держать покупку.");       // Сообщение 
   if( M_1 < S_1 && M_0 < S_0 )   // Зелёная ниже красной
      Alert("Продолжаем держать продажу.");       // Сообщение 
//--------------------------------------------------------------------
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
Использование технических индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Использование технических индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
ENSED:

?

ENSED, while на if пробовал менять - та же беда. Мб дело в самом терминале?
 
alrane:
ENSED, while на if пробовал менять - та же беда. Мб дело в самом терминале?

Обратите внимание, что я ещё два return(0) закомментировал.

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

 

ENSED, Спасибо за совет, но мне нужен именно сигнал по 1 основной линии стохастика

Ретурны удалил, но та же беда...

 
alrane:

ENSED, Спасибо за совет, но мне нужен именно сигнал по 1 основной линии стохастика

Ретурны удалил, но та же беда...

Брр, полез запускать.

Удалите это:

void OnTick()
  {
//---
   
  }

А лучше перенесите сюда код из start()...

После этого должно "заработать" - будут Вам сделки. Про сигнал, количество сделок и вообще концепцию советника - думайте сами :)

 
Спасибо! Помогло)
Причина обращения: