Kaur
Руслан Каюмов

 
Уровень 47

  Торгую в компаниях:

  Моя торговля


График торгового счета Kaur


Группа "Программирование на MQL"

Рейтинг 280



Приемы MQL: открытие только одной сделки за один бар

По мере изучения MQL и перевода своих стратегий на код сталкиваюсь с некоторыми типовыми задачами, решение которых планирую выкладывать в данной группе.

Итак, первое, с чем я столкнулся — это необходимость открытия только одной сделки в текущем баре. Т.е. получили сигнал в текущем баре и после открытия сделки больше в этом баре новых сделок не открываем.

Есть разные способы решения задачи. От использования предопределенной переменной Bars в данном случае предостерегают, т.к. Bars может изменяться, например, при докачке истории.

Выбрал следующий способ.

1.Добавляем функцию IfOrderYetOpen

//+------------------------------------------------------------------+
//|  Проверяет был ли открыт уже ордер на этой же свече        |
//+------------------------------------------------------------------+
bool IfOrderYetOpen(int magic = 0, int typ = -1,string symb = "",int per = 0){
   if(symb == ""){symb = Symbol();}
   if(per==0){per=Period();}
   for(int i = OrdersTotal(); i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()!=symb){continue;}
         if(OrderType()==typ||typ==-1){
            if(OrderMagicNumber()==magic||magic==0){
               if(OrderOpenTime()>iTime(symb,per,0)){return(true);}
            }
         }
      }
   }
   return(false);
   }


2. Затем в начале start делаем проверку

if(IfOrderYetOpen()) return;

Таким образом добиваемся поставленной цели — если ордер на текущем баре открыт, то терминируем start.
  • +3
  • Просмотров: 36368
  • 6 января 2012, 12:09
  • Kaur
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
По просьбе wizzard... Инфосоветник. (Часть 2)
14 ноября 2011
02 мая 2012

Комментарии (20)

+
+1
...Good!!!..
avatar

  15  kick Сообщений: 853

  • 6 января 2012, 12:21
+
+1
...Nice!!!...
avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 6 января 2012, 15:31
+
0
Of course it is good and nice!!!
avatar

  1  uskov34 Сообщений: 7

  • 7 января 2012, 16:06
+
+1
Начал использовать на практике, ничего не получилось. так же открывает ордера как обычно по 3 или 4…
Входные параметры моего эксперта были такими:
extern double Lots       = 0.1;
extern double TakeProfit = 5;
extern double StopLoss   = 20;
extern int    Magic      = 0;

вот такое выдает в тестере:

avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 12 января 2012, 14:55
+
0
Проверю, как предоставится возможность.
avatar

  47  Kaur Автор Сообщений: 1327 - Руслан Каюмов

  • 12 января 2012, 15:09
+
0
Теми же барами, которыми вы не советовали пользоваться, решил проблему…
...
//---- Глобальные переменные
datetime ВремяПоследнегоОрдера;
...
      if(Сигнал == OP_BUY && Time[0] != ВремяПоследнегоОрдера)
      {
         Open_Buy();
         ВремяПоследнегоОрдера = Time[0];
      }
      if(Сигнал == OP_SELL && Time[0] != ВремяПоследнегоОрдера)
      {
         Open_Sell();
         ВремяПоследнегоОрдера = Time[0];
      }
...

avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 12 января 2012, 16:00
+
0
Заметьте в качестве имени переменных в языке MQL4 можно использовать русские буквы.
Так переменные:
int Lots = 0.1;
int Лоты = 0.1;

абсолютно равнозначные *улыбается*
Зато вспоминать какая переменная к чему относится гораздо легче
avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 12 января 2012, 16:03
+
0
кто сможет помочь? нужно прописать код который позволит срабатывать советнику 1 раз за 1 бар
avatar

  1  vahe777 Сообщений: 2 - Ваэ

  • 9 апреля 2013, 17:21
+
0
А вариант от Амыра выше пробовали уже?
avatar

  11  pilot Сообщений: 410

  • 9 апреля 2013, 17:29
+
0
а какой код, самый первый наверху?
avatar

  1  vahe777 Сообщений: 2 - Ваэ

  • 9 апреля 2013, 19:14
+
0
Подскажите, пожалуйста, как сделать, чтобы советник открывал одну сделку в день? Вышел сигнал — открыл сделку. Сигнал отработал по стопу/тейку. Вышел следующий сигнал в этот же день — всё, советник сегодня больше не торгует.
avatar

  1  Forex-Viewer Сообщений: 1

  • 18 августа 2018, 10:43
+
0
сделать флаг дату — день сделки
avatar

  17  vis Сообщений: 193 - ♫♪♫♪

  • 24 января 2019, 14:27
+
0
А он чужие ордера будет учитывать? Я имею ввиду, что если поставил два советника с этой функцией, но разными магиками.
avatar

  19  alex30774 Сообщений: 700

  • 24 января 2019, 12:12
+
0
if(IfOrderYetOpen(magic)) return; // magic указываешь у текущего советника. по умолчанию он все ордера учитывает
avatar

  17  vis Сообщений: 193 - ♫♪♫♪

  • 24 января 2019, 14:29
+
0
Меня как раз вариант по умолчанию устраивает.Спасибо.
Редактирован: 25 января 2019, 11:53
avatar

  19  alex30774 Сообщений: 700

  • 25 января 2019, 11:51
+
0
А как сделать так, чтоб не текущую свечу, а предыдущую свечу учитывал?
avatar

  19  alex30774 Сообщений: 700

  • 29 января 2019, 11:33
+
0
iTime(symb,per,-1)
avatar

  17  vis Сообщений: 193 - ♫♪♫♪

  • 29 января 2019, 11:59
+
0
Спасибо, в очередной раз выручили.
avatar

  19  alex30774 Сообщений: 700

  • 29 января 2019, 12:26
+
+2
Вот решение получше.
Было. Теперь нет.
Редактирован: 3 октября 2019, 19:49
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 1 октября 2019, 15:55
+
+1
А как создать сову в которой будет открываться сделка, только одна по одному сигналу? Тем самым переСЕЧесение МА открывается только одна сделка и в случае ее закрытия сова ждет следующего сигнала!
avatar

  1  Sel7 Сообщений: 3

  • 9 июля 2020, 00:13

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари