« Предыдущий пост | На главную страницу | Следующий пост »

Пример ограничения числа одновременно открытых позиций

В прошлом выпуске я описал функции StartTrading() и StopTrading(), с помощью которых можно ограничить количество одновременно открытых позиций и выставленных ордеров.

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

//+------------------------------------------------------------------+
//|                                           limit_trades.mq4 |
//|                Copyright (c) 2007, Andrey Vedikhin |
//|                                http://www.vedikhin.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2007, Andrey Vedikhin"
#property link      "http://www.vedikhin.blog-forex.org"
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int MaxNumberOfTrades = 3;
if (!StartTrading(MaxNumberOfTrades)) return(0); OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0); StopTrading(); //---- return(0); } //+-------------------------------------------------------------------+ //| StartTrading() | //| Функция должна быть вызвана до OrderSend()| //| | //| Возвращает: | //| true - если можно открывать новую позицию| //| false - если лимит исчерпаг или ошибка | //+-------------------------------------------------------------------+ bool StartTrading(int max_trades) { // залокируем критическую секцию if (Lock("MaxTrades")!=0) return(false);
int open_trades = OrdersTotal();
if (open_trades<max_trades) return(true); else { Print("Уже открыто ", open_trades, " позиций"); Unlock("MaxTrades"); return(false); } } //+------------------------------------------------------------------------+ //| StopTrading() | //| Функция должна быть вызвана после OrderSend()| //+------------------------------------------------------------------------+ void StopTrading() { Unlock("MaxTrades"); return; } //+------------------------------------------------------------------+ //| Lock() | //| | //| Возвращает: | //| 0 - если "критическая секция" успешно | //| заблокирована | //| 1 - в случае ошибки | //| 2 - эксперт остановлен | //| 3 - по таймауту (слишком долго ждали) | //+------------------------------------------------------------------+ int Lock(string GlobVarName, int timeout = 0) { string critical_section = GlobVarName+"Lock";
// проверим, существует ли переменная critical_section if (!GlobalVariableCheck(critical_section)) { if (GetLastError()!=0) return(1);
// переменная не существует, создадим ее if (GlobalVariableSet(critical_section, -1.0)==0) return(1); // переменная создана }
int StartTime = GetTickCount();
// ждем "зеленового света" while (true) { // проверить, не загорелся ли "зеленый свет" if (GlobalVariableGet(critical_section)==-1.0) { // "зеленый свет" загорелся, зажигаем "красный свет" if (GlobalVariableSetOnCondition(critical_section, 1.0, -1.0)) return(0);
// нас опередили, поэтому ждем "зеленового света" }
// проверим, не остановлен ли эксперт if (IsStopped()) return(2);
// таймаут не истек? if (timeout!=0) { if ((GetTickCount()-StartTime)>timeout*1000) return(3); }
// спим 0.1 секунды Sleep(100); } }
//+------------------------------------------------------------------+ //| Unlock() | //| | //| Возвращает: | //| 0 - если "критическая секция" успешно | //| разблокирована | //| 1 - в случае ошибки | //| 2 - эксперт остановлен | //| 3 - по таймауту (слишком долго ждали) | //+------------------------------------------------------------------+ int Unlock(string GlobVarName, int timeout = 0) { string critical_section = GlobVarName+"Lock";
// проверим, существует ли переменная critical_section if (!GlobalVariableCheck(critical_section)) { if (GetLastError()!=0) return(1);
// переменная не существует, создадим ее if (GlobalVariableSet(critical_section, -1.0)==0) return(1);
// переменная создана, поэтому выходим return(-1.0); }
int StartTime = GetTickCount();
// бесконечный цикл while (true) { // пытаемся установить "зеленый свет" if (GlobalVariableSetOnCondition(critical_section, -1.0, 1.0)) return(0);
// проверим, не остановлен ли эксперт if (IsStopped()) return(2);
// таймаут не истек? if (timeout!=0) { if ((GetTickCount()-StartTime)>timeout*1000) return(3); }
// спим 0.1 секунды Sleep(100); } }

В следующем выпуске я расскажу о ночной торговле.



Все статьи по теме "Пишем советников для MetaTrader 4".

« Предыдущий пост | На главную страницу | Следующий пост »

Комментарии по теме "Пример ограничения числа одновременно открытых позиций"

Андрей, добрый вечер!

Частенько здесь нахожу много полезного и интересного по МТС(и не только), спасибо за просветительскую работу.Но вот комментарий к этой теме:
Всё классно описано, но вот вопрос - как бы сделать так, чтобы один советник(стоящей на одной паре и одном периоде) следил и открывал позиции (все отложенные и не одна -допустим) по другим парам на таком же периоде по той же логике, скажем в сумме 3,4... и т.д. в зависимости от кол. загруженных графиков ИЛИ,выдерживая общую сумму позиций по одной паре (если есть условие откр. только на ней).
Вооо, загнул, надеюсь, что понял. Или где-то что-то похожее я пропустил.
Будь добр, ответь, будет время.

С почтением, Александр.

Язык MQL4 (огромное спасибо разработчику) содержит достаточно средств, чтобы реализовать торговую тактику ЛЮБОЙ сложности. Но я бы не рекомендовал бы Вашему эксперту торговать по валютной паре, отличной от той, к которой он прикреплен. Т.к. эксперт будет срабатывать только по приходу новой котировки по этой валютной паре, и будет пропускать котировки по торгуемой валютной паре.

Подписаться на мою рассылку



Размещение статьи "Пример ограничения числа одновременно открытых позиций" на Вашем сайте

Размещение статьи "Пример ограничения числа одновременно открытых позиций" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "Пример ограничения числа одновременно открытых позиций" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 5.04