и раз уж пошла такая пьянка... как проверить есть ли открытая позиция для каждой валютной пары в отдельности
пора уж на мультивалютные советники переходить )
По всей видимости Вы перепутали OrdersTotal с функцией PositionsTotal().
Чтобы определить, какие позиции открыты, надо использовать PositionsXXX функции.
- www.mql5.com
запарился... не могу заставить его работать...
открывает сделки в тестере пока не закончится депо...
можно конечно обойти этот момент...
но в новом советнике... обязательно нужно проверять наличие открытой позиции...
проверка OrdersTotal()==0 ничего не дает... сделки открываются вновь и вновь
Я например использую такой вариант чтобы узнать открыта позиция по symbol
bool ActivePos(string symbol)
{
PositionSelect(symbol);
if(PositionGetDouble(POSITION_VOLUME)>0) return(true);
return(false);
}
В одно-валютном эксперте можно по-проще: используя if(PositionsTotal()>0) ...
Я например использую такой вариант чтобы узнать открыта позиция по symbol
вот так лучше вроде будет
//+----------------------------------------------------------------------------+ //| есть ли открытая позиция ? | //| Параметры: | //| sy - наименование инструмента | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ bool WhetherIsPosition(string sy="", ENUM_POSITION_TYPE op=-1, int mn=-1) { bool rez=false; // результат запроса if(PositionSelect(sy,100)==true) // есть открытая позиция { if(PositionGetInteger(POSITION_TYPE) == op || op== -1) // проверка типа { if (PositionGetInteger(POSITION_MAGIC) == mn || mn==-1) rez=true; // проверка магика else rez=false; } } return(rez); }
Параметр sy зря в автозаполнение поставили - при нем результат будет заведомо отрицательный.
Вообще код лучше вот так переделать - быстрее работать будет:
//+----------------------------------------------------------------------------+ //| есть ли открытая позиция ? | //| Параметры: | //| sy - наименование инструмента | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ bool WhetherIsPosition(string sy, ENUM_POSITION_TYPE op=-1, int mn=-1) { bool rez=false; // результат запроса if(PositionSelect(sy,100)) // есть открытая позиция { if(op== -1 || PositionGetInteger(POSITION_TYPE) == op) // проверка типа { if(mn== -1 || PositionGetInteger(POSITION_MAGIC) == mn) // проверка магика rez=true; } } return(rez); }
Параметр sy зря в автозаполнение поставили - при нем результат будет заведомо отрицательный.
Вообще код лучше вот так переделать - быстрее работать будет:
По поводу быстрее, у меня однажды была ситуации. Попробую её описать.
Это торговый блок.
Lots=0.1; if(WhetherIsPosition(sy,POSITION_TYPE_BUY,Magic)) Lots*=2; if(!WhetherIsPosition(sy,POSITION_TYPE_SELL,Magic)) { OpenPosition(sy,ORDER_TYPE_SELL,Lots,sl,tp,Magic); }
т.е. если есть открытая позиция бай, я удваиваю лот и переворачиваюсь в селл (для бай логика наоборот). если есть уже открытая позиция то я ничего не делаю. По идее в рынке должна быть позиция только 0.1 лота.
но однажды у меня появился лот 0.2 (просто висел на демо счете советник, не в тестере). я долго анализировал и пришол к выводу, что сервер принял команду, но её еще не успел выполнить польностью, как пришол новый тик, и раз открытых позиций нет пошла команда открыть позицию, и эти приказы выполнились последовательно.
на чемпионате это дисквалификация
поэтому я решил сделать задержку, но до сих пор все равно не уверен, что исключил эту ситуацию
if(PositionSelect(sy,100)==true) // есть открытая позицияЗ.Ы. спасибо за замечания и правку кода
поэтому я решил сделать задержку, но до сих пор все равно не уверен, что исключил эту ситуацию
Вы неправильно поняли таймаут в параметре функции PositionSelect. Там не задержка, а именно таймаут ожидания разблокировки/обновления торговой базы.
Лучше всего после совершения сделки явным образом сохранять время последней операции и следующие N секунд ничего не предпринимать.
- www.mql5.com
Вы неправильно поняли таймаут в параметре функции PositionSelect. Там не задержка, а именно таймаут ожидания разблокировки/обновления торговой базы.
Лучше всего после совершения сделки явным образом сохранять время последней операции и следующие N секунд ничего не предпринимать.
очень непонятно тогда справка написана, прочитав её, считал, что я задерживаю все опрерации на 100 милисекунд, т.е. жду это время и пытаюсь выбрать позицию, не появилась позиция в течении этого времени, значит её нет.
а тут оказывается нужно ждать секунды и делать подругому, нет проблем возможно так и лучше.
Какие будут рекомендации по величине N (N секунд ничего не предпринимать) ?
Какие будут рекомендации по величине N (N секунд ничего не предпринимать) ?
В "Руководстве пользователя " клиентским терминалом написано про трэйлинг-стоп:
|
- www.mql5.com
очень непонятно тогда справка написана, прочитав её, считал, что я задерживаю все опрерации на 100 милисекунд, т.е. жду это время и пытаюсь выбрать позицию, не появилась позиция в течении этого времени, значит её нет.
а тут оказывается нужно ждать секунды и делать подругому, нет проблем возможно так и лучше.
Какие будут рекомендации по величине N (N секунд ничего не предпринимать) ?
Думаю что это можно отследить через OnTrade().
Четыре её вызова соответствуют
выставлению ордера,
обработке ордера(проверке на правильность),
изменению позиции(совершение сделки),
появлению информации о сделке в истории.
Хотя чесно говоря я сам пока на практике её работу не проверил,
может быть тогда когда я занимался этим вопросом были активные перестройки в этой сфере,
но убедиться что всё работает как в описании я не смог.
Опятьже для меня остался непонятным момент что произойдёт если выставленны одновременно несколько ордеров,
как будет это отрабатываться в OnTrade()?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
запарился... не могу заставить его работать...
открывает сделки в тестере пока не закончится депо...
можно конечно обойти этот момент...
но в новом советнике... обязательно нужно проверять наличие открытой позиции...
проверка OrdersTotal()==0 ничего не дает... сделки открываются вновь и вновь