Приемы MQL: открытие только одной сделки за один бар
Аватар Kaur
Kaur
Сообщений: 298
Уровень 6

По мере изучения 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
  • Просмотров: 603
  • 6 января 2012, 12:09
  • Kaur
Присоеднитесь к группе "Программирование на MQL", чтобы
оперативно получать уведомления о появлении новых материалов -

ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться

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

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

[ 7 ] kickЗарегистрирован: 23 февраля 2011 | Сообщений: 625

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

[ 5 ] amyrgan145Зарегистрирован: 22 февраля 2011 | Сообщений: 358 - Амыр

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

[ 1 ] uskov34Зарегистрирован: 19 ноября 2010 | Сообщений: 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

[ 5 ] amyrgan145Зарегистрирован: 22 февраля 2011 | Сообщений: 358 - Амыр

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

[ 6 ] KaurЗарегистрирован: 28 сентября 2009 | Сообщений: 298 - Руслан Каюмов

  • 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

[ 5 ] amyrgan145Зарегистрирован: 22 февраля 2011 | Сообщений: 358 - Амыр

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

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

[ 5 ] amyrgan145Зарегистрирован: 22 февраля 2011 | Сообщений: 358 - Амыр

  • 12 января 2012, 16:03

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Лидер рынка услуг форекс - открыть счет