Вот сюда посмотрите.
Посмотрел и что-то кода не нашел...
Может я не там смотрел.
Кто знает, какой код написать, чтобы советник открывал только один ордер по одному символу?
У меня написан код
и открывает он только один ордер, а другие ордера не открывает, пока этот ордер не выключится.
Пробовал писать другие коды и открывает вообще куча ордеров.
Заранее Спасибо.
А что именно вы хотите? я предполагал что вы быстро там найдете всё, что вам нужно. В адресе, кот я выше указал есть функции на все случаи жизни. Ну почти...
Вам же для начала нужно предусмотреть в вашем коде магик-номер при открытии позиции.
После чего, берёте подходящую функцию, например
//+----------------------------------------------------------------------------+ //| Возвращает количество позиций. | //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) 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);
Располагаете её вне функции int start(). В глобальных переменных предусматриваете
extern int MagicNumber =112233;
В функцию OrderSend( также вставить MagicNumber . Т.е. функции открытия будут выглядеть примерно так:
ticket=OrderSend(Symbol(),1,lots,Bid,Slippage,Bid+SL_sell*Point, Bid-TP_sell*Point,"EXPERT",MagicNumber,0,CLR_NONE);
Далее вместо вашего
if (OrdersTotal()==0) {
вставляете данную функцию. К примеру, вот так -
if (NumberOfPositions(NULL,-1, MagicNumber )<1) { //если нет открытых позиций
И тогда ваш эксперт будет открывать только ОДНУ - "свою" позицию с магиком, кот. вы сами зададите в СВОЙСТВАХ
Надеюсь, понятно изложил...
Кто знает, какой код написать, чтобы советник открывал только один ордер по одному символу?
У меня написан код
и открывает он только один ордер, а другие ордера не открывает, пока этот ордер не выключится.
Пробовал писать другие коды и открывает вообще куча ордеров.
Заранее Спасибо.
//+------------------------------------------------------------------+ //| Работа функций эксперта | //+------------------------------------------------------------------+ int start() { //+------------------------------------------------------------------+ // Обьявляем переменные и присваиваем им значения total=OrdersTotal(); // Присваиваем total число открытых ордеров //+------------------------------------------------------------------+ //| Закрытие ордеров | //+------------------------------------------------------------------+ // Проверяем есть ли ордер? if (total>0) // Если есть ордера. { // Выполнение цикла, если есть один или более открытых ордеров и перебираем их. for(i=total; i>=0; i--) { // Проверяем среди открытых ордеров кроме отложенных, закрытых или удаленных if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { // Проверяем это орбер BUY if (OrderType()==OP_BUY && SignalBuyClose && AllowBuyClose) // можно тут вписать свое сравнение :) { // Закрываем ордер BUY OrderClose(OrderTicket(),OrderLots(),Bid,0,White); continue; } // Проверяем это орбер SELL if (OrderType()==OP_SELL && SignalSellClose && AllowSellClose) // можно тут вписать свое сравнение :) { // Закрываем ордер SELL OrderClose(OrderTicket(),OrderLots(),Ask,0,White); continue; } } } } //+------------------------------------------------------------------+ //| Открытие ордеров | //+------------------------------------------------------------------+ else // Если нет ордера. { //+------------------------------------------------------------------+ // Проверяем образован ли сигнал на покупку Buy if (SignalBuyOpen && AllowBuyOpen) { // Открываем ордер Buy ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-TrailingStop*Point,Ask+TakeProfit*Point,WindowExpertName(),order_id,0,Blue); // Проверяем принять ли ордер if(ticket>0) { // Ордер принят, печатаем его в журнале if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); // Ордер отклонен, печатаем причину в журнале } else Print("Error opening SELL order : ",GetLastError()); // Все удачно открыто ждем некоторое время и выходим return(0); } //+------------------------------------------------------------------+ // Проверяем образован ли сигнал на покупку Buy if (SignalSellOpen && AllowSellClose) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TrailingStop*Point,Ask-TakeProfit*Point,WindowExpertName(),order_id,0,Red); // Проверяем принять ли ордер if(ticket>0) { // Ордер принят, печатаем его в журнале if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); // Ордер отклонен, печатаем причину в журнале } else Print("Error opening SELL order : ",GetLastError()); // Все удачно открыто ждем некоторое время и выходим return(0); } //+------------------------------------------------------------------+ } } return(0); //+------------------------------------------------------------------+
Вот небольшой пример, тока для вашего случая нада вставить проверку на ордер символ, типа такого
if(OrderType()>OP_SELL || OrderSymbol()!=Symbol()) continue;
вобщем поработайте с опператором Symbol(), кстати он есть в русском мануале в MQL4 наммбираеш с троке любой Symbol(), затем становишся курсивом в середину слова и нажимаеш на клавиатуре кнопку "F1" - "справка" и будет тебе счастье с примерами
Кто знает, какой код написать, чтобы советник открывал только один ордер по одному символу?
У меня написан код
и открывает он только один ордер, а другие ордера не открывает, пока этот ордер не выключится.
Пробовал писать другие коды и открывает вообще куча ордеров.
Заранее Спасибо.
кстати то что ты делаеш могу разложить на пошаговую
if (OrdersTotal()==0)
ты делаеш прямую проверку без подстановки временных переменных это не есть хорошо..
лутчше бы написал примерно бы так
total=OrdersTotal(); // Присваиваем total число открытых ордеров if (total>0) // Прверяем есть ли у нас ордера (если есть то будет результат больше нуля) { // если есть ордера выполняем этот код } else // иначе { // выполняем этот код если нет ордеров }
тоесть теперь с переменной total() мы можем делать что хотим отнять, прибавить. вобщем все.. но с переменной OrdersTotal() ты такого не сможеш. прийдется всегда косвенно к ней относится.
также не забудь что есть магическое число.. каждому советнику даеш его и пусть себе шарахает ордера.. он их из всех определит что его а что нет..
С вашим вариантом, Nadejnie, эксперт не будет работать, если в терминале мт4 будут присутствовать другие открытые позиции. Открытые вручную, либо другим экспертом.
Поэтому, я думаю, лучше всё таки задействовать отбор по MagicNumber, А не по total=OrdersTotal();
Тогда и символ можно лишний раз не проверять...
Это советник по системе ДиНаполи и уже со вторым способом.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Кто знает, какой код написать, чтобы советник открывал по одному ордеру на каждую пару?
У меня написан код
и открывает он только один ордер, а другие ордера на другие пары не открывает, пока этот ордер не выключится.
Пробовал писать другие коды и открывает вообще куча ордеров.
Сам советник прикреплен.
Заранее Спасибо.