Открытие ордера на той же свече

 

Как лучше реализовать алгоритм, который не позволит открыть второй ордер на свечке на которой уже открыт один ордер?

По ходу в мт нет такой опции как порядковый номер бара, а по времени сообразить не могу как распознать что текущий бар еще не сменился?

Желательно с примерами кода

 
if (iBarShift(NULL,0,t_Open)>0)
   {
   OrderSend(Symbol(),OP_BUY,Lot,Ask,5,0,0; 
   t_Open=TimeCurrent()
   } 

 


Это код, который открывает ордера на каждом последующем баре. Или же других барах, в зависимости от других критерий входа, которые появляются в вашем эксперте. Тут никаких критериев нету. Поэтому этот код будет открывать позиции каждый новый бар.

iBarShift(NULL,0,t_Open)
Показывает сколько прошло баров с момента последнего открытого ордера

 

после кода ф-я;


int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1)

{
datetime t;
int i, k=OrdersTotal();

if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==sy)
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL||OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP||OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
{
if (op<0 || OrderType()==op)
{
if (mn<0 || OrderMagicNumber()==mn)
{
if (t<OrderOpenTime()) t=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));

}


( и в условиях : )

&&!NumberOfBarOpenLastPos(NULL,DELAYS,OP_SELL) ==0) ( или же BUY....и т.д. )
 

мне не нужно открываться на каждом баре, мне не нужны бары в прошлом.

в случае сигнала открывается ордер на текущей свече, смысл - недопустить открытия еще ордеров на текущей свече если даже поступит сигнал.

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

а то что вы пиводите в примере - это смещение а не номер бара.

 

обьявляете глобально BBars=0; и запускаете в int start() вот эту конструкцию -->

if(BBars!=Bars)
  {
   BBars=Bars;
   // код...
  } 

конструкция блокирует участок кода помещённого в неё от повторного запуска на уже один раз общитоном баре.

 
Skymer >>:

мне не нужно открываться на каждом баре, мне не нужны бары в прошлом.

в случае сигнала открывается ордер на текущей свече, смысл - недопустить открытия еще ордеров на текущей свече если даже поступит сигнал.

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

а то что вы пиводите в примере - это смещение а не номер бара.

Ну так в чём проблемма. Я же написал, что надо сделать.  При открытии позиции запоминаете время t_Open=TimeCurrent()

А в критерии открытия ордера добавляете условие  if (iBarShift(NULL,0,t_Open)>0)

И всё. Только если пройдёт один бар сделка будет открываться. Читайте,что пишут внимательнее, а не переспрашивайте. 

 
Skymer >>:

Как лучше реализовать алгоритм, который не позволит открыть второй ордер на свечке на которой уже открыт один ордер?

По ходу в мт нет такой опции как порядковый номер бара, а по времени сообразить не могу как распознать что текущий бар еще не сменился?

Желательно с примерами кода

Если Вы хотите, чтобы открытым было не более 1 позиции, то:


int total;

//---------------------------

//---------------------------

total=OrdersTotal();
if(total<1)

{

Сюда вставьте функции открытия позиций

}

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

 
total = OrdersTotal();
short = TRUE;
long = TRUE;
                     for (int cnt = 0; cnt < total; cnt++) {
                      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){
                      if (OrderType() == OP_SELL) short = FALSE;
                      if (OrderType() == OP_BUY) long = FALSE;
                      }
                      }

у меня сейчас вот так прописано в коде....

1) допустим был открыт ордер на нулевом баре и он закрылся, далее мы больше не открываем на этом баре ордер если даже есть сигнал к открытию так как на этом баре уже была сделка и она закрылась, ждем следующий бар.

На каждом баре разрешено открытие только одной сделки, если была сделка на этом баре, - то не открываем ордер, как сделать???

Помогите люди.....))) У меня уже крыша \\\\\\\\>>>>
 

Volume[0] < 2


Это добавить в условие открытия ордера. Если текущий бар содержит более 2 тиков, сделка открываться не будет. 2 здесь из-за возможного проскальзывания или пинга.

 
Gremlin_iD:

Volume[0] < 2


Это добавить в условие открытия ордера. Если текущий бар содержит более 2 тиков, сделка открываться не будет. 2 здесь из-за возможного проскальзывания или пинга.


А если не успели открыться за один тик? Всё - пиши пропало? )))

Чтобы не открыть две и более сделок на одной свече, универсальный метод только один: запоминать, что на этой свече уже было открытие. Если же нужно определить наличие сделки на баре после перезапуска программы, то необходимо проанализировать список открытых сделок и историю счета в поисках ордера со временем открытия, большим, чем время открытия текущей свечи.

 
1Rakso:

у меня сейчас вот так прописано в коде....

1) допустим был открыт ордер на нулевом баре и он закрылся, далее мы больше не открываем на этом баре ордер если даже есть сигнал к открытию так как на этом баре уже была сделка и она закрылась, ждем следующий бар.

На каждом баре разрешено открытие только одной сделки, если была сделка на этом баре, - то не открываем ордер, как сделать???

Помогите люди.....))) У меня уже крыша \\\\\\\\>>>>

Немного подправил.
   int total=OrdersTotal();
   datetime oot=0;  //Добавил
//------------------
   for(int cnt=0; cnt<total; cnt++)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
           {
            if(oot<OrderOpenTime()) oot=OrderOpenTime();//Запоминаем время последний поз.
           }
        }
     }
   int Bar=iBarShift(Symbol(),0,oot,True));       //Бар открытия последний поз.
//-------------------
   if(Bar!=0) 
      {
      //Ecли Бар открытия последний поз. не  0, то можно открыватся
      }

Как то так.
Причина обращения: