Как правильно в mql4 делать не более одной ставки в одном баре. - страница 2

 
Vinin:


Удачи Вам. Но если придет несколько тиков подряд несколько баров подряд, то я Вам не завидую. Прошу прощения за тафталогию


Извините, ещё ставлю ограничение на количество ордеров в extern. Tak что не перебарщиваю.

Спасибо за совет! Подумаю, что и как применять, особенно, только для отдельных участков кода. Это я применяю для открытия отложенного ордера, его траления и траления уже открытой позиции, начиная с безубытка.

 

По моей стратегии в течении действия текущего барa тоже можно открывать только 1 позицию. Когда появляется новый бар то можно отрыть новую, при этом предыдущая(-ие) может(-ут) быть открытa(-ы), а потом на каком-то 1 баре все могут быть закрыты.

Определяю время открытия текущего бара по iTime(), затем добавляю количество секунд (24*60*60 - это для D1, для Н1 - 1*60*60, для М30 - 0.5*60*60 и т.д.), когда текущий бар должен быть закрыт и сравниваю время отрытия уже открытых позиций с начальным и вычисленным на будущее временем закрытия текущего бара.

   if (OrdersTotal()>0)
   {  for (i=0; i<=OrdersTotal(); i++)
      {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {  if (OrderSymbol()==Symbol() && 
                OrderOpenTime()> iTime(NULL,PERIOD_D1,0) && 
                OrderOpenTime()<(iTime(NULL,PERIOD_D1,0)+24*60*60))
            {   Sleep(10000); return(0);
            }
   }  }  }
 
Vinin:


Удачи Вам. Но если придет несколько тиков подряд несколько баров подряд, то я Вам не завидую. Прошу прощения за тафталогию

Виктор, мы уже обсуждали этот вопрос. Здесь, очевидно, следует учесть, что если советник стоит на минутном или 5-минутном ТФ, то ничего страшного не произойдёт при пропуске бара. Если же речь идёт, например о 60, 240 или 1440, то пропуск бара действительно критичен. Может поэтому у нас разный взгляд на этот вопрос?

Что вы думаете по этому поводу?

 
paladin80:

По моей стратегии в течении действия текущего барa тоже можно открывать только 1 позицию. Когда появляется новый бар то можно отрыть новую, при этом предыдущая(-ие) может(-ут) быть открытa(-ы), а потом на каком-то 1 баре все могут быть закрыты.

Определяю время открытия текущего бара по iTime(), затем добавляю количество секунд (24*60*60 - это для D1, для Н1 - 1*60*60, для М30 - 0.5*60*60 и т.д.), когда текущий бар должен быть закрыт и сравниваю время отрытия уже открытых позиций с начальным и вычисленным на будущее временем закрытия текущего бара.


Подскажите код который может закрыть все ордера открытые скажем два часа назад?

Или как открыть при каком-либо условии ордер и через два часа его закрыть.

 
user_25:


Подскажите код который может закрыть все ордера открытые скажем два часа назад?

Или как открыть при каком-либо условии ордер и через два часа его закрыть.

Могу предложить следующее
double Lot;
if (OrdersTotal()>0)
   {  for (int i=0; i<OrdersTotal(); i++)
      {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {  if (OrderSymbol()!=Symbol()) continue;
               if (OrderOpenTime()<=(TimeCurrent()-2*60*60))
               {  if (OrderType()==OP_BUY)
                  {  RefreshRates();
                     OrderClose(OrderTicket(),Lot,Bid,5,CLR_NONE); return(0);
                  }
                  if (OrderType()==OP_SELL)
                  {  RefreshRates();
                     OrderClose(OrderTicket(),Lot,Ask,5,CLR_NONE); return(0);
   }  }  }     }  }
решение (без модуля обработки ошибок). В случае если уже открытый ордер (не отложенный) надо закрыть через 2 часа то пишем 2*60*60, если n часов, то n*60*60, если m минут то m*60, если d дней то d*24*60*60 (n, m, d целые положительные числа).
 

paladin80:

double Lot;
if (OrdersTotal()>0)
   {  for (int i=0; i<OrdersTotal(); i++)
      {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {  if (OrderSymbol()!=Symbol()) continue;
               if (OrderOpenTime()<=(TimeCurrent()-2*60*60))
               {  if (OrderType()==OP_BUY)
                  {  RefreshRates();
                     OrderClose(OrderTicket(),Lot,Bid,5,CLR_NONE); return(0);
                  }
                  if (OrderType()==OP_SELL)
                  {  RefreshRates();
                     OrderClose(OrderTicket(),Lot,Ask,5,CLR_NONE); return(0);
   }  }  }     }  }


Могу предложить следующее решение (без модуля обработки ошибок). В случае если уже открытый ордер (не отложенный) надо закрыть через 2 часа то пишем 2*60*60, если n часов, то n*60*60, если m минут то m*60, если d дней то d*24*60*60 (n, m, d целые положительные числа).
Неверно.
 
VladislavVG:
Неверно.
Кстати у меня давно назревал вопрос. Есть ли какой то один правильный алгоритм перебора ордеров? До сих я видел следующее:
   for (int i=0; i<OrdersTotal(); i++)      // 1.
   for (int i=1; i<OrdersTotal()-1; i++)    // 2.
   for (int i<OrdersTotal; i=0; i--)        // 3.
   
   int total=OrdersTotal();
   for (int i=0; i<total; i++)              // 4.
Я относительне недавно начал писать эксперты для себя, поэтому с моей строны возможны ошибки.
 
paladin80:
Кстати у меня давно назревал вопрос. Есть ли какой то один правильный алгоритм перебора ордеров? До сих я видел следующее: Я относительне недавно начал писать эксперты для себя, поэтому с моей строны возможны ошибки.

подчеркнуто где неверно - это обсуждалось неоднократно: перебор должен идти в другую сторону иначе будут пропускаться ордера.

for( int i=OrdersTotal()-1;i>=0;i--)
{
......
}
 
Прогуляйся до казино, сделай ставку на красое/черное/зеро...если крупье не заряжен.... Ставка - один бар - и будет тебе правЕльно или не правЕльно... ПОДНИМЕШЬ БАБЛА! БУ-ГА-ГА-ГА!....
 
user_25:


Подскажите код который может закрыть все ордера открытые скажем два часа назад?

Или как открыть при каком-либо условии ордер и через два часа его закрыть.

double Lot;
if (OrdersTotal()>0)
   {  for( int i=OrdersTotal()-1; i>=0; i--)
      {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {  if (OrderSymbol()!=Symbol()) continue;
               if (OrderOpenTime()<=(TimeCurrent()-2*60*60))
               {  if (OrderType()==OP_BUY)
                  {  RefreshRates();
                     OrderClose(OrderTicket(),Lot,Bid,5,CLR_NONE); return(0);
                  }
                  if (OrderType()==OP_SELL)
                  {  RefreshRates();
                     OrderClose(OrderTicket(),Lot,Ask,5,CLR_NONE); return(0);
   }  }  }     }  }
Так правельнее.
Причина обращения: