Пожалуйста помогите разобраться с этим ! - страница 3

 
rovlent:
При открытии бара должны открыться ордера.То-есть как только ордер откроется для примера на дневном графике сразу же должны сработать ордера. Но ну на уже сформированном баре.

При использовании конструкции if(Volume[0]>1) return; возможен вариант, что у тебя вообще не откроется ордер. Если была какая-то обработка и первый тик будет не обработан

 
rovlent:
При открытии бара должны открыться ордера.То-есть как только ордер откроется для примера на дневном графике сразу же должны сработать ордера. Но ну на уже сформированном баре.

Ну вставь ты этот "долбанный" prevtime = iTime(Symbol(),PERIOD_D1,0); или prevtime = Time[0]; в функцию init() и займись проблемой "повторного открытия ордера в случае получения ошибки". Научись "отделять мух от котлет"

При первом запуске советника, условие

if(iTime(Symbol(),PERIOD_D1,0) == prevtime)

и т.д., всегда "ложно", т.е. или смирись с "авто выставлением" ордера при запуске, либо "вставь".

(Да и перечитать свое сообщение тоже бывает не плохо).

 
Vinin:
rovlent:
При открытии бара должны открыться ордера.То-есть как только ордер откроется для примера на дневном графике сразу же должны сработать ордера. Но ну на уже сформированном баре.

При использовании конструкции if(Volume[0]>1) return; возможен вариант, что у тебя вообще не откроется ордер. Если была какая-то обработка и первый тик будет не обработан

Вы можете написать код, как должна выглядеть вся эта процедура по открытию ордера. Что я только не перепробовал !!!

 
rovlent:

Вы можете написать код, как должна выглядеть вся эта процедура по открытию ордера. Что я только не перепробовал !!!

int Order_Count[6];

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() { 
   if (bBar)  if (!NevBar()) return(0);

   int cmd=CheckOpen();
   if (cmd==-1) return(0);
   Order_Count_Calculate();
   if (Order_Count[cmd]>0) return(0);  //Проверка открытых позиций того же типа
   int oldcmd=MathAbs(cmd-1);
   if (Order_Count[oldcmd]>0) Order_Close(oldcmd);  //Проверка существования противоположных позиций
   Order_Open(cmd);
   return(0);
} 

//===============================================================================
// Функция контроля нового бара
//===============================================================================
bool NevBar(){
   bool RetVal=false;
   static int TimeOld=0;
   if (TimeOld!=Time[0]) {
      TimeOld=Time[0];
      RetVal=true;
   }
   return(RetVal);
}

//===============================================================================
// Функция возвращаюшая количество ордеров определенного типа исхода из заданных ограничений
//===============================================================================
void Order_Count_Calculate(){
   int i;
   for (i = 0; i < 6; i++) {Order_Count[i] = 0;}
   for (i = OrdersTotal() - 1;  i >= 0;  i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol()) {
            if (OrderMagicNumber() == Magic) {
               Order_Count[OrderType()]++;
            }
         }
      }
   }
}
Я использую примерно такой код
 

Так я понимаю вот эта функция контроля нового бара. ДА.

//===============================================================================
// Функция контроля нового бара
//===============================================================================
bool NevBar(){
   bool RetVal=false;
   static int TimeOld=0;
   if (TimeOld!=Time[0]) {
      TimeOld=Time[0];
      RetVal=true;
   }
   return(RetVal);

То есть вы думаете что после этого кода будет все работать. ДА. Вы думаете что как только откроется новий бар - то откроются ордера.


 
   static int TimeOld=0;
   if (TimeOld!=Time[0]) 
      TimeOld=Time[0];
      Open_buy = OrderSend(Symbol(),OP_BUY,0.04,Ask,3,0,0,"",1,0,Blue);             
      Open_sell = OrderSend(Symbol(),OP_SELL,0.04,Bid,3,0,0,"",1,0,Red);
 
Vinin:
rovlent:

Так я понимаю вот эта функция контроля нового бара. ДА.

//===============================================================================
// Функция контроля нового бара
//===============================================================================
bool NevBar(){
   bool RetVal=false;
   static int TimeOld=0;
   if (TimeOld!=Time[0]) {
      TimeOld=Time[0];
      RetVal=true;
   }
   return(RetVal);

То есть вы думаете что после этого кода будет все работать. ДА. Вы думаете что как только откроется новий бар - то откроются ордера.


 
   static int TimeOld=0;
   if (TimeOld!=Time[0]) 
      TimeOld=Time[0];
      Open_buy = OrderSend(Symbol(),OP_BUY,0.04,Ask,3,0,0,"",1,0,Blue);             
      Open_sell = OrderSend(Symbol(),OP_SELL,0.04,Bid,3,0,0,"",1,0,Red);

Так мы возвращаемся к тому, что было на предыдущей странице.

Может надо смотреть весь код.

Но тестировать надо на том таймфрейме, на котором ждешь работу. На дневках
 
if(Volume[0]>0)
return;

RefreshRates();
Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue);

if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0);
}

RefreshRates();
Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red);

if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);
}
Так лучше... Удачи...
 
kharko:
Так лучше... Удачи...
if(Volume[0]>0)
return;
 
RefreshRates();
Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue);
 
if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0);
}
 
RefreshRates();
Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red);
 
if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);
}

Да и так я делал - не помогает !!!
 
rovlent:

Да и так я делал - не помогает !!!
if(Volume[0]>1)
return;

Сори ... ошибся... А в остальном все верно... Функция GetLastError() хранит инфу о последней операции... теперь вы точно знаете почему не открывается позиция...

Причины не срабатывания бывают разные: реквот, быстрый рынок, медленная связь и т.д.

И еще... если бай позиция не открылась и по ней будет выдана инфа об ошибке, то селл позиция тоже не откроется без всяких объяснений...

if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0); // закомментируйте...
}
Причина обращения: