Функция OrderType возвращает 0, несмотря на то, что есть ордер на покупку или продажу - страница 2

 
Vitalii Ananev:

:)

И теперь подумаете есть ли у вас ордер с порядковым номером  OrdersTotal()-1

Крайне маловероятно)

Вообще советник делал не я. После того, как обнаружились баги я просто вынужден их исправлять. К сожалению они обнаружились после того, как работа была принята, так как советник в рабочих условиях тестировать долго.

А я типа начинающий программист))

Не подскажете как нам выбрать ордера на установленной валютной паре с нашим меджиком?

 
Ivan Ovchinnikov:

Крайне маловероятно)

Вообще советник делал не я. После того, как обнаружились баги я просто вынужден их исправлять. К сожалению они обнаружились после того, как работа была принята, так как советник в рабочих условиях тестировать долго.

А я типа начинающий программист))

Не подскажете как нам выбрать ордера на установленной валютной паре с нашим меджиком?

Где вы нашли такого исполнителя с такой квалификацией. :)

//+------------------------------------------------------------------+
int GetOrders(int &array[],int Magic, string Smb)
{ 
   int count = 0;
   for(int i=OrdersTotal()-1; i>=0; i--)         
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) 
      {     
         if (OrderMagicNumber()==Magic && OrderSymbol()==Smb())
         {
            if (OrderCloseTime()==0)
            {
               count++;
               ArrayResize(array,count);
               array[count-1]=OrderTicket();
            }
         }
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
int CountMarket(int &sell,int &buy)
{
   int OrderArray[];
   sell = 0;buy = 0;
   int count=GetOrders(OrderArray,Magic,Symbol());
   if (count<=0) return(0);
   for (int i=0; i<=count-1;i++)
   {  
      if (!OrderSelect(OrderArray[i], SELECT_BY_TICKET)) continue;
      if (OrderType()==OP_BUY) buy++;
      if (OrderType()==OP_SELL) sell++;
   }
   return(count);
}

GetOrders - помещает в переданный ему массив тикеты всех ордеров и позиций имеющих заданный Magic и открытые по заданному символу Smb.

CountMarket возвращает общее количество открытых всех позиций и так же кол-во позиций на продажу (sell) и покупку (buy)

void CloseAllOrder(uint Cmd)
{
   int OrderArray[];
   int count=GetOrders(OrderArray,Magic,Symbol());
   if (count<=0) return;
   for (int i=0;i<=count-1;i++)
   {
      if (!OrderSelect(OrderArray[i], SELECT_BY_TICKET, MODE_TRADES)) continue;
      if (OrderType()==(int)Cmd) 
      {
         double Pr = Ask;
         if (OrderType()==OP_BUY)  Pr=Bid;
         if (OrderType()==OP_SELL) Pr=Ask;
         if (OrderClose(OrderTicket(),OrderLots(),Pr,Slipage,clrNONE)) Print("Order closed ",OrderTicket());  
      }
   }
}

CloseAllOrder() закрывает все позиции заданного типа. Cmd - должно быть равным или OP_BUY или OP_SELL

Пример использования:

            int sell = 0; int buy = 0;
            int OrdCount = CountMarket(sell,buy);
            if (Условия закрытия продаж)
            {                              
               if (sell>0) CloseAllOrder(OP_SELL);             
               
            }
            if (условие закрытия покупок)
            {
               if (buy>0) CloseAllOrder(OP_BUY);              
            } 
 

мне нужно что нибудь попроще. Нужно модифицировать то что есть, не переделывая. В моем случае нужно просто что то сделать с условием.

Вот еще вопрос появился по OrderSelect()

"SELECT_BY_POS - в параметре index передается порядковый номер ордера в списке"

Получается что если индекс 1, то выберется тот ордер который открыт первым. А если 2, то это второй ордер.

Или тут с нуля начинается нуверация?

 
Ivan Ovchinnikov:

мне нужно что нибудь попроще. Нужно модифицировать то что есть, не переделывая. В моем случае нужно просто что то сделать с условием.

Вот еще вопрос появился по OrderSelect()

"SELECT_BY_POS - в параметре index передается порядковый номер ордера в списке"

Получается что если индекс 1, то выберется тот ордер который открыт первым. А если 2, то это второй ордер.

Или тут с нуля начинается нуверация?

Читайте документацию там все написано. Я вам больше ни чем помочь не могу, для модифицикации незнамо что и непонятно что да и еще что бы соблюдались условия "модифицировать не переделывая" надо обратится в клуб телепатов. Примеры как можно сделать я вам написал, если этого недостаточно посмотрите базу кодов.

 
Vitalii Ananev:

Читайте документацию там все написано. Я вам больше ни чем помочь не могу, для модифицикации незнамо что и непонятно что да и еще что бы соблюдались условия "модифицировать не переделывая" надо обратится в клуб телепатов. Примеры как можно сделать я вам написал, если этого недостаточно посмотрите базу кодов.

В общем то почитал документацию) как выяснилось все равно придется это прикручивать.Вот скажите пожалуйста, я не совем понял. Вы писали 

CountMarket возвращает общее количество открытых всех позиций и так же кол-во позиций на продажу (sell) и покупку (buy)

Как функция может вернуть несколько значений? Можно ли пример.

 
Ivan Ovchinnikov:

Как функция может вернуть несколько значений? Можно ли пример.

int nSellCnt = 0, nBuyCnt = 0;
int nOrdersCnt = CountMarket(nSellCnt, nBuyCnt);

После вызова функции CountMarket() в nOrdersCnt будет количество рыночных ордеров, в nSellCnt - ордеров Sell, в nBuyCnt - ордеров Buy.

 
Ivan Ovchinnikov:

В общем то почитал документацию) как выяснилось все равно придется это прикручивать.Вот скажите пожалуйста, я не совем понял. Вы писали 

CountMarket возвращает общее количество открытых всех позиций и так же кол-во позиций на продажу (sell) и покупку (buy)

Как функция может вернуть несколько значений? Можно ли пример.

Возможно я не совсем корректно написал. Само тело функции возвращает одно значение, это кол-во всего открытых позиций, а в параметрах функции будет уже кол-во позиций по их типу. Подробнее выше Игорь вам написал.

....

В функции параметры можно передавать двумя способами: по ссылке и по значению. https://www.mql5.com/ru/docs/basis/function/parameterpass

 

а как подставить сюда текущий символ, вместо Smb? ставлю _Symbol и ничерта не работает.

int GetOrders(int &array[],int Magic, string Smb)
 
Ivan Ovchinnikov:

а как подставить сюда текущий символ, вместо Smb? ставлю _Symbol и ничерта не работает.

void CloseAllOrder(uint Cmd)
{
   int OrderArray[];
   int count=GetOrders(OrderArray,Magic,Symbol());

Переменная Magic - это ваш магический номер.

 
Ivan Ovchinnikov:

а как подставить сюда текущий символ, вместо Smb? ставлю _Symbol и ничерта не работает.

В теле функции опечатка. Нужно так:

int GetOrders(int &array[],int Magic, string Smb)
{ 
   int count = 0;
   for(int i=OrdersTotal()-1; i>=0; i--)         
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) 
      {     
         if (OrderMagicNumber()==Magic && OrderSymbol()==Smb)
         {
            if (OrderCloseTime()==0)
            {
               count++;
               ArrayResize(array,count);
               array[count-1]=OrderTicket();
            }
         }
      }
   }
   return(count);
}

Использовать:

int arrnOrders[];
int nOrdersCnt = GetOrders(arrnOrders, 1234, Symbol());
Причина обращения: