Как одолеть OrdersTotal();
//================================================================================================ Анализ ордеров ====
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() )
{
...
}
По моему в этой ссылке разговор идет как раз об обратном, или
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 - количество ордеров по вал.паре.
Всегде завидовал тому, кто четко может поставить задачу и упростить её. Я вот три дня сижу, чего только не удумал. А тут две строчки кода и всё решено! Спасибо!!!
Т.е. чтобы 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);
}