советник работоет на истории но не работает в реальном времени - почему?

 

Здравствуйтепри тесте советника на истории(за предидущий год) он откривает сделки(и покупки и продажи) но когда тот же советник вешаеш на демо щет в реальном времени то он почемуто не откривает сделки. кнопка авто трговля включена, ув свойствах експерта стоит разрешить советнику торговать, рожица советника улибаетьсяв верхнем левом углу но ордери не откривает. при етом никаких сообщений об ошибках открития ордера или вообще каких небуть ошибок нет ни во вкладке "експерт" ни во вкладке "журнал". также если скажем советник неделю висит прикрепленний к валютной паре и не видает никаких ордеров вообще то если потом протестировать ево на истории на етой же неделе то показивает несколька ордеров. буду признателен за любие соображения по етому поводу.текст советника прилагаеться:

//extern int    n =0;//------------ відстань до появи сигналів   

extern double k = 110;//------------ Різниця об`ємів - сигнал

//extern double h = 200;//------------ відстань до ще одного ордера        

extern int    t = 22;//------------- час закриття ордерів

extern int    a = 9;//-------------- мультиплікатор об'єму першого ордеру

//extern int    d = 2;//-------------- мультиплікатор об'єму другого ордеру

//extern int    f = 2;//-------------- мультиплікатор об'єму третього ордеру

extern int    q = 2;//-------------- MA mode

extern int    w = 1;//-------------- MA applied price 

extern int    l = 14;//-------------- MA period

extern double SL = 1100;

extern double TP = 900;

double O,O1,C1,V,V1,V2,MA;

//double body,signal,up,down,Distance,Distance2;

string symbol = "EURGBP";

int ticket;

int magik = 1234;

//int magik2 = 123;

double vol,slb,tpb,sls,tps;

//+------------------------------------------------------------------+

//| expert initialization function                                   |

//+------------------------------------------------------------------+

int init()

{   

   return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function                                 |

//+------------------------------------------------------------------+

int deinit()

{

return(0);

}

//+------------------------------------------------------------------+

//| expert start function                                            |

//+------------------------------------------------------------------+

int start()

{

O = iOpen(symbol,PERIOD_D1,0);                                        //Відкриття денногобару(точка порівняння)

V = iVolume(symbol,PERIOD_M5,0);

V1 = iVolume(symbol,PERIOD_M5,1);

V2 = iVolume(symbol,PERIOD_M5,2);

//up = O + n*Point;

//down = O - n*Point;

vol = AccountBalance()/20000; 

MA = iMA(symbol,PERIOD_M5,l,0,q,w,NULL);

if (TimeHour(TimeCurrent()) <=17 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)   

{  

//========================================================================  ПЕРШИЙ ОРДЕР НА КУПІВЛЮ                       

  if(CountBuy() == 0 && Ask < MA)//---------------------------------------  умови відкриття першого ордеру на купівлю

   {//--------------------------------------------------------------------  якщо умови виконуються виконуємо наступні дії:

   tpb = Ask + TP*Point;//------------------------------------------------  визначаємо тейк профіт для першого ордера на купівлю

   slb = Ask - SL*Point;//------------------------------------------------  визначаємо стоп лос для першого ордеру на купівлю

   CloseSell();//---------------------------------------------------------  закриття всіх ордерів на продажу якщо вони є

   ticket = OrderSend(symbol,OP_BUY,vol*a,Ask,5,slb,tpb,0,magik,0,0);//---  відкриваємо перший ордер на купівлю

//   Distance = Ask - h*Point; //-------------------------------------------  визначаємо відстань до другого ордеру

   }//--------------------------------------------------------------------  закінчили виконання дій які відносяться до умови відкриття першого ордеру на купівлю


//========================================================================  ПЕРШИЙ ОРДЕР НА ПРОДАЖУ

  if(CountSell() == 0 && Bid > MA)//--------------------------------------  умови відкриття першого ордеру на ПРОДАЖУ

   {//--------------------------------------------------------------------  якщо умови виконуються виконуємо наступні дії:

   tps = Bid - TP*Point;//------------------------------------------------  визначаємо тейк профіт для першого ордера на продажу

   sls = Bid + SL*Point;//------------------------------------------------  визначаємо стоп лос для першого ордеру на продажу

   CloseBuy();//----------------------------------------------------------  закриття всіх ордерів на купівлю якщо вони є

   ticket = OrderSend(symbol,OP_SELL,vol*a,Bid,5,sls,tps,0,magik,0,0);//---  відкриваємо перший ордер на продажу

//   Distance = Bid + h*Point;//--------------------------------------------  визначаємо відстань до другого ордеру

   } //-------------------------------------------------------------------  закінчили виконання дій які відносяться до умови відкриття першого ордеру на продажу

/*

//====================================================================================  ДРУГИЙ ОРДЕР НА КУПІВЛЮ       

  if(CountBuy() == 1 && Distance - Ask >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//------  умови відкриття другого ордеру на купівлю

   ticket = OrderSend(symbol,OP_BUY,vol*d,Ask,5,Ask - SL*Point,tpb,0,magik2,0,0);//---  відкриваємо другий ордер на купівлю

   Distance2 = Ask -  h*Point;//------------------------------------------------------  визначаємо відстань до третього ордеру

}   


//====================================================================================  ДРУГИЙ ОРДЕР НА ПРОДАЖУ

  if(CountSell() == 1 && Bid - Distance  >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//--------  умови відкриття другого ордеру на продажу

   ticket = OrderSend(symbol,OP_SELL,vol*d,Bid,5,Bid + SL*Point,tps,0,magik2,0,0);//--  відкриваємо другий ордер на продажу  

   Distance2 = Bid + h*Point;//-------------------------------------------------------  визначаємо відстань до третього ордеру

}   

//====================================================================================  ТРЕТІЙ ОРДЕР НА КУПІВЛЮ                      

  if(CountBuy() == 2 && Distance2 - Ask >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//---------  умови відкриття третього ордеру на купівлю

    ticket = OrderSend(symbol,OP_BUY,f*vol,Ask,5,Ask - SL*Point,tpb,0,0,0,0);//-------  відкриваємо третій ордер на купівлю

      

//====================================================================================  ТРЕТІЙ ОРДЕР НА ПРОДАЖУ                

  if(CountSell() == 2 && Bid - Distance2 >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//--------  умови відкриття третього ордеру на продажу

   ticket = OrderSend(symbol,OP_SELL,f*vol,Bid,5,Bid + SL*Point,tps,0,0,0,0);//-------  відкриваємо третій ордер на продажу

*/ }  

//====================================================================================  ЗАКРИТТЯ ОРДЕРІВ ПО ЧАСУ

if (TimeHour(TimeCurrent()) >= t) 

{

CloseBuy();

CloseSell();

}

  return(0);

}  

//====================================================================================  ФУНКЦІЇ

int CountBuy()

{

 int count = 0;

 for (int i = OrdersTotal() - 1; i>=0; i--)

 {

  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)

  {

   if (OrderSymbol() == symbol)

   {

     if (OrderType() == OP_BUY)

      count ++;

   }}  

 }

 return(count);

}

//+------------------------------------------------------------------+

int CountSell()

{

 int count = 0;

 for (int i = OrdersTotal() - 1; i>=0; i--)

 {

  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)

  {

   if (OrderSymbol() == symbol)

   {

     if (OrderType() == OP_SELL)

      count ++;

   }}  

 }

 return(count);

}

//+------------------------------------------------------------------+

void CloseBuy()

{

 int count = 0;

 for (int i = OrdersTotal() - 1; i>=0; i--)

 {

  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)

  {

   if (OrderType() == OP_BUY )

   {

      OrderClose(OrderTicket(),OrderLots(),Bid,3,0);

   }}  

 }

}

//+------------------------------------------------------------------+

void CloseSell()

{

 int count = 0;

 for (int i = OrdersTotal() - 1; i>=0; i--)

 {

  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)

  {

   if (OrderType() == OP_SELL)

   {

      OrderClose(OrderTicket(),OrderLots(),Ask,3,0);

   }  

 }}

}

//+------------------------------------------------------------------+

 

Пожалуйста вставляйте код должным образом, через SRC

 
//extern int    n =0;//------------ відстань до появи сигналів   
extern double k = 110;//------------ Різниця об`ємів - сигнал
//extern double h = 200;//------------ відстань до ще одного ордера        
extern int    t = 22;//------------- час закриття ордерів
extern int    a = 9;//-------------- мультиплікатор об'єму першого ордеру
//extern int    d = 2;//-------------- мультиплікатор об'єму другого ордеру
//extern int    f = 2;//-------------- мультиплікатор об'єму третього ордеру
extern int    q = 2;//-------------- MA mode
extern int    w = 1;//-------------- MA applied price 
extern int    l = 14;//-------------- MA period
extern double SL = 1100;
extern double TP = 900;
double O,O1,C1,V,V1,V2,MA;
//double body,signal,up,down,Distance,Distance2;
string symbol = "EURGBP";
int ticket;
int magik = 1234;
//int magik2 = 123;
double vol,slb,tpb,sls,tps;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{   
   return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
O = iOpen(symbol,PERIOD_D1,0);                                        //Відкриття денногобару(точка порівняння)
V = iVolume(symbol,PERIOD_M5,0);
V1 = iVolume(symbol,PERIOD_M5,1);
V2 = iVolume(symbol,PERIOD_M5,2);
//up = O + n*Point;
//down = O - n*Point;
vol = AccountBalance()/20000; 
MA = iMA(symbol,PERIOD_M5,l,0,q,w,NULL);
if (TimeHour(TimeCurrent()) <=17 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)   
{  
//========================================================================  ПЕРШИЙ ОРДЕР НА КУПІВЛЮ                       
  if(CountBuy() == 0 && Ask < MA)//---------------------------------------  умови відкриття першого ордеру на купівлю
   {//--------------------------------------------------------------------  якщо умови виконуються виконуємо наступні дії:
   tpb = Ask + TP*Point;//------------------------------------------------  визначаємо тейк профіт для першого ордера на купівлю
   slb = Ask - SL*Point;//------------------------------------------------  визначаємо стоп лос для першого ордеру на купівлю
   CloseSell();//---------------------------------------------------------  закриття всіх ордерів на продажу якщо вони є
   ticket = OrderSend(symbol,OP_BUY,vol*a,Ask,5,slb,tpb,0,magik,0,0);//---  відкриваємо перший ордер на купівлю
//   Distance = Ask - h*Point; //-------------------------------------------  визначаємо відстань до другого ордеру
   }//--------------------------------------------------------------------  закінчили виконання дій які відносяться до умови відкриття першого ордеру на купівлю


//========================================================================  ПЕРШИЙ ОРДЕР НА ПРОДАЖУ
  if(CountSell() == 0 && Bid > MA)//--------------------------------------  умови відкриття першого ордеру на ПРОДАЖУ
   {//--------------------------------------------------------------------  якщо умови виконуються виконуємо наступні дії:
   tps = Bid - TP*Point;//------------------------------------------------  визначаємо тейк профіт для першого ордера на продажу
   sls = Bid + SL*Point;//------------------------------------------------  визначаємо стоп лос для першого ордеру на продажу
   CloseBuy();//----------------------------------------------------------  закриття всіх ордерів на купівлю якщо вони є
   ticket = OrderSend(symbol,OP_SELL,vol*a,Bid,5,sls,tps,0,magik,0,0);//---  відкриваємо перший ордер на продажу
//   Distance = Bid + h*Point;//--------------------------------------------  визначаємо відстань до другого ордеру
   } //-------------------------------------------------------------------  закінчили виконання дій які відносяться до умови відкриття першого ордеру на продажу
/*
//====================================================================================  ДРУГИЙ ОРДЕР НА КУПІВЛЮ       
  if(CountBuy() == 1 && Distance - Ask >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//------  умови відкриття другого ордеру на купівлю
{ 
   ticket = OrderSend(symbol,OP_BUY,vol*d,Ask,5,Ask - SL*Point,tpb,0,magik2,0,0);//---  відкриваємо другий ордер на купівлю
   Distance2 = Ask -  h*Point;//------------------------------------------------------  визначаємо відстань до третього ордеру
}   

//====================================================================================  ДРУГИЙ ОРДЕР НА ПРОДАЖУ
  if(CountSell() == 1 && Bid - Distance  >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//--------  умови відкриття другого ордеру на продажу
{ 
   ticket = OrderSend(symbol,OP_SELL,vol*d,Bid,5,Bid + SL*Point,tps,0,magik2,0,0);//--  відкриваємо другий ордер на продажу  
   Distance2 = Bid + h*Point;//-------------------------------------------------------  визначаємо відстань до третього ордеру
}   

//====================================================================================  ТРЕТІЙ ОРДЕР НА КУПІВЛЮ                      
  if(CountBuy() == 2 && Distance2 - Ask >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//---------  умови відкриття третього ордеру на купівлю
    ticket = OrderSend(symbol,OP_BUY,f*vol,Ask,5,Ask - SL*Point,tpb,0,0,0,0);//-------  відкриваємо третій ордер на купівлю
      

//====================================================================================  ТРЕТІЙ ОРДЕР НА ПРОДАЖУ                
  if(CountSell() == 2 && Bid - Distance2 >= 0 && (V1 - k >= V2 || V2 - k >= V1) && V == 1)//--------  умови відкриття третього ордеру на продажу
   ticket = OrderSend(symbol,OP_SELL,f*vol,Bid,5,Bid + SL*Point,tps,0,0,0,0);//-------  відкриваємо третій ордер на продажу

*/ }  

//====================================================================================  ЗАКРИТТЯ ОРДЕРІВ ПО ЧАСУ

if (TimeHour(TimeCurrent()) >= t) 
{
CloseBuy();
CloseSell();
}
  return(0);
}  

//====================================================================================  ФУНКЦІЇ
int CountBuy()
{
 int count = 0;
 for (int i = OrdersTotal() - 1; i>=0; i--)
 {
  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)
  {
   if (OrderSymbol() == symbol)
   {
     if (OrderType() == OP_BUY)
      count ++;
   }}  
 }
 return(count);
}

//+------------------------------------------------------------------+
int CountSell()
{
 int count = 0;
 for (int i = OrdersTotal() - 1; i>=0; i--)
 {
  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)
  {
   if (OrderSymbol() == symbol)
   {
     if (OrderType() == OP_SELL)
      count ++;
   }}  
 }
 return(count);
}

//+------------------------------------------------------------------+
void CloseBuy()
{
 int count = 0;
 for (int i = OrdersTotal() - 1; i>=0; i--)
 {
  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)
  {
   if (OrderType() == OP_BUY )
   {
      OrderClose(OrderTicket(),OrderLots(),Bid,3,0);
   }}  
 }
}
//+------------------------------------------------------------------+

void CloseSell()
{
 int count = 0;
 for (int i = OrdersTotal() - 1; i>=0; i--)
 {
  if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true)
  {
   if (OrderType() == OP_SELL)
   {
      OrderClose(OrderTicket(),OrderLots(),Ask,3,0);
   }  
 }}
}
//+------------------------------------------------------------------+
 
Vladimir Zubov:


Спасибо за поправку,

это мой первый пост, прошу прощения

 
Навскидку скажу, нормализуйте лот и цены стоп-лосс и тейк-профит до нужной значности, в тестере может оно и не влияет, а на демо при взаимодействии с сервером возможны нюансы, даже если и нет ошибок в журнале.
 
Vladimir Zubov:
Навскидку скажу, нормализуйте лот и цены стоп-лосс и тейк-профит до нужной значности, в тестере может оно и не влияет, а на демо при взаимодействии с сервером возможны нюансы, даже если и нет ошибок в журнале.

не помогло я нормализавал лот и цены стоп-лосс и тейк-профит а также поставил параметр К =0 и вркмя открития ордеров <=25 чтоб советник сразу же действовал но ничево не происходит
 
Mykola Mazur:

не помогло я нормализавал лот и цены стоп-лосс и тейк-профит а также поставил параметр К =0 и вркмя открития ордеров <=25 чтоб советник сразу же действовал но ничево не происходит

Тогда надо в принты или в камент на журнале выводить переменные с которыми вы работаете и смотреть что там за цифры, и дальше оценивать логику исходя из этих цифр. У вас там объёмы используются в исторических данных и на демке они могут вообще не совпадать, это 99.9%  iVolume
 
И ещё, у каждого ДЦ iVolume в свече будет разный, зависит от их котировок, то что вы тестируете в тестере, даже если добъётесь что бы работало на демо и реале, никогда не совпадет с результатами тестера.
 
Vladimir Zubov:

Тогда надо в принты или в камент на журнале выводить переменные с которыми вы работаете и смотреть что там за цифры, и дальше оценивать логику исходя из этих цифр. У вас там объёмы используются в исторических данных и на демке они могут вообще не совпадать, это 99.9%  iVolume

я проводил оптимизацию советника на историчиских данних можна ли в таком случае говорить что подобранние мною параметри имеют хоть какую либо ценность или ето просто какието цифирки полученние на основе какихто другигх циферок(исторических данних) не имеющие ничево общего с торговлей в реальном времени на демке неговоря уже о реальних деньгах?

 
Mykola Mazur:

я проводил оптимизацию советника на историчиских данних можна ли в таком случае говорить что подобранние мною параметри имеют хоть какую либо ценность или ето просто какието цифирки полученние на основе какихто другигх циферок(исторических данних) не имеющие ничево общего с торговлей в реальном времени на демке неговоря уже о реальних деньгах?


Вы проводите оптимизацию на котировках с сервера MetaQuotes, обёъмы в МТ4 терминале это не более чем количество тиков в свече, у разных ДЦ разные поставщики котировок и разный поток тиков в промежуток времени, данные по объемам всегда будут разные и отличаться между ДЦ и тем более от тестера MQL. Адекватный тест в MT4 это только если советник анализирует цены закрытых свечей, но никак не объёмы.
 
Vladimir Zubov:

Вы проводите оптимизацию на котировках с сервера MetaQuotes, обёъмы в МТ4 терминале это не более чем количество тиков в свече, у разных ДЦ разные поставщики котировок и разный поток тиков в промежуток времени, данные по объемам всегда будут разные и отличаться между ДЦ и тем более от тестера MQL. Адекватный тест в MT4 это только если советник анализирует цены закрытых свечей, но никак не объёмы.

понял, спасибо за ответи