Кто поможет??

 
Добрый день!Прошу помощи.Дело в том,что когда-то был написан мне советник.Он должен ставить ордера на выполнеие сделок по сигналу по двум направлениям,покупка и продажа.Но он почему-то ставит только ордер в одном направлении,а если на два,то очень редко это бывает.Почему?
 

По тренду работает. У вас очень хороший советник, кстати, грех жаловаться!

 
Swetten >>:

По тренду работает. У вас очень хороший советник, кстати, грех жаловаться!

остряк!

 
valex писал(а) >>

остряк!

"Хо-хо. Грубите парниша..." (с)

 
выкладывай код, там посмотрим
 
Techno >>:
выкладывай код, там посмотрим
//+------------------------------------------------------------------+
//| expert_victor_bar1.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
extern int TP=80,SL=40,TS=15,shift=40;
extern double lots=0.1;
double victor,abc;
bool ordb,ords;
int TotalOrders,pos,times,timeb,ps,pb;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
ords=false; ordb=false;
for(pos=0;pos<TotalOrders;pos++) {
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP) && OrderSymbol()==Symbol()) ords=true;
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP) && OrderSymbol()==Symbol()) ordb=true;
}

victor=0;
victor=iCustom(NULL,0,"1244",0,1);
abc=iCustom(NULL,0,"1244",1,1);
if (victor>0 && !ords)
{
ps=OrderSend(Symbol(),OP_SELLSTOP,lots,Low[1]-shift*Point,0,Low[1]-(shift-SL)*Point,Low[1]-(shift+TP)*Point,0,0,0,Blue);
ords=true;
Sleep(5000);
times=Time[0];
}

if (victor>0 && !ordb)
{
pb=OrderSend(Symbol(),OP_BUYSTOP,lots,High[1]+shift*Point,0,High[1]+(shift-SL)*Point,High[1]+(shift+TP)*Point,0,0,0,Blue);
ordb=true;
Sleep(5000);
timeb=Time[0];
}
if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}

TotalOrders=OrdersTotal();
if(TotalOrders<1) {
return(0);
}


// it is important to enter the market correctly,
// but it is more important to exit it correctly...
for(pos=0;pos<TotalOrders;pos++) {
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
if(OrderType()==OP_BUY) {
// check for trailing stop
if(TS>0) {
if(Bid-OrderOpenPrice()>Point*TS) {
if(OrderStopLoss()<Bid-Point*TS) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TS,OrderTakeProfit(),0,Green);
return(0);
}
}
}
} else {
// check for trailing stop
if(TS>0) {
if((OrderOpenPrice()-Ask)>(Point*TS)) {
if((OrderStopLoss()>(Ask+Point*TS)) || (OrderStopLoss()==0)) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TS,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
 

1. а что пишется в журнале? есть ли ошибки?

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

2. Вот тут

if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}

могут быть проблемы с удалением ордеров Buy и Sell


3. Если у вас эти параметры используются для пятизнаков - то может не разрешать стопуровень ставить так близко ордера.

Надо сначала проверяит тп и сл на правильность.

А ещё лучше уберите для начала из ордера стоплос и тейкпрофит. Может в них и проблема


4. Нормализируйте цены.

 
sergeev >>:

1. а что пишется в журнале? есть ли ошибки?

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

2. Вот тут

if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}

могут быть проблемы с удалением ордеров Buy и Sell


3. Если у вас эти параметры используются для пятизнаков - то может не разрешать стопуровень ставить так близко ордера.

Надо сначала проверяит тп и сл на правильность.

А ещё лучше уберите для начала из ордера стоплос и тейкпрофит. Может в них и проблема


4. Нормализируйте цены.


Алексей,спасибо!!Вроде разобрался.Действительно,проблема с величиной стопа и открытия ордера.И проблема с ордерами.Т.е.советник ставит два ордера и если один сработал,то другой еще в режиме ожидания,но если вновь появился сигнал по индикатору "1244",то советник не удаляет "старый" ордер,а ставит тот,которого не хватает.Т.е.,если в данный момент покупка,то ставит продажу и наоборот.

 
valex >>:

Т.е.советник ставит два ордера и если один сработал,то другой еще в режиме ожидания,но если вновь появился сигнал по индикатору "1244",то советник не удаляет "старый" ордер,а ставит тот,которого не хватает.Т.е.,если в данный момент покупка,то ставит продажу и наоборот.


так это ошибка или так и надо?


за удаление отложенного ордера отвечает вот эти строки

if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}

но у вас в коде нигде нет удаления открытых ордеров. 

 
sergeev >>:


так это ошибка или так и надо?


за удаление отложенного ордера отвечает вот эти строки

if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}

но у вас в коде нигде нет удаления открытых ордеров.

конечно было бы лучше,если бы при появлении сигнала,"старые"ордера удалялись,а новые устанавливались!

 

У вас немного не правильная просьба, так как сигнал существует в течении нескольких тиков. А следовательно на каждом тике ордер будет удалятся и менятся на отложку..

сформулируйте для начала правильно алгоритм.