Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликовал программу в Маркете? Опубликуй ее и в блоге - виджет поможет!
Евгений
16
Евгений 2015.10.03 15:02 

Доброго времени суток! Не очень хорошо знаком с mql4, поэтому ситуация поставила меня в тупик. Реализовал паттерн Singleton двумя классами. Но при тестировании программы выдает ошибку invalid pointer access. Код приведенный ниже, ошибки не вызывает, но при добавлении любого дополнительного условия в функцию fun сразу вылезает ошибка. Совершенно не могу понять с чем это связано. Заранее спасибо а помощь!  

extern double volume=0.01;
extern double takeprofit=500;
extern double stoploss=1000;
extern int slippage=10;
double maH4_5_2,maH4_13_2, maH4_5_0, maH4_5_1, maH4_13_0,maH4_13_1;
bool flag_buy_f,flag_sell_f; 
double barbuy,barsell;
int a,b;


class indicator{
private:
   static indicator *pInstance;
   indicator(){}
   ~indicator(){}
public: 

   static indicator* getInstance();
   int fun();
   };

indicator* indicator::pInstance=NULL;
indicator* indicator::getInstance(){
   if(!pInstance)
      pInstance=new indicator;
   return (pInstance);
}

int indicator::fun(){
   if ((maH4_5_2>maH4_13_2)&&(maH4_5_1<maH4_13_1)&&(flag_buy_f==false)){
      flag_buy_f=true;
      barbuy=maH4_5_1;
      return(1);
      }
   if (barbuy==maH4_5_2) return 2;
   return 1;
}
   
class trader{
private:
   static trader* pInstance;
   indicator* pIndicator;
   trader();
   ~trader(){} 
   
public:
   static trader* getInstance();
   void func();
};

trader::trader(){
   pIndicator=indicator::getInstance();
}

trader* trader::pInstance=NULL;
trader* trader::getInstance(){
   if (!pInstance)
      pInstance=new trader;
   return (pInstance);
}

void trader::func(){
   if (pIndicator.fun()==1){
      double tk=NormalizeDouble(takeprofit*Point+Ask,Digits);
      double sl=NormalizeDouble(Bid-stoploss*Point,Digits);
      OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,sl,tk);
   }
   if (pIndicator.fun()==2){
      double tk=NormalizeDouble(Bid-takeprofit*Point,Digits);                                                                     
      double sl=NormalizeDouble(stoploss*Point+Ask,Digits);
      OrderSend(Symbol(),OP_SELL,volume,Bid,slippage,sl,tk);
   }
}  
   

int OnInit()
  {
   trader::getInstance();
   a=1;
        b=2;
        flag_buy_f=false;
        flag_sell_f=false;
        barbuy=0;
        barsell=0;
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
        maH4_5_0=1;
        maH4_5_1=2;
        maH4_5_2=3;
        maH4_13_0=4;
        maH4_13_1=5;
        maH4_13_2=6;
   trader*t;
   t.func(); 
  }
Dmitry Fedoseev
41190
Dmitry Fedoseev 2015.10.04 01:38  

Опять Singleton. А что дальше этого Singleton'а никто не идет?

Попробуйте воспользоваться поиском, здесь уже есть тема с правильно написанным Singleton'ом.

Вот только зачем он? 

Евгений
16
Евгений 2015.10.04 09:40  
Integer:

Опять Singleton. А что дальше этого Singleton'а никто не идет?

Попробуйте воспользоваться поиском, здесь уже есть тема с правильно написанным Singleton'ом.

Вот только зачем он? 

 

Он мне необходим. То есть неверная реализация? 
Dmitry Fedoseev
41190
Dmitry Fedoseev 2015.10.04 10:25  
Grossmester:
Он мне необходим. То есть неверная реализация? 
Если работает, значит верная, если не работает, значит неверная.  Очевидно.
Евгений
16
Евгений 2015.10.04 15:48  
Integer:
Если работает, значит верная, если не работает, значит неверная.  Очевидно.
Просто показалось, что Вы разбираетесь и увидели ошибку
Ihor Herasko
8441
Ihor Herasko 2015.10.04 19:38  
Grossmester:

Совершенно не могу понять с чем это связано. Заранее спасибо а помощь!  

 

Непонятно, для вообще этот Singleton нужен. Ведь намного проще создать один экземпляр класса и передавать на него ссылки другим классам. И не будет никаких заморочек:

void OnTick()
  {
        maH4_5_0=1;
        maH4_5_1=2;
        maH4_5_2=3;
        maH4_13_0=4;
        maH4_13_1=5;
        maH4_13_2=6;
   trader* t = new trader();
   if (!t)
      return;

   t.func(); 
  }

Аналогично с классом Indicator. Тогда и getInstance можно смело выкинуть.

Dmitry Fedoseev
41190
Dmitry Fedoseev 2015.10.05 03:57  
Grossmester:
Просто показалось, что Вы разбираетесь и увидели ошибку
Как-то было дело, разобрался. Только уже забыл, неитересно. Попробуйте воспользоваться поиском, есть здесь такая тема и рабочий код.
Dmitry Fedoseev
41190
Dmitry Fedoseev 2015.10.05 03:59  
Нашел - ВотЪ
Евгений
16
Евгений 2015.10.05 17:34  
Всем спасибо за помощь, решил проблему
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий