Полезные функции от KimIV

 

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

Начну с функций, предназначенных для работы с ордерами, по просьбе Lukyanov в теме "Как два советника одновременно запустить" в конце.

Пусть первой будет функция установки ордера (версия для тестера МТ4):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+
 
А будут ли публиковаться функции для реальной торговли? П.С.: Спасибо за тему. Думаю она будет весьма популярной и востребованной.
 
Здравствуйте, Игорь!
Поддерживаю идею. Правильное решение........!!!
Кода Вашего огромное количество, вопросы возникают частенько, а обращаться к Вам в чужих постах и по другим темам как-то не хорошо.
 

Замечательно.

Предложение разработчикам: начать формирование библиотеки функций. По моим представлениям, для этого желательно предъявить сообществу требования к оформлению (например, обязательно должно присутствовать описание переменных, оговорены ограничения по использованию, количество символов в строке и т.д.). Хорошо бы MQ-вскую статью на эту тему.

Со временем в библиотеке появятся не только простые, но и сложные функции.

 
Lukyanov:
А будут ли публиковаться функции для реальной торговли?

Да, будут... Следующей будет функция SetOrder() для онлайн-торговли...


Примеры использования функции SetOrder():

1. Установка ордера BuyLimit лотом 0.1 на 50 пунктов ниже текущей цены:

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point);

2. Установка ордера BuyStop лотом 0.3 на 36 пунктов выше текущей цены со стопом 32 пункта:

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+36*Point, Ask+(36-32)*Point);

3. Установка ордера SellLimit лотом 0.2 на 42 пунктов выше текущей цены с тейком 50 пунктов:

SetOrder(NULL, OP_SELLLIMIT, 0.2, Bid+42*Point, 0, Bid+(42-50)*Point);

4. Установка ордера SellStop лотом 0.5 на 100 пунктов ниже текущей цены со стопом 30 пунктов и тейком 70 пунктов:

SetOrder(NULL, OP_SELLSTOP, 0.5, Bid-100*Point, Bid-(100-30)*Point, Bid-(100+70)*Point);

5. Установка ордера BuyLimit лотом 0.1 на 50 пунктов ниже текущей цены с магиком 123456 и сроком истечения через два часа:

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point, 0, 0, 123456, TimeCurrent()+2*60*60);
В прицепе реальноработающий скрипт с вышеприведёнными примерами. Первые четыре примера закомментированы.
Файлы:
 
VBAG:
Здравствуйте, Игорь!
Поддерживаю идею. Правильное решение........!!!
Кода Вашего огромное количество, вопросы возникают частенько, а обращаться к Вам в чужих постах и по другим темам как-то не хорошо.
Ну вот, здесь можно будет пообщаться. Формулируйте вопросы, с удовольствием отвечу :-)
 
Покажите Вашу версию задержек между торговыми операциями 
Спасибо.
 
Спасибо за полезную тему, хотя я и о горелых пирогах, но все же может кто-то сталкивался с проблемой складирования и выборок из больших массивов данных в мкл. Мкл и базы данных? Никто в этом направлении не думал?
 
zhuki писал (а):
Покажите Вашу версию задержек между торговыми операциями

Между торговыми операциями я задержек не делаю. То есть, если мне нужно выставить два и более ордера, то эти торговые операции я совершаю без паузы между ними. А вот между торговыми попытками, которые приходится повторять, если при обращении к серверу возникает ошибка, делаю паузу согласно рекомендациям разработчиков МТ4. В качестве примера можете посмотреть, как реализованы такие паузы в моей функции SetOrder() для онлайн-торговли. Для разных ошибок, возвращаемых торговым сервером, делаются разные паузы.

Функция SetOrder() предназначена для установки отложенных ордеров. Рекомендуется к использованию в онлайн-торговле на демо и реальных счетах.

Файлы:
 
Очень оригинально,но объясните откуда задержки в 7.7,17,11 сек .Это шутка или обоснованно. И еше,а как быть если несколько экспертов тогда без анализа не обойтись.
 
zhuki:
...объясните откуда задержки в 7.7,17,11 сек . Это шутка или обоснованно.

Какие могут быть шутки с реальными деньгами?

На паузу 7.7 секунды нарвутся ошибки 129 (Неправильная цена bid или ask), 130 (Неправильные стопы), 134 (Недостаточно денег), 136 (Нет цен). Разработчики МТ4 рекомендуют в этих случаях паузы более 5 секунд. Я поставил 7.7 секунды. С таким же успехом можно было поставить 6.1 секунды. Круглые значения не люблю из-за их притягательности, поэтому ставлю некруглые.

Пауза длительностью 17 сек. предполагалась для ошибки 145 (Модификация запрещена). Но, так как функция SetOrder не занимается модификацией, то я убрал обработку этой ошибки. Благодарю, что обратили моё внимание на данный аспект моей функции!

Пауза длительностью 11 сек расположена внутри цикла, проверяющего состояние подсистемы торговли. Тут можно поставить и 15 сек., и 30. Кому как нравится.

zhuki:
И еше,а как быть если несколько экспертов тогда без анализа не обойтись.

Для случая нескольких экспертов на одном торговом счете обрабатывается ошибка 146 (Подсистема торговли занята). Функция SetOrder ждёт, когда подсистема торговли освободится.


Внимание! Предыдущий пост я подредактировал. Внёс изменения в функцию SetOrder.

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