Скачать MetaTrader 5

Повторный вызов OrderSend в случае неудачи

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен OpenCL? MQL5 предоставляет такую возможность!
Konstantin Zubrilin
2397
Konstantin Zubrilin 2015.03.27 01:20 

Добрый день, такая ситуация: советник при старте должен открывать несколько позиций в одном направлении и завершать свою работу. Пишу его таким образом:

//--- input parameters
input int      profit=25;           //Через столько пунктов ставим тейк профит
input bool     BUY_or_sale=false;   //Ордера на BUY или на SELL
input int      number=7;            //Сколько штук открывать
input double   lotvolume=0.01;      //Объем каждого ордера


bool     work=true;                 //Почему-то событие OnInit() происходит многократно если оставить советник включенным долгое время, поэтому ставим это условие

int  result=0;                      //Результат исполнения OrderSend
int  i=0;                           //Для цикла


//-------\/--инициализация советника--\/--------
int OnInit()                       
  {
   if (work==true){
   //---------------------------------------------------------
      for (int j=0; j<number; j++)
         {
           SendOrder();             //Вызываем функцию столько раз сколько нужно открыть ордеров
         }
   //---------------------------------------------------------
      work=false;
      }
   return(INIT_SUCCEEDED);
  }
//-------/\--инициализация советника--/\-------- 

   


//-------\/--функция открытия одного ордера--\/--------

uint SendOrder()

  {

    result=0;  //---обнуляем результат функции OrderSend


   //---открываем ордер на BUY или на SELL
   if (BUY_or_sale==true) {
      result=OrderSend(Symbol(),OP_BUY,lotvolume,Ask,100,0,Bid+profit*0.0001);
   }else{
      result=OrderSend(Symbol(),OP_SELL,lotvolume,Bid,100,0,Ask-profit*0.0001);
   }

   Print(result);


   //---Если вдруг ордер не открыт, вытаемся его открыть снова аж 10 раз!

   if (result==-1) {
   Print("НЕ ОТКРЫТ С ПЕРВОГО РАЗА!!");
      for(i=1; i<=10; i++)           // Пытаемся открыть ордер аж 10 раз с интервалом в секунду
      {
         Sleep(1000);
            if (BUY_or_sale==true) {
              result=OrderSend(Symbol(),OP_BUY,lotvolume,Ask,100,0,Bid+profit*0.0001);
            }else{
              result=OrderSend(Symbol(),OP_SELL,lotvolume,Bid,100,0,Ask-profit*0.0001);
            }
         Print("Попытка открыть №",i,"  result=",result);
         if (result!=-1) {break;}    // Если всё-таки открылся, выходим из цикла
        
      }  

   }

}

//-------/\--функция открытия одного ордера--/\--------


Да, на всякий случай указал Slippage аж 100, чтоб открывал позицию при огромном изменении цены.

А ннет! Если ордер не открылся с первого раза, то очень редко открывается с последующих разов, хотя вручную открыть его можно. Не пойму почему.

Как заставить эксперт насильно открывать заданное количество ордеров???

Andrey Khatimlianskii
56195
Andrey Khatimlianskii 2015.03.27 01:58  

Во-первых, нужен RefreshRates() перед каждой попыткой и нормализация ТП. Во-вторых, нужно анализировать возникшие ошибки.

А в-третьих, так решать задачу нельзя. Советник должен анализировать кол-во уже открытых позиций и останавливаться, когда их станет достаточно.

Выполнять это все из OnInit тоже неправильно - он может быть вызван в выходные или в не торговое время. 

Konstantin Zubrilin
2397
Konstantin Zubrilin 2015.03.27 04:26  
RefreshRates() - Всё гениальное - просто! Спасибо большое))))
Ihor Herasko
9060
Ihor Herasko 2015.03.27 10:31  
komposter:

Во-первых, нужен RefreshRates() перед каждой попыткой и нормализация ТП. Во-вторых, нужно анализировать возникшие ошибки.

А в-третьих, так решать задачу нельзя. Советник должен анализировать кол-во уже открытых позиций и останавливаться, когда их станет достаточно.

Выполнять это все из OnInit тоже неправильно - он может быть вызван в выходные или в не торговое время. 

Придется Вам, Андрей, повторять второе и третье, а то топикстартер прочитал только "во-первых" )))
Konstantin Zubrilin
2397
Konstantin Zubrilin 2015.03.27 12:39  
Scriptong:
Придется Вам, Андрей, повторять второе и третье, а то топикстартер прочитал только "во-первых" )))
Т.к. "во-первых" полностью удовлетворило мои потребности.
Andrey Khatimlianskii
56195
Andrey Khatimlianskii 2015.03.27 12:52  
Scriptong:
Придется Вам, Андрей, повторять второе и третье, а то топикстартер прочитал только "во-первых" )))

Даже не знаю, что на меня нашло )

 

knastnt:
Т.к. "во-первых" полностью удовлетворило мои потребности.

Тогда до следующих встреч на форуме ) 

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