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; // код... }
конструкция блокирует участок кода помещённого в неё от повторного запуска на уже один раз общитоном баре.
мне не нужно открываться на каждом баре, мне не нужны бары в прошлом.
в случае сигнала открывается ордер на текущей свече, смысл - недопустить открытия еще ордеров на текущей свече если даже поступит сигнал.
если бы у свечей был порядковый номер начиная с начала года - топри открытии позы можно было запомнить номер свечи и в случае сигнала сверить номер свечи на которой появился сигнал.
а то что вы пиводите в примере - это смещение а не номер бара.
Ну так в чём проблемма. Я же написал, что надо сделать. При открытии позиции запоминаете время t_Open=TimeCurrent()
А в критерии открытия ордера добавляете условие if (iBarShift(NULL,0,t_Open)>0)
И всё. Только если пройдёт один бар сделка будет открываться. Читайте,что пишут внимательнее, а не переспрашивайте.
Как лучше реализовать алгоритм, который не позволит открыть второй ордер на свечке на которой уже открыт один ордер?
По ходу в мт нет такой опции как порядковый номер бара, а по времени сообразить не могу как распознать что текущий бар еще не сменился?
Желательно с примерами кода
Если Вы хотите, чтобы открытым было не более 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 здесь из-за возможного проскальзывания или пинга.
Volume[0] < 2
Это добавить в условие открытия ордера. Если текущий бар содержит более 2 тиков, сделка открываться не будет. 2 здесь из-за возможного проскальзывания или пинга.
А если не успели открыться за один тик? Всё - пиши пропало? )))
Чтобы не открыть две и более сделок на одной свече, универсальный метод только один: запоминать, что на этой свече уже было открытие. Если же нужно определить наличие сделки на баре после перезапуска программы, то необходимо проанализировать список открытых сделок и историю счета в поисках ордера со временем открытия, большим, чем время открытия текущей свечи.
у меня сейчас вот так прописано в коде....
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, то можно открыватся }Как то так.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как лучше реализовать алгоритм, который не позволит открыть второй ордер на свечке на которой уже открыт один ордер?
По ходу в мт нет такой опции как порядковый номер бара, а по времени сообразить не могу как распознать что текущий бар еще не сменился?
Желательно с примерами кода