Ваши вопросы по языку MQL4

vetallic

Местный знаток
почему мелочь, думаю перенести алгоритм открытия ордеров будет достаточно
 

nilva

Активный участник
Доброго времени суток!
Помогите, пожалуйста, подправить участок кода:
Чтобы советник начинал торговать в понедельник с 2:00 и не выставлял новых ордеров в пятницу после в 15:00.
Причем, если есть ордера в рынке то он их бы закрывал по условию работы советника.
Заранее благодарен!
PHP:
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);
//+----------------------------------------------+
 
Последнее редактирование:

реношник

Почетный гражданин
1. такая проверка бесполезна...
PHP:
int start() {
//+----------------------------------------------+
//| Проверка на разрешение торговать
//+----------------------------------------------+   
   if (!IsTradeAllowed()) return (0);

2.
Причем, если есть ордера в рынке то он их бы закрывал по условию работы советника.
Заранее благодарен!

для этого нужно знать условия советника, или хотябы имя функции которая выполняет закрытие...

3.
Доброго времени суток!
Помогите, пожалуйста, подправить участок кода:
Чтобы советник начинал торговать в понедельник с 2:00 и не выставлял новых ордеров в пятницу после в 15:00.

Ниже, конструкция которая задаёт участок работы советника. Немножко переделать и будет то, что тебе нужно...

PHP:
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);
 

eevviill

Заблокирован
Доброго времени суток!
Помогите, пожалуйста, подправить участок кода:
Чтобы советник начинал торговать в понедельник с 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:
//+----------------------------------------------+
//| Проверка на разрешение торговать
//+----------------------------------------------+   
   if (!IsTradeAllowed()) return (0);
 

nilva

Активный участник
2) Получается каждую неделю нужно выставлять это условие?
PHP:
extern string start_day = "2012.01.02 00:00"; 
extern string stop_day = "012.02.11 00:00";
 

реношник

Почетный гражданин
Нет !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
В начале функции Start проверку IsTradeAllowed() ставить НЕЛЬЗЯ !!!!!!!!!!!!!!
 

реношник

Почетный гражданин

Пытаться торговать можно только в том случае, если функция IsTradeAllowed() возвращает TRUE.
Проверку надо делать непосредственно перед торговой операцией.

Пример неправильного использования функции:
PHP:
int start()
  {
    // проверяем, свободен ли торговый поток
    if(!IsTradeAllowed())
      {
        // если функция IsTradeAllowed() вернула FALSE, сообщаем об этом пользователю,
        Print("Торговый поток занят! Эксперт не может открыть позицию!");
        // и прекращаем работу эксперта. Она будет возобновлена с приходом следующего 
        // тика
        return(-1);
      }
    else
      {
        // если функция IsTradeAllowed() вернула TRUE, сообщаем об этом пользователю 
        // и продолжаем работу
        Print("Торговый поток свободен! Продолжаем работу...");
      }
    // определяем необходимость входа в рынок
    ...
    // рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота
    ...
    // открываем позицию
    if(OrderSend(...) < 0) 
        Alert("Ошибка открытия позиции № ", GetLastError());
    return(0);
  }

В этом примере проверка состояния торгового потока происходит в самом начале функции start(). Это ошибочное решение - за время, потраченное экспертом на расчёты (необходимость входа в рынок, уровни Стоп Лосс, Тейк Профит, размер лота и т.п.), торговый поток может быть занят другим экспертом. В этом случае попытка открыть позицию не увенчается успехом.


Пример правильного использования функции:
PHP:
int start()
  {
    // определяем необходимость входа в рынок
    ...
    // рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота
    ...
    // и только теперь проверяем, свободен ли торговый поток
    if(!IsTradeAllowed())
      {
        Print("Торговый поток занят! Эксперт не может открыть позицию!");
        return(-1);
      }
    else
        Print("Торговый поток свободен! Пытаемся открыть позицию...");
    // если проверка прошла успешно, открываем позицию
    if(OrderSend(...) < 0) 
        Alert("Ошибка открытия позиции № ", GetLastError());
    return(0);
  }
 

Dersu

Местный знаток
Вопрос к знатокам, поскольку сам нуб в программировании.
Есть интересная для меня (очень возможно и не только) тема:
_http://codebase.mql4.com/ru/7430
_http://forum.mql4.com/ru/33954/page2
_http://ruforum.mt5.com/threads/5898-indikatori-dlya-vizualnogo-podbora-parametrov?p=553753
Там и ссылки на статьи есть.
Возможно создать кустомский вариант?
Или под каждый индюк нужно код переписывать?
 

expforex

Программиров
теоретически уже создан кустомный вариант но он не оригинален в том плане что все же не все индюки туда можно подставить, Легче сделать шаблон и под него уже вставлять индюки. Это не сложно сама последняя процедура.
 

nilva

Активный участник
Подскажите, пожалуйста, как получить в MQL номер ордера, после его открытия, для дальнейшего оперирования в коде.
В MarketInfo() - нет такой возможности.
Какие свойства ордера можно получить после его установки?
Где лучше всего хранить эту информацию в глобальных переменных или записывать в файл?
 

expforex

Программиров
Если Вам необходимо помнить номера тикетов - то лучше записывать их в глоб переменные.
Функция отправки ордера на сервер OrderSend на выходе дает номер тикета, который был открыт.

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().
Замечания.

Если Вы хотите искать среди открытых сделок свой ордер. то узнать его номер можно командой OrderTicket()
 

nilva

Активный участник
Имеется 30 ордеров.
Какими свойствами я могу их друг от друга отличать, кроме магического номера и комментария?
Дело в том, что каждый номер мне нужно идентифицировать (индивидуальное свойство для каждого ордера), для дальнейших операций.
 

expforex

Программиров
Имеется 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);
}
 
Верх