Пример ограничения числа одновременно открытых позиций
В прошлом выпуске я описал функции 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".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4:
Комментарии по теме "Пример ограничения числа одновременно открытых позиций"
Андрей, добрый вечер!
Частенько здесь нахожу много полезного и интересного по МТС(и не только), спасибо за просветительскую работу.Но вот комментарий к этой теме:
Всё классно описано, но вот вопрос - как бы сделать так, чтобы один советник(стоящей на одной паре и одном периоде) следил и открывал позиции (все отложенные и не одна -допустим) по другим парам на таком же периоде по той же логике, скажем в сумме 3,4... и т.д. в зависимости от кол. загруженных графиков ИЛИ,выдерживая общую сумму позиций по одной паре (если есть условие откр. только на ней).
Вооо, загнул, надеюсь, что понял. Или где-то что-то похожее я пропустил.
Будь добр, ответь, будет время.
С почтением, Александр.
Автор: Александр | 09.01.2007 21:18
Язык MQL4 (огромное спасибо разработчику) содержит достаточно средств, чтобы реализовать торговую тактику ЛЮБОЙ сложности. Но я бы не рекомендовал бы Вашему эксперту торговать по валютной паре, отличной от той, к которой он прикреплен. Т.к. эксперт будет срабатывать только по приходу новой котировки по этой валютной паре, и будет пропускать котировки по торгуемой валютной паре.
Автор: Андрей Ведихин | 11.01.2007 16:22