почему мелочь, думаю перенести алгоритм открытия ордеров будет достаточно
extern int DayStop = 0; // 0-воскресенье. В этот день сов. выставляет ордера только в разрешенное время.
extern int TimeStart = 0; // С какого времени разрешено выставлять ордера
extern int TimeEnd = 24; // По какое время разрешено выставлять ордера
int start() {
//+----------------------------------------------+
//| Проверка на разрешение торговать
//+----------------------------------------------+
if (!IsTradeAllowed()) return (0);
//+----------------------------------------------+
//| Проверка на разрешенное время
//+----------------------------------------------+
bool TimeTrade;
int hour = Hour();
if (TimeStart < TimeEnd && hour >= TimeStart && hour < TimeEnd) TimeTrade = TRUE;
else {
if (TimeStart > TimeEnd && hour >= TimeStart || hour < TimeEnd) TimeTrade = TRUE;
else TimeTrade = FALSE;
}
if(DayOfWeek() == DayStop && !TimeTrade) return(0);
//+----------------------------------------------+
int start() {
//+----------------------------------------------+
//| Проверка на разрешение торговать
//+----------------------------------------------+
if (!IsTradeAllowed()) return (0);
Причем, если есть ордера в рынке то он их бы закрывал по условию работы советника.
Заранее благодарен!
Доброго времени суток!
Помогите, пожалуйста, подправить участок кода:
Чтобы советник начинал торговать в понедельник с 2:00 и не выставлял новых ордеров в пятницу после в 15:00.
extern string start_day = "2012.01.02 00:00";
extern string stop_day = "2012.02.11 00:00";
//------- Глобальные переменные советника -----+
string day;
int start() {
RefreshRates();
//+------------------------------+
//| определение текущего времени |
//+------------------------------+
day = TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
if (day < start_day) return(0);
if (day > stop_day) return(0);
Вот так.Доброго времени суток!
Помогите, пожалуйста, подправить участок кода:
Чтобы советник начинал торговать в понедельник с 2:00 и не выставлял новых ордеров в пятницу после в 15:00.
Причем, если есть ордера в рынке то он их бы закрывал по условию работы советника.
Заранее благодарен!
PHP:extern int DayStart = 1; extern int DayStop = 5; // 0-воскресенье. В этот день сов. выставляет ордера только в разрешенное время. extern int TimeStart = 2; // С какого времени разрешено выставлять ордера extern int TimeEnd = 15; // По какое время разрешено выставлять ордера int start() { //+----------------------------------------------+ //| Проверка на разрешение торговать //+----------------------------------------------+ if (!IsTradeAllowed()) return (0); //+----------------------------------------------+ //| Проверка на разрешенное время //+----------------------------------------------+ bool TimeTrade; int hour = Hour(); if (TimeStart < TimeEnd && hour >= TimeStart && hour < TimeEnd) TimeTrade = TRUE; else { if (TimeStart > TimeEnd && hour >= TimeStart || hour < TimeEnd) TimeTrade = TRUE; else TimeTrade = FALSE; } if((DayOfWeek() < DayStart || DayOfWeek() > DayStop ) && !TimeTrade) return(0); //+----------------------------------------------+
Каким условием это можно проверить?Уберите эту строчку !!!!!!!!!!!!!!!!!!!
PHP:int start() { //+----------------------------------------------+ //| Проверка на разрешение торговать //+----------------------------------------------+ if (!IsTradeAllowed()) return (0);
Каким условием это можно проверить?
2) Получается каждую неделю нужно выставлять это условие?
PHP:extern string start_day = "2012.01.02 00:00"; extern string stop_day = "012.02.11 00:00";
while (!IsTradeAllowed()) Sleep(5000);Каким условием это можно проверить?
Почему?Нет !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
В начале функции Start проверку IsTradeAllowed() ставить НЕЛЬЗЯ !!!!!!!!!!!!!!
Почему?
int start()
{
// проверяем, свободен ли торговый поток
if(!IsTradeAllowed())
{
// если функция IsTradeAllowed() вернула FALSE, сообщаем об этом пользователю,
Print("Торговый поток занят! Эксперт не может открыть позицию!");
// и прекращаем работу эксперта. Она будет возобновлена с приходом следующего
// тика
return(-1);
}
else
{
// если функция IsTradeAllowed() вернула TRUE, сообщаем об этом пользователю
// и продолжаем работу
Print("Торговый поток свободен! Продолжаем работу...");
}
// определяем необходимость входа в рынок
...
// рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота
...
// открываем позицию
if(OrderSend(...) < 0)
Alert("Ошибка открытия позиции № ", GetLastError());
return(0);
}
int start()
{
// определяем необходимость входа в рынок
...
// рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота
...
// и только теперь проверяем, свободен ли торговый поток
if(!IsTradeAllowed())
{
Print("Торговый поток занят! Эксперт не может открыть позицию!");
return(-1);
}
else
Print("Торговый поток свободен! Пытаемся открыть позицию...");
// если проверка прошла успешно, открываем позицию
if(OrderSend(...) < 0)
Alert("Ошибка открытия позиции № ", GetLastError());
return(0);
}
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания.
Имеется 30 ордеров.
Какими свойствами я могу их друг от друга отличать, кроме магического номера и комментария?
Дело в том, что каждый номер мне нужно идентифицировать (индивидуальное свойство для каждого ордера), для дальнейших операций.
void Перебор()
{
int i,k=OrdersTotal();
for(i=0;i<k;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
OrderTicket() ; // - В данном случае здесь будет показывать тикет каждой позиции
Print(OrderTicket()) ; // -А здесь будет принтоваться в журнал
}
}
return(False);
}