Помогите немного изменить советника

 

Здравствуйте уважаемые!

На форуме нашел пример создания эксперта - все по технике меня устраивает, условия сделаю свои, НО мне надо чтобы он анализировал открытую(отсутствие открытой) позицию по определенной паре. В этом советнике используется orderstotal и из-за этого если открыта позиция на одной валютной паре то советник на другой паре не открывает позицию, считая что она открыта у него. Прошу вас изменить советник, если кому не лень. Кстати, в этом примере все хорошо расписано - кто подскажет где еще можно найти такие примеры. Заранее спасибо.

//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| https://www.metaquotes.net// |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt=0, ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // проверяем TakeProfit
}
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

total=OrdersTotal();
if(total<1)
{
// нет ни одного открытого ордера
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// проверяем на возможность встать в длинную позицию (BUY)
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) &&
MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
"macd sample",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);
}
// проверяем на возможность встать в короткую позицию (SELL)
if(MacdCurrent>0 && MacdCurrent<SignalCurrent &&
MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// переходим к важной части эксперта - контролю открытых позиций
// 'важно правильно войти в рынок, но выйти - еще важнее...'
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или
OP_SELL
OrderSymbol()==Symbol()) // инструмент совпадает?
{
if(OrderType()==OP_BUY) // открыта длинная позиция
{
// проверим, может уже пора закрываться?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent &&
MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //
закрываем позицию
return(0); // выходим
}
// проверим - может можно/нужно уже трейлинг стоп ставить?
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // иначе это короткая позиция
{
// проверим, может уже пора закрываться?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //
закрываем позицию
return(0); // выходим
}
// проверим - может можно/нужно уже трейлинг стоп ставить?
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) ||
(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// конец.

 

Спасибо, но мне только изменить total=OrdersTotal(); чтобы переменная тотал - показывала все открытые - неоткрытые ордера только для определенной валютной пары(на которой торгую).

 
Rusmilen:

Спасибо, но мне только изменить total=OrdersTotal(); чтобы переменная тотал - показывала все открытые - неоткрытые ордера только для определенной валютной пары(на которой торгую).


Напишите цикл, в котором советник пройдётся по всем ордерам. И если ордер не принадлежит нужной валютной паре, то он его пропускает и переходит к следующему.

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

Выкладывайте сюда свой цикл - если будет не правильным - объяснят в чём ошибка.

 
Я понял, что такие вопросы надо задавать в другой ветке. drknn - спасибо за направление, хоть рукой показали :)
 
Rusmilen:


drknn - ответил раньше чем вы написали что надо сделать. Умом понимаю, что делается это намного проще, а руки не умеют пока :). А ссылки немного не понравились, потому что там все сделают за меня, а я не этого хотел результата. Еще раз спасибо за ответ. Буду змагаться.
 
for (int i=OrdersTotal-1;i>=0;i--) { // организуем цикл прохода по ордерам
                // если ордер выбрать не удалось
    if (!OrderSelect(/*введите сюда параметры*/)) { /* то выведите тут сообщение об ошибке */ }
    else {// иначе ордер выбран
      if(/* напишите условие, мол, если не наш ордер */){ continue;// то перейти к следующему }
    }
  }
Причина обращения: