Закрытие сделок по времени

 
//+------------------------------------------------------------------+
//|                                                e-CloseOnTime.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 2005.11.01  Советник в нужное время закрывает все позиции.       |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

//---- input parameters
extern int   CloseHour     = 7;      // Время закрытия, часы
extern int   CloseMinute   = 0;      // Время закрытия, минуты
extern bool  UseCurrSymbol = False;  // Использовать только один инструмент
extern bool  UseOneAccount = False;  // Использовать только один счёт
extern int   NumberAccount = 11111;  // Номер торгового счёта
extern int   Slippage      = 3;      // Проскальзывание цены
extern color clCloseBuy    = Blue;   // Цвет закрытия покупки
extern color clCloseSell   = Red;    // Цвет закрытия продажи

void start() {
  double pBid, pAsk;

  if (UseOneAccount && AccountNumber()!=NumberAccount) {
    Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
    return;
  } else Comment("");

  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);
          }
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
Мужики помогите из эксперта сделать библиотеку закрытия сделок по времени, или подскажите как запихнуть в тело эксперта невыходит почему то :(?
 

А что конкретно не получается? Вылазит ошибка при компиляции? Не работает как нужно?

Скопировать вот этот кусок

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, спасибо за помощь! я прилепил функцию И.Кима, вроде пока все на тестере нормально завтра в реале проверимс :)
 
FxPro2 >>:
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 минут после закрытия последнего ордера.

Причина обращения: