Всем доброго дня суток. Ситуация такая: советник по условию открывает и закрывает сделки по сигналам. Сигнал бай, он закрывает сделки селл и открывает бай. Сигнал селл, закрывает сделку бай и открывает селл. Все работает, но
я хочу сделать, чтобы он после закрытия делал перерыв на какое-то кол-во баров с внешним параметром, затем также, если условия совпадают открывался по ним.
Не подскажете как начать это делать, голову сломал. Спасибо
1) Запоминаете дату бара закрытия сделки в глобальную переменную (определенную вне функции).
2) На каждом тике перед открытием сделки копируете все бары с запомненной даты по текущую стем таймфреймом на котором запущен робот (PERIOD_CURRENT) .
3) Через ф-цию ArraySize - измеряете кол- во элементов в массиве и сравниваете с внешним параметром.
Не подскажете как начать это делать, голову сломал. Спасибо
Не надо ломать голову!
Пробуйте.
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара открытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sy="0",int tf=0,int op=-1,int mn=-1) { datetime t=0; int i,k=OrdersTotal(),b=0; 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) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) { if(t<OrderOpenTime()) t=OrderOpenTime(); } } } } } } b=iBarShift(sy,tf,t,True); if(b==-1)b=0; return(b); } //+------------------------------------------------------------------+
Добавка.
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0",int tf=0,int op=-1,int mn=-1) { datetime t=0; int i,k=OrdersHistoryTotal(),b=0; if(sy=="" || sy=="0") sy=Symbol(); for(i=0; i<k; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderSymbol()==sy) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) { if(t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
хочу сделать, чтобы после закрытия делал перерыв на какое-то кол-во баров с внешним параметром, затем также, если условия совпадают открывался по ним
extern int PauseBarCL = 0; //Пауза баров после закрытия void start() { if(условия для открытий BUY && (BarCL()>=PauseBarCL||BarCL()==-1)) OrderSend(Symbol(),OP_BUY,.............); if(условия для открытий SELL && (BarCL()>=PauseBarCL||BarCL()==-1)) OrderSend(Symbol(),OP_SELL,.............); //-----------------+ }// Start END | //-----------------+ //+------------------------------------------------------------------+ //| Количество баров после закрытия любой позиции (=0 текущ.бар) | //+------------------------------------------------------------------+ int BarCL(){ datetime t=0; for(i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(t<OrderCloseTime())t=OrderCloseTime();} return(iBarShift(Symbol(),0,t,true));}Так понятно будет что куда ?
Спасибо большое, сделал, скомпилировалось. Но ничего в тестере не открылось, т.к советник ищет закрытые сделки в истории ИМХО. Надо что-то прописать в OnInit?
А, ну да, закрытых то нет ещё с первого запуска)) Щас там же поправлю.
А, ну и чтоб он на следующем сигнале входил, а не посередине текущего сигнала после запуска советника
Ну это уже надо код смотреть и сигналы фильтровать.
А, ну да, закрытых то нет ещё с первого запуска)) Щас там же поправлю.
Ну это уже надо код смотреть и сигналы фильтровать.
- www.metatrader5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем доброго дня суток. Ситуация такая: советник по условию открывает и закрывает сделки по сигналам. Сигнал бай, он закрывает сделки селл и открывает бай. Сигнал селл, закрывает сделку бай и открывает селл. Все работает, но
я хочу сделать, чтобы он после закрытия делал перерыв на какое-то кол-во баров с внешним параметром, затем также, если условия совпадают открывался по ним.