Подсчет ордеров!

 

Добрый день! Помогите разобраться как заставить советника считать все открытые за время работы советника ордера!

Используя нижеприведенный код у меня почему-то постоянно обнуляется счетчик?


if (количество всех ордеров равно 0){               // начало программы, установка первого ордера
OrderSend("EURUSD!",OP_SELL,0.01,Bid,2,Ask+SL*Point,Ask-TP*Point);
int q=0;
q=q+1;                                                            //  сработка счетчика подсчета ордеров
Alert (GetLastError());}

if (достигается какое-то определенное условие){        // установка следующего ордера
OrderSend("EURUSD!",OP_SELL,0.01,Bid,2,Ask+SLnew*Point,Ask-TPnew*Point);
q=q+1;                                                            // очередная сработка счетчика подсчета ордеров 
Alert (GetLastError());}

Вопрос - что в коде не так, и почему q всегда равно 1?

Или может быть есть какой-то другой способ их считать?

Заранее спасибо всем откликнувшимся!



 

1.Переменная q - у вас объявлена внутри функции

2.Советую использовать OrdersTotal

https://docs.mql4.com/ru/trading/OrdersTotal

 
sergeev >>:

1.Переменная q - у вас объявлена внутри функции

2.Советую использовать OrdersTotal

https://docs.mql4.com/ru/trading/OrdersTotal

Проблема как раз в том, что необходимо знать общее количество всех когда-либо открытых ордеров, а OrdersTotal( ) определяет общее количество открытых и отложенных ордеров в данный момент времени! Я прав?

 
vetal_dnepr >>:

Добрый день! Помогите разобраться как заставить советника считать все открытые за время работы советника ордера!

Используя нижеприведенный код у меня почему-то постоянно обнуляется счетчик?


Вопрос - что в коде не так, и почему q всегда равно 1?

Или может быть есть какой-то другой способ их считать?

Заранее спасибо всем откликнувшимся!







///////////////////////// ReccountOrders/////////////////////////////
int ReccountOrders()
{
int rc_SellStop=0, rc_SellLimit=0, rc_BuyStop=0, rc_BuyLimit=0, rc_Buy=0, rc_Sell=0;

if(OrdersTotal()>0)
{

int rc_Total=OrdersTotal();


for(int i=rc_Total-1; i>=0; i--)
{ rc_Total=OrdersTotal();
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{


switch(OrderType()) //OrderType() == OP_BUY
{
case OP_SELLSTOP: rc_SellStop=rc_SellStop+1; break;
case OP_SELLLIMIT: rc_SellLimit=rc_SellLimit+1; break;
case OP_BUYSTOP: rc_BuyStop=rc_BuyStop+1; break;
case OP_BUYLIMIT: rc_BuyLimit=rc_BuyLimit+1; break;
case OP_BUY: rc_Buy=rc_Buy+1; break;
case OP_SELL: rc_Sell=rc_Sell+1; break;
}



}

}
}
}



/////////////////////// END ReccountOrders ///////////////////////////////////////////////

 
vetal_dnepr писал(а) >>

Добрый день! Помогите разобраться как заставить советника считать все открытые за время работы советника ордера!

Используя нижеприведенный код у меня почему-то постоянно обнуляется счетчик?

Вопрос - что в коде не так, и почему q всегда равно 1?

Или может быть есть какой-то другой способ их считать?

Заранее спасибо всем откликнувшимся!

Если я правильно понял Вашу проблему, то Вам достаточно использовать static при объявлении q

static int q=0;
 
PapaYozh >>:

Если я правильно понял Вашу проблему, то Вам достаточно использовать static при объявлении q

Гениально и просто - все отлично работает!!! Большое спасибо!

 
vetal_dnepr >>:

Гениально и просто - все отлично работает!!! Большое спасибо!

Если быть точным, то Ваш код:

OrderSend("EURUSD!",OP_SELL,0.01,Bid,2,Ask+SLnew*Point,Ask-TPnew*Point);
q=q+1;          

будет подсчитывать количество попыток отправки торговых приказов на сервер.

Чтобы считать не попытки, а выставленные уже на сервере ордера, нужно анализировать ответ сервера:

int ticket=OrderSend("EURUSD!",OP_SELL,0.01,Bid,2,Ask+SLnew*Point,Ask-TPnew*Point);
if (ticket > 0)  
   q=q+1;          
 
goldtrader >>:

Если быть точным, то Ваш код:

будет подсчитывать количество попыток отправки торговых приказов на сервер.

Чтобы считать не попытки, а выставленные уже на сервере ордера, нужно анализировать ответ сервера:

Да, абсолютно верно! - вот это я как раз учел, просто не писал здесь, что бы не засорять общую картину! Все равно спасибо!)

 
vetal_dnepr >>:

Да, абсолютно верно! - вот это я как раз учел, просто не писал здесь, что бы не засорять общую картину! Все равно спасибо!)

а сюда встроить можно?

https://www.mql5.com/ru/code/9634

Причина обращения: