Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1337

 
sibiriyak73:

Где ошибка закралась?

Раз много символов, значит и много "опенов"

struct Orders
   {
   string symbol;
   bool open;
   } orders[];

int OnInit()
   {
   ArrayResize(orders,2);
   orders[0].symbol="EURUSD";
   orders[0].open=false;
   orders[1].symbol="USDJPY";
   orders[1].open=false;
   return(INIT_SUCCEEDED);
   }

void OnTick()
   {
   for(int i=0; i<2; i++)
      {
      if(!orders[i].open)
         {
         int ticket1=OrderSend(orders[i].symbol,OP_SELLSTOP,1.5,limit1,10,SL1,TP1,NULL,0,0,clrRed);  //Здесь открываем
         orders[i].open=true;
         }
      }
........


 
Aleksei Stepanenko:

Раз много символов, значит и много "опенов"

Спасибо дружище. Как сделать так чтоб он одну сделку в день отрывал  на текущем инструменте а остальные инструменты не учитывал (советник стоит на нескольких инструментах)
 
sibiriyak73:
Спасибо дружище. Как сделать так чтоб он одну сделку в день отрывал  на текущем инструменте а остальные инструменты не учитывал (советник стоит на нескольких инструментах)

- посмотреть в историю ордеров по своему магику и символу, если время открытия (или закрытия?) ордера соответствует текущей дате, то выходим из OnTick()

- контролировать "новый бар" на ТФ Д1


первый способ - писанины больше, но в тестере МТ4 будет работать очень шустро, второй способ - кода 3 строки, но в тестере будет "жевать" жесткий диск и время тестирования будет больше

 
sibiriyak73:
 (советник стоит на нескольких инструментах)

А, я кажется понял, если у Вас советник стоит на нескольких инструментах, значит Вам просто нужно добавить проверку на принадлежность ордера советнику.

int OPEN=1;

int total=OrdersTotal();
for(int i=0; i<total; i++)
   {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderCloseTime()==0 && OrderSymbol()==Symbol())
      {
      OPEN=0;
      break;
      }
   }

if(OPEN==1)
   {
   int ticket1=OrderSend(Symbol(),OP_SELLSTOP,1.5,limit1,10,SL1,TP1,NULL,0,0,clrRed);  //Здесь открываем
   }
 
Aleksei Stepanenko:

А, я кажется понял, если у Вас советник стоит на нескольких инструментах, значит Вам просто нужно добавить проверку на принадлежность ордера советнику.По этому

По этому коду открывает огромное количество сделок. Идея правильная но как ее реализовать корректно.

 
sibiriyak73:

По этому коду открывает огромное количество сделок. Идея правильная но как ее реализовать корректно.

Вам нужно это

Функция isTradeToDay().

Эта функция возвращает флаг торгов сегодня

Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Что здесь можно угадать по куску кода, что там у Вас?

Поставьте проверку, не чаще одного раза в день.

datetime last_time=0;   
MqlDateTime date1, date2; 

void OnTick()
   {
   int OPEN=1;

   int total=OrdersTotal();
   for(int i=0; i<total; i++)
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderCloseTime()==0 && OrderSymbol()==Symbol())
         {
         OPEN=0;
         break;
         }
      }
      
   TimeToStruct(last_time,date1);
   TimeToStruct(iTime(Symbol(),0,0),date2);
   if(date1.day==date2.day)
      {
      OPEN=0;
      }

   if(OPEN==1)
      {

      int ticket1=OrderSend(Symbol(),OP_SELLSTOP,1.5,limit1,10,SL1,TP1,NULL,0,0,clrRed);  //Здесь открываем
      if(ticket1>=0 && OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
         {
         last_time=OrderOpenTime();
         }
      }

 
sibiriyak73:

Ребята помогите в советнике нужно чтобы открывалась одна сделка в день НА ИНСТРУМЕНТЕ.

Можно так попробовать

datetime dt = iTime(_Symbol,PERIOD_D1,0);

   for(int i = 0; i < OrdersHistoryTotal(); i++) 
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
       if((OrderSymbol() != _Symbol) && (dt < OrderCloseTime())
        {
         Открываем ордер;
        }
      }
    }
 
MakarFX:

Можно так попробовать

Всё давно написано ... очень давно.

Этот код проверяет что уже есть в рынке, и что есть в истории на случай уже закрытой сегодня.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  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) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Aleksei Stepanenko:

Что здесь можно угадать по куску кода, что там у Вас?

Поставьте проверку, не чаще одного раза в день.

Приветствую. Проблема в том что если советник видит открытую сделку на счете то он сделок больше не открывает. Ну вроде того "У тебя же есть открытые сделки на счете чо ты от меня хочешь". Мне требуется объяснить ему что должна быть открыта не более чем одна сделка ИМЕННО НА ЭТОМ ИНСТРУМЕНТЕ  (EUR USD например) так как этот советник стоит на нескольких инструментах. Выкладывать весь код (он большой с объявленными переменными и т д) я думаю некорректно будет.
Причина обращения: