- Почему так долго идет оптимизация?
- Время для проверки советника
- Помогите из индикатора сделать эксперта
А что конкретно не получается? Вылазит ошибка при компиляции? Не работает как нужно?
Скопировать вот этот кусок
double pBid, pAsk; if (Hour()==CloseHour && Minute()>=CloseMinute) { for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (!UseCurrSymbol || OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) { pBid=MarketInfo(OrderSymbol(), MODE_BID); OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, clCloseBuy); } if (OrderType()==OP_SELL) { pAsk=MarketInfo(OrderSymbol(), MODE_ASK); OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, clCloseSell); } } } } }
в тело эксперта.
Конечно же нужно не забыть скопировать и параметры:
extern int CloseHour = 7; // Время закрытия, часы extern int CloseMinute = 0; // Время закрытия, минуты extern bool UseCurrSymbol = False; // Использовать только один инструме extern int Slippage = 3; // Проскальзывание цены extern color clCloseBuy = Blue; // Цвет закрытия покупки extern color clCloseSell = Red; // Цвет закрытия продажи
1
Тут можно решить либо с помощью глобальной переменной в которой будет хранится время закрытия последнего ордера (или время бара на котором закрытие произошло),
а при появлении сигнала на открытие делаем проверку времени закрытия последнего ордера с текущим,точнее берется разница и если она превышает определенный лимит, то
открываем позицию,иначе-нет.
Если в переменной храним время бара, на котором произошло закрытие ордера, то при открытии сравниваем с текущим баром. Равно-не входим, не равно-входим.
Примерно так:
datetime close_time=0; int start(){ //....... double pBid, pAsk; if (Hour()==CloseHour && Minute()>=CloseMinute) { for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (!UseCurrSymbol || OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) { pBid=MarketInfo(OrderSymbol(), MODE_BID); if(OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, clCloseBuy)) close_time=Time[0];//запоминаем время бара, на котором закрылись } if (OrderType()==OP_SELL) { pAsk=MarketInfo(OrderSymbol(), MODE_ASK); if(OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, clCloseSell)) close_time=Time[0];//запоминаем время бара, на котором закрылись } } } } } if(close_time!=Time[0]) { //тут обрабатываем открытие...... } }
//+----------------------------------------------------------------------------+ //| Возвращает номер бара открытия последней позиции или -1. | //| Функция запрещает открывать несколько ордеров на одном баре | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) { datetime oot; int i, k=OrdersTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (oot<OrderOpenTime()) oot=OrderOpenTime(); } } } } } } return(iBarShift(sym, tf, oot, True)); }Luptator, спасибо за помощь! я прилепил функцию И.Кима, вроде пока все на тестере нормально завтра в реале проверимс :)
//+------------------------------------------------------------------+ //| test.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern int Slippage=20; // Проскальзывание в пунктах //************************************************************ extern int CloseHour = 21; // Время закрытия, часы extern int CloseMinute = 58; // Время закрытия, минуты bool UseCurrSymbol = False; // Использовать только один инструмент //************************************************************* double pBid, pAsk; int timeoldopen; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (NumberOfBarOpenLastPos()>0) {// функция для возврата номера бара //******************************************************************** // Код закрыия сделок по указанному времени * //******************************************************************** if (Hour()==CloseHour && Minute()>=CloseMinute) { for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (!UseCurrSymbol || OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) { pBid=MarketInfo(OrderSymbol(), MODE_BID); OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, Blue); } if (OrderType()==OP_SELL) { pAsk=MarketInfo(OrderSymbol(), MODE_ASK); OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, Red); } } } } } } //****************************************************************************** //Тут должен быть весь код условий на покупку продажу с трейлингами //****************************************************************************** //+----------------------------------------------------------------------------+ // в самом конце кода //+----------------------------------------------------------------------------+ //| Возвращает номер бара открытия последней позиции или -1. | //| Функция запрещает открывать несколько ордеров на одном баре | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) { datetime oot; int i, k=OrdersTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (oot<OrderOpenTime()) oot=OrderOpenTime(); } } } } } } return(iBarShift(sym, tf, oot, True)); }
Добрый день.
Как правильно написать в код эксперта так, чтобы он работал только через определенное время. На пример, он должен закрываться через 1 час и 20 минут от открытие ордера и открыть новый через 20 минут после закрытия последнего ордера.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования