В ваш код я не вникал. Так, навскидку глянул. Возможно, вам поможет
https://www.mql5.com/ru/forum/107476/page20
Функция GetTypeLastClosePos().
Эта функция возвращает тип последней закрытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:
- sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
- mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает тип последней закрытой позиции или -1 | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int GetTypeLastClosePos(string sy="", int mn=-1) { datetime t; int i, k=OrdersHistoryTotal(), r=-1;f (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (t<OrderCloseTime()) { t=OrderCloseTime(); r=OrderType(); }}}}} return(r); }Вставляете эту функцию в советник.
А потом в условия открытия позиций вставляете дополнительное условие.
Например, для открытия позиции селл :
//------------------------------------------------------------------------------
// открываем позицию селл только тогда,
//если последняя закрытая советником позиция была бай-сделкой -
if ( GetTypeLastClosePos(NULL, magic) ==-1 || GetTypeLastClosePos(NULL, magic) ==OP_BUY )
{
//-----------------------
Не забудьте предусмотреть (добавить) magic в функции Ордерсенд открытия позиций. Иначе в онлайне советник может "заклинить".
Программист составляет алгоритм перед тем как набирать программный код. Если Вы не видите, чтоб программист составил алгоритм, это ещё не значит, что алгоритма у него нет. В простых случаях у программиста алгоритм лежит в голове, а не на бумаге. Кодить без алгоритма - значит не представлять себе как должна работать программа. Это всё равно что пытаться соорудить машуну "чтоб ездила" и при этом не представлять себе как она должна работать.
1. Проверяем наличие сигнала к открытию Бай-ордера. Если сигнал есть, то перейти к шагу 30.
20. Проверяем наличие сигнала к открытию Селл-ордера. Если сигнал есть, то перейти к шагу 50.
30. Проверяем сегодняшние Бай-ордера нашего советника. Если рыночные Бай-ордера есть, или время закрытия последнего Бай-ордера больше или равно времени открытия нулевой свечи, то обнуляем сигнал открытия бай-ордера. В противном случае перейти к шагу № 40.
40. Открыть Бай-ордер.
50. Проверяем сегодняшние Селл-ордера нашего советника. Если рыночные Селл-ордероа есть или время закрытия последнего ордера больше или равно времени открытия нулевой свечи, то обнуляем сигнал открытия Селл-ордера. В противном случае перейти к шагу № 60.
60. Открыть Селл-ордер.
Можно ещё добавить, что на начальном этапе создание программы - это медитация, в которой программист сидит и перед своим внутренним взором созерцает процессы, которые должна выполнять программа, как она их выполняет, какие результаты получаются.
Любая программа состоит из трёх частей: даные, поступающие на вход программы, обработка этих данных и данные, которые выдаёт программа в результате этой обработки.
Простое решение. Позиции открываются только, если количество уже открытых одноименных позиций меньше, чем MaxPosNumber, задаваемое пользователем.
extern int MaxPosNumber=1;//максимальное количество открытых позиций одного направления //-----------старт if(NumberOfPositions(Symbol(), OP_BUY, Magic)< MaxPosNumber) {разрешено открытие buy }; if(NumberOfPositions(Symbol(), OP_SELL, Magic)< MaxPosNumber) {разрешено открытие sell}; //-----------используемые пользовательские функции //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) kp++; } } } } } return(kp);
Простое решение. Позиции открываются только, если количество уже открытых одноименных позиций меньше, чем MaxPosNumber, задаваемое пользователем.
спасибо за ответ .Но в строчке
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
выдаёт ошибку '(' - function definition unexpected
после int NumberOfPositions (
как можно исправить? заранее спасибо.
спасибо за ответ .Но в строчке
выдаёт ошибку '(' - function definition unexpected
после int NumberOfPositions (
как можно исправить? заранее спасибо.
Исправлять ничего не надо. Код, который находится в моем посте после строки: "//-----------используемые пользовательские функции", это тело функции, которое должно быть расположено вне функции start, например, в самом конце эксперта. Видимо, Вы ее поместили внутри.
MQL-Код:
int Tral( int Ticket)
{double TralPrice,Punkt;
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES );
if (OrderType()==0){PunktBid-OrderOpenPrice())/Point;TralPrice=NormalizeDouble((Bid-TS*D*Point),Digits);}
if (OrderType()==1){PunktOrderOpenPrice()-Ask)/Point;TralPrice=NormalizeDouble((Ask+TS*D*Point),D igits);}
if (Punkt<MarketInfo(Symbol(),MODE_STOPLEVEL))return( 0);
if (Punkt<TS*D)return(0);
if (OrderType()==0 && TralPrice<=NormalizeDouble(OrderStopLoss(),Digits) ) return(0);
if (OrderType()==1 && TralPrice>=NormalizeDouble(OrderStopLoss(),Digits) && OrderStopLoss()!=0)return(0);
ModifyOrder(OrderTicket(),OrderOpenPrice(),TralPri ce,OrderTakeProfit());
return(0);
}
... как подстроить так, что бы всё время тралился только первый открытый (с тикетом "0")из сетки ордеров Sell или Buy ... ... заранее благодарю за подсказку.
Всем день добрый ... вот код обычного Трейлинг стопа ...
MQL-Код:
int Tral( int Ticket)
{double TralPrice,Punkt;
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES );
if (OrderType()==0){PunktBid-OrderOpenPrice())/Point;TralPrice=NormalizeDouble((Bid-TS*D*Point),Digits);}
if (OrderType()==1){PunktOrderOpenPrice()-Ask)/Point;TralPrice=NormalizeDouble((Ask+TS*D*Point),D igits);}
if (Punkt<MarketInfo(Symbol(),MODE_STOPLEVEL))return( 0);
if (Punkt<TS*D)return(0);
if (OrderType()==0 && TralPrice<=NormalizeDouble(OrderStopLoss(),Digits) ) return(0);
if (OrderType()==1 && TralPrice>=NormalizeDouble(OrderStopLoss(),Digits) && OrderStopLoss()!=0)return(0);
ModifyOrder(OrderTicket(),OrderOpenPrice(),TralPri ce,OrderTakeProfit());
return(0);
}
... как подстроить так, что бы всё время тралился только первый открытый (с тикетом "0")из сетки ордеров Sell или Buy ... ... заранее благодарю за подсказку.
Тикет ноль не бывает.
Рекомендую первый ордер в сетке открыть с каким либо комментарием, по которому и находим нужный ордер и начинаем делать с ним всё что угодно
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В учебнике по програмированию нашёл советника..переправил на свой индикатор ..всёбы хорошо...Но появилась проблемма,после закрытия сделки автоматом открывает ещё одну в том же направлении и так далее пока не появляеться противоположное условие от индикатора . (индикатор трендовый, соответственно открытие позиции бай и селл чередуются бай закрывает селл и наоборот) Требуется разорвать цикл открытия сделок после закрытия первой сделки(открылся бай ....закрылся по стопу или профиту.....ждём условие для селл ...открылся закрылся по стопу или профиту...ждём условия на бай) а так получаеться открылся ордер....закрылся по стопу или профиту опять открылся....и т.д
выкладываю код если кто может чтото подсказать помогите..Заранее благодарен.