алгоритм, указанный в ТЗ, не соблюден
я попробовал вытащить эти уровни из индикатора, они по нулям:

Несмотря на хорошие результаты в тестере, алгоритм, указанный в ТЗ, не соблюден. В момент открытия ордера гистограмма MACD находилась за пределами канала, образованного динамическими уровнями 35 и 65
extern double Level1 = 35;
extern double Level2 = 65;
....
if(lim>0 && macd>-Level2/10000 && macd<-Level1/10000)
{
PutOrder(0,Ask);
ModifyOrders();
}
if(red>0 && macd<Level2/10000 && macd>Level1/10000)
{
PutOrder(1,Bid);
ModifyOrders();
}
Как только точка цены со следующим тиком окажется хоть на один пипс выше трендовой линии, мы считаем, что касание произошло и открываем ордер по этой сформировавшейся цене. А как в данный момент работает советник?
обратите внимание на то, чтобы каналы располагались именно так, как на скрине
А разве в настоящий момент без предлагаемых исправлений вход не делается при касании ценой первой линии?
b1=ObjectGetValueByTime(0,"B1",Time[0]);
b2=ObjectGetValueByTime(0,"B2",Time[0]);
b3=ObjectGetValueByTime(0,"B3",Time[0]);
s1=ObjectGetValueByTime(0,"S1",Time[0]);
s2=ObjectGetValueByTime(0,"S2",Time[0]);
s3=ObjectGetValueByTime(0,"S3",Time[0]);
BU();
if(TrailingStop>0)
Trailing();
if(CountTrades()<1)
{
if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
{
if(Ask>b1 && Ask<b2)
PutOrder(0,Ask);
}
if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
{
if(Bid<s1 && Bid>s2)
PutOrder(1,Bid);
}
}
extern bool Lines = 1; // показывать линии
if(CountOrders()<1)
{
...
}
if(OrderStopLoss()>sl || (OrderStopLoss()==0))
{
Print("SL: ",sl, " TP: ",OrderTakeProfit());
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
DelOrder();
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Trailing()
{
bool mod;
double sl=0;
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(Bid-OrderOpenPrice()>TrailingStop*_Point)
{
sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
if(OrderStopLoss()<sl)
{
Print("SL: ",sl, " TP: ",OrderTakeProfit());
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
DelOrder();
return;
}
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()-Ask>TrailingStop*_Point)
{
sl=NormalizeDouble(Ask+TrailingStop*_Point,_Digits);
if(OrderStopLoss()>sl || (OrderStopLoss()==0))
{
Print("SL: ",sl, " TP: ",OrderTakeProfit());
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
<DelOrder();
return;
}
}
}
}
}
}
}
рисовать ручками
AM2