Помогите написать код.

 

Помогите написать код для такой вот ситуации.

 
//+==================================== Замок ======================================+

for ( int y = OrdersTotal() - 1; y >= 0; y -- )                  
   {       
   if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES))                
      {           
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     
   { 
         if(OrderType() == OP_BUY)
{
            if (!ExistOrders("0", OP_SELLSTOP, Magic,0) &&   ( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 != PriceOpenLastPos("0", OP_SELL, Magic)))

{ 
            lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,3,PriceOpenLastPos("0", OP_BUY, Magic)-Point*150,Ask - 2000*Point,"Покупаем- хи-хи ",Magic,0,Magenta);
   if(ticket < 0) 
{
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0);
 }
 }
 }
if (ExistPositions("0", OP_BUY, Magic) == false)
{
if (OrderType() == OP_SELLSTOP) 
{ 
               OrderDelete(OrderTicket()); // закрываем позицию
              }   
 
}

//-----------------------------------------------------------------------------------
попробовал так, но чтото не получается((
 

везде с функциями отправки ордеров используй нормализацию double NormalizeDouble( double value, int digits);

=OrderSend(Symbol(),OP_SELLSTOP,lots,PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,3,PriceOpenLastPos("0", OP_BUY, Magic)-Point*150,Ask - 2000*Point,"Покупаем- хи-хи ",Magic,0,Magenta);

Должно быть

=OrderSend(Symbol(),OP_SELLSTOP,lots,  NormalizeDouble (PriceOpenLastPos("0", OP_BUY, Magic)-Point*200, Digits),3,NormalizeDouble (PriceOpenLastPos("0", OP_BUY, Magic)-Point*150, Digits),NormalizeDouble (Ask - 2000*Point, Digits),"Покупаем- хи-хи ",Magic,0,Magenta);

Тут в логическом сравнении:

if (!ExistOrders("0", OP_SELLSTOP, Magic,0) && ( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 != PriceOpenLastPos("0", OP_SELL, Magic)))

то же нужно использовать нормализацию иначе второе условие может всегда быть Истина.

if (!ExistOrders("0", OP_SELLSTOP, Magic,0) && (NormalizeDouble( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200, Digits) != NormalizeDouble( PriceOpenLastPos("0", OP_SELL, Magic), Digits)))
Я точно не знаю структуры функций ExistOrders и PriceOpenLastPos .

Но если это то

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}

То в выражении ExistOrders("0", OP_SELLSTOP, Magic,0) алгоритм пытается найти ордер СеллСтоп с магическим номером Маджик и символ инструмента "0"

Попробуй делать запрос

ExistOrders(NULL, OP_SELLSTOP, Magic,0)

sy - Накладывает ограничение на наименование инструмента. По умолчанию параметр равен "" - отсутствие ограничений, то есть любой инструмент. Если передать NULL, то отбор ордеров будет ограничен текущим инструментом.

Найдено здесь https://forum.mql4.com/ru/11287/page2

 

Логично заключить что в функции PriceOpenLastPos("0", OP_BUY, Magic)

нужно делать запрос

PriceOpenLastPos(NULL, OP_BUY, Magic)
 

Вроде все получилось. Код следующий:

//+==================================== Замок ======================================+

for ( int y = OrdersTotal() - 1; y >= 0; y -- )                  
   {       
   if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES))                
      {           
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     
   { 
         if(OrderType() == OP_BUY)
{
            if (!ExistOrders("0", OP_SELLSTOP, Magic,0) &&   ( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 != PriceOpenLastPos("0", OP_SELL, Magic))/* && (PriceOpenLastPos("0", OP_SELL, Magic)-Point*200 != PriceOpenLastClosePos("0", OP_sel, Magic))*/)

{ 
if (Close[2] > PriceOpenLastPos("0", OP_BUY, Magic)-Point*200)
{

            lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Magenta);
   if(ticket < 0) 
{
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0);
 }
 }
 }
 }
if (ExistPositions("0", OP_BUY, Magic) == false)
{
if (OrderType() == OP_SELLSTOP) 
{ 
               OrderDelete(OrderTicket()); // закрываем позицию
              }   

 
}
}     //if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
} //if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES))
}  //for ( int y = OrdersTotal() - 1; y >= 0; y -- ) 

for ( int h = OrdersTotal() - 1; h >= 0; h -- )                  
   {       
   if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))                
      {           
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     

         if(OrderType() == OP_SELL)
            {
            if(OrderOpenPrice()-Ask > Point*Lock)   
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,OrderTakeProfit(),0,Blue);              
            }
         }  // Symbol()  
      } // select
   } //total 

Но столкнулся со следующей проблемой:

Все работает прекрасно до тех пор пока появляется еще одна позиция на бай. И все условия сбиваются на новую позицию. Помогите решить.

 
rlx:

Логично заключить что в функции PriceOpenLastPos("0", OP_BUY, Magic)

нужно делать запрос

Это правильно:
ExistOrders("0", OP_SELLSTOP, Magic,0)

загляните внутри функции увидите:

if (sy=="0") sy=Symbol();
 
Чтобы позиции не зависели друг от друга, нужно чтобы у каждого БЛОКА (БАЙ, СЕЛЛСТОП, СЕЛЛ) был свой Магический номер. Например реализовать массив _MAGICS[] Но чтобы было меньше переборов различных массивов (этого и массива ордеров) нужно оптимизировать код...
 

в том то и дело что мне нужно чтоб эти замки зависели от баев на которых они ставятся. дело в том что у меня работает 2 советника: первый на Buy, а второй на Sell. И если сделать масив на магик, то они начнут путаться между советниками, как я понимаю. А может можно както реализовать через case?

А оптимизировать код, это как?

Как думаете, а сели использовать массив из учебника? https://book.mql4.com/ru/build/orders и использовать значение "Номер ордера" к примеру. только как это сделать не пойму.

 

Вот не пойму, допустим занеслись данные в массив по О№1 ну и потом еще №2,3 как мне доставать из массива значения нужной позиции, если в любой момент времени я не знаю где он находится.

Идея такова, я извлекаю из масива, тикет интересующей позиции О№1 и далее сопровождаю ее. Только вот как из этого массива извлекать интересующую меня позицию с ее данными?

 
Есть одна идея. Только она возможна, если есть возможность подправить советник, который выставляет ордера на Бай и Селл.
 
подправлять можно что угодно.
Причина обращения: