Как одолеть OrdersTotal();

 
Ниже стандартная процедура открытия позиции, но она будет срабатывать только когда ни одной позиции не открыто, а как заставить её срабатывать для каждого инструмента в отдельности.
Т.е. чтобы OrdersTotal() касалось только того инструмента к которому привязан советник.


total=OrdersTotal();
if(total<1)
{

// нет ни одного открытого ордера
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// проверяем на возможность встать в длинную позицию (BUY)


if(Ask<=Support)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stoploss*Point,Ask+TakeProfit*Point,
"Sergey",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}

return(0);
}
 
Спасибо за вопрос, только хотел задать такой же. Будем вместе надеяться на скорый ответ знатоков! :-))
 
//================================================================================================ Анализ ордеров ====
   for (i=1; i<=OrdersTotal(); i++)                                            // По всем ордерам терминала
      {
      if((OrderSelect(i-1, SELECT_BY_POS)==true) && (OrderSymbol()==Symbol())) // Если есть следующий и наша вал.пара
         {                                                                     
         Kol++;
         Mas_Ord_Tek[0][0]   = Kol;
//--------------------------------------------------------------------------- Формирование нового массива ордеров ----
         Mas_Ord_Tek[Kol][1] = OrderOpenPrice() ;                   
         Mas_Ord_Tek[Kol][2] = OrderStopLoss()  ;   
         Mas_Ord_Tek[Kol][3] = OrderTakeProfit(); 
         Mas_Ord_Tek[Kol][4] = OrderTicket()    ;
         Mas_Ord_Tek[Kol][5] = OrderLots()      ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         Tip_Ord             = OrderType();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - -
         if ( Tip_Ord == OP_BUY )
            {
            Kol_B++;
            Mas_Ord_Tek[Kol][6]=1;
            }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 - -
         if ( Tip_Ord == OP_SELL )
            {
            Kol_S++;
            Mas_Ord_Tek[Kol][6]=2;
            }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3 - -
         if ( Tip_Ord == OP_BUYLIMIT )
            {
            Kol_BL++;
            Mas_Ord_Tek[Kol][6]=3;
            }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4 - -
          if ( Tip_Ord == OP_SELLLIMIT )
            {
            Kol_SL++;
            Mas_Ord_Tek[Kol][6]=4;
            }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - -
          if ( Tip_Ord == OP_BUYSTOP )
            {
            Kol_BS++;
            Mas_Ord_Tek[Kol][6]=5;
            }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6 - -
          if ( Tip_Ord == OP_SELLSTOP )
            {
            Kol_SS++;
            Mas_Ord_Tek[Kol][6]=6;
            }
//--------------------------------------------------------------------------------------------------------------------
         }
      }
//====================================================================================================================



В дальнейшем, анализируя массив, я точно знаю сколько у меня ордеров и каких по данной вал. паре.

 
Да ребята... Чувствую себя полным идиотом. Придется анализировать массив...
А неужели в этом чудо-редакторе не предусмотренно более простого способа, чтобы разделить инструменты?
Все-таки странный язык придумали: для пройстеших и востребованных по умолчанию действий надо писать листинги километровые, а документация более чем скромная. Сложность языка явно требует наличия примеров, если, конечно, язык для трейдеров, а не для профессиональных программистов.
Спасибо всем за ответы
 
Если ты хочешь что попроще, для разового употребления, то достаточно анализировать ордера, принадлежащие валютной паре.
if ( OrderSymbol()==Symbol() ) 
 {
 ...
 }
 
To: Slawa
По моему в этой ссылке разговор идет как раз об обратном, или
total=OrdersTotal();
if(total<n), где n=количество пар в работе, и далее эта программка?

To: SK
А где все же раскладывапются валютные пары в вашем коде? (Простите уж новичка)
 
Если ты хочешь что попроще, для разового употребления, то достаточно анализировать ордера, принадлежащие валютной паре.
if ( OrderSymbol()==Symbol() ) 
 {
 ...
 }



Меня интересует как изменится этот самый стандартный
total=OrdersTotal();
if(total<1)...
Этих самых total надо < 1 для конкретной пары выставить, когда ещё ордера нет открытого,
как тогда OrderSymbol() применять?!
 
Ответ кроется в самом твоём вопросе.

Если ты хочешь работать только среди "своих" ордеров, т.е. принадлежащих валютной паре, то сначала надо их посчитать. Для этого необходимо пройтись по терминалу и с помощью анализа OrderSymbol()==Symbol() выбрать "свои". Их количество и будет total для текущего окна. Чтоб не путаться, я бы открыл новую переменную, например, total_win , т.е. количество ордеров, принадлежащих окну (вал. паре).

В тело цикла "пройдёмся по терминалу" можно вставить, например, такой фрагмент:

total_win=0;
...
//Начало цикла по всем ордерам
if ( OrderSymbol()==Symbol() ) 
 {
 total_win++;
 }
//Конец цикла по всем ордерам


После такого анализа у тебя будет в распоряжении 2 переменных:
total - общее количество ордеров;
total_win - количество ордеров по вал.паре.

А дальше уже в зависимости от дальнейших целей.

 
Еще проще, для каждого советника и типа ордера введи свой Магический номер, а потом отлавливай их в цикле
 


total_win=0;
...
//Начало цикла по всем ордерам
if ( OrderSymbol()==Symbol() ) 
 {
 total_win++;
 }
//Конец цикла по всем ордерам


После такого анализа у тебя будет в распоряжении 2 переменных:
total - общее количество ордеров;
total_win - количество ордеров по вал.паре.



Всегде завидовал тому, кто четко может поставить задачу и упростить её. Я вот три дня сижу, чего только не удумал. А тут две строчки кода и всё решено! Спасибо!!!
Причина обращения: