Здравствуйте. Помогите, пожалуйста, доработать советник. Не могу никак прописать условие для такого индикатора:
Код советника:
Условие должно быть таким:
- цена ниже нижней границы канала
- после пробития канала УЖЕ был должный сигнал
- цена достигла минимального Low после выхода из канала, отмеченного ранее сигналом
- границы канала (и центральная) не меняли направление
Код советника:
void start()
{
total=OrdersTotal();
if(total<1)
{
// нет ни одного открытого ордера
if(AccountFreeMargin()<(1*Lot))
{
Print("Нет средств. Свободная маржа счета = ",AccountFreeMargin());
}
}
//ищем тикеты открытых ордеров
for(int i=0; i<=OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
return;
}
if (tma_buy()==1)
{
double ask=NormalizeDouble(Ask,Digits);
double bid=NormalizeDouble(Bid,Digits);
SL=NormalizeDouble(Bid-StopLoss*Point,Digits);
ticket=OrderSend(Symbol(),OP_BUY,Lot,ask,Slippage,SL,0,"",Magic,0,clrGreen);
if(ticket==-1)
{
NumberError=GetLastError();
Print("Ошибка(",NumberError,") открытия Buy ",Error(NumberError));
}
}
if (tma_sell()==-1)
{
double ask=NormalizeDouble(Ask,Digits);
double bid=NormalizeDouble(Bid,Digits);
SL=NormalizeDouble(Ask+StopLoss*Point,Digits);
ticket=OrderSend(Symbol(),OP_SELL,Lot,bid,Slippage,SL,0,"",Magic,0,clrRed);
if(ticket==-1)
{
NumberError=GetLastError();
Print("Ошибка(",NumberError,") открытия Buy ",Error(NumberError));
}
}
//+------------------------------------------------------------------+
//Закрытие ордеров
if (AutoClose)
{
Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
// for (int i=0; v<OrdersTotal(); i++) {
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(tma_sell()==-1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
//return(0);
}
}
if(OrderType()==OP_SELL)
{
if(tma_buy()==1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
//return(0);
}
}
} // Symbol()
} // select
} //total
} //Close_
//+------------------------------------------------------------------+
if(trail==true)
{
Trailling();
}
return;
}
//+------------------------------------------------------------------+
bool tma_buy()
{
Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
Al_1=NormalizeDouble(Al_1,Digits);
Al_2=NormalizeDouble(Al_2,Digits);
Al_3=NormalizeDouble(Al_3,Digits);
Al_4=NormalizeDouble(Al_4,Digits);
Al_5=NormalizeDouble(Al_5,Digits);
if(Close[1]>Al_1)
return(true); else return(false);
}
bool tma_sell()
{
Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
Al_1=NormalizeDouble(Al_1,Digits);
Al_2=NormalizeDouble(Al_2,Digits);
Al_3=NormalizeDouble(Al_3,Digits);
Al_4=NormalizeDouble(Al_4,Digits);
Al_5=NormalizeDouble(Al_5,Digits);
if(Close[1]<Al_3)
return(true); else return(false);
}
{
total=OrdersTotal();
if(total<1)
{
// нет ни одного открытого ордера
if(AccountFreeMargin()<(1*Lot))
{
Print("Нет средств. Свободная маржа счета = ",AccountFreeMargin());
}
}
//ищем тикеты открытых ордеров
for(int i=0; i<=OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
return;
}
if (tma_buy()==1)
{
double ask=NormalizeDouble(Ask,Digits);
double bid=NormalizeDouble(Bid,Digits);
SL=NormalizeDouble(Bid-StopLoss*Point,Digits);
ticket=OrderSend(Symbol(),OP_BUY,Lot,ask,Slippage,SL,0,"",Magic,0,clrGreen);
if(ticket==-1)
{
NumberError=GetLastError();
Print("Ошибка(",NumberError,") открытия Buy ",Error(NumberError));
}
}
if (tma_sell()==-1)
{
double ask=NormalizeDouble(Ask,Digits);
double bid=NormalizeDouble(Bid,Digits);
SL=NormalizeDouble(Ask+StopLoss*Point,Digits);
ticket=OrderSend(Symbol(),OP_SELL,Lot,bid,Slippage,SL,0,"",Magic,0,clrRed);
if(ticket==-1)
{
NumberError=GetLastError();
Print("Ошибка(",NumberError,") открытия Buy ",Error(NumberError));
}
}
//+------------------------------------------------------------------+
//Закрытие ордеров
if (AutoClose)
{
Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
// for (int i=0; v<OrdersTotal(); i++) {
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(tma_sell()==-1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
//return(0);
}
}
if(OrderType()==OP_SELL)
{
if(tma_buy()==1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
//return(0);
}
}
} // Symbol()
} // select
} //total
} //Close_
//+------------------------------------------------------------------+
if(trail==true)
{
Trailling();
}
return;
}
//+------------------------------------------------------------------+
bool tma_buy()
{
Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
Al_1=NormalizeDouble(Al_1,Digits);
Al_2=NormalizeDouble(Al_2,Digits);
Al_3=NormalizeDouble(Al_3,Digits);
Al_4=NormalizeDouble(Al_4,Digits);
Al_5=NormalizeDouble(Al_5,Digits);
if(Close[1]>Al_1)
return(true); else return(false);
}
bool tma_sell()
{
Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
Al_1=NormalizeDouble(Al_1,Digits);
Al_2=NormalizeDouble(Al_2,Digits);
Al_3=NormalizeDouble(Al_3,Digits);
Al_4=NormalizeDouble(Al_4,Digits);
Al_5=NormalizeDouble(Al_5,Digits);
if(Close[1]<Al_3)
return(true); else return(false);
}
- цена ниже нижней границы канала
- после пробития канала УЖЕ был должный сигнал
- цена достигла минимального Low после выхода из канала, отмеченного ранее сигналом
- границы канала (и центральная) не меняли направление
Последнее редактирование модератором: