Подскажите, где ошибка, плз

 

Хотел написать советника, чтобы открывал позицию на пробое Hi предыдущего дня. И закрывал по параболику который работал бы на тайм-фрейме Н-1. Вроде всё казалось бы просто. не получается! Т.е. тестер не видит условия

if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)>Bid). Всё срабатывает по стоп-лоссу

Весь код вот:

extern int TrailStop = 15;
extern int StopLoss = 15;
extern int Koefficient = 6;
int Spread,Ticket,Normaling,BUY_new,SELL_new,Error,d,n,Magic;
double Max,Min,Pr,LOTSTEP,Obyem,Obyem1,ma,sar,LastBid,LastCheckPoint,Temp,SL;
bool res,Trail=true;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Magic=(TimeCurrent());
LOTSTEP=MarketInfo(Symbol(),MODE_MINLOT);
if(LOTSTEP==0.1) Normaling=1;
if(LOTSTEP==0.01) Normaling=2;
Obyem1=NormalizeDouble(AccountEquity()/(100000*Koefficient),Normaling);
if (MarketInfo(Symbol(),MODE_MINLOT)>Obyem1) Obyem=LOTSTEP; else Obyem=Obyem1;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
BUY_new=0;
SELL_new=0;
if(OrdersTotal()<1)
{
if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)<Bid)
{
if(BUY_new==0)
{
if(SELL_new==0)
{
if(Bid >iHigh(NULL, PERIOD_D1,1))
{
RefreshRates();
Ticket=OrderSend(Symbol(),OP_BUY,Obyem,Ask,3,Ask-StopLoss*Point,0,0,Magic,0,Blue);
BUY_new=1;
SELL_new=0;
}
}
}
}
}
if(Ticket>0)
{
if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)>Bid)
{
if(BUY_new==1)
{
OrderClose(Ticket,Obyem,Bid,3,Blue);
SELL_new=0;
BUY_new=0;
Ticket=0;
}
}
}
return(0);
}

без этого условия открывает-закрывает сразу, но это и понятно.

Потом думал сделать трейлинг:

if(Trail)
{
if(BUY_new==1)
{
if(Bid-OrderOpenPrice()>Point*TrailStop)
{
if(OrderStopLoss()<Bid-Point*TrailStop)
{
OrderModify(Ticket,OrderOpenPrice(),Bid-Point*TrailStop,0,0,Green);
return(0);
}
}
}
}

опять тестер не видит его в упор. Точнее на операции BY он модифицирует SellStop ордера в минус, а на Sell -SellСтоп модифицирует в плюс. Что я делаю не так?

Проверял на ДЦ FX-iNVEST и Nord-FX. Сорри за переменные, которые не используются. Маюсь уже второй вечер

 
NSE писал(а) >>

Хотел написать советника, чтобы открывал позицию на пробое Hi предыдущего дня. И закрывал по параболику который работал бы на тайм-фрейме Н-1. Вроде всё казалось бы просто. не получается! Т.е. тестер не видит условия

if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)>Bid). Всё срабатывает по стоп-лоссу

Весь код вот:

extern int TrailStop = 15;
extern int StopLoss = 15;
extern int Koefficient = 6;
int Spread,Ticket,Normaling,BUY_new,SELL_new,Error,d,n,Magic;
double Max,Min,Pr,LOTSTEP,Obyem,Obyem1,ma,sar,LastBid,LastCheckPoint,Temp,SL;
bool res,Trail=true;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Magic=(TimeCurrent());
LOTSTEP=MarketInfo(Symbol(),MODE_MINLOT);
if(LOTSTEP==0.1) Normaling=1;
if(LOTSTEP==0.01) Normaling=2;
Obyem1=NormalizeDouble(AccountEquity()/(100000*Koefficient),Normaling);
if (MarketInfo(Symbol(),MODE_MINLOT)>Obyem1) Obyem=LOTSTEP; else Obyem=Obyem1;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
BUY_new=0;
SELL_new=0;
if(OrdersTotal()<1)
{
if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)<Bid)
{
if(BUY_new==0)
{
if(SELL_new==0)
{
if(Bid >iHigh(NULL, PERIOD_D1,1))
{
RefreshRates();
Ticket=OrderSend(Symbol(),OP_BUY,Obyem,Ask,3,Ask-StopLoss*Point,0,0,Magic,0,Blue);
BUY_new=1;
SELL_new=0;
}
}
}
}
}
if(Ticket>0)
{
if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)>Bid)
{
if(BUY_new==1)
{
OrderClose(Ticket,Obyem,Bid,3,Blue);
SELL_new=0;
BUY_new=0;
Ticket=0;
}
}
}
return(0);
}

без этого условия открывает-закрывает сразу, но это и понятно.

Потом думал сделать трейлинг:

if(Trail)
{
if(BUY_new==1)
{
if(Bid-OrderOpenPrice()>Point*TrailStop)
{
if(OrderStopLoss()<Bid-Point*TrailStop)
{
OrderModify(Ticket,OrderOpenPrice(),Bid-Point*TrailStop,0,0,Green);
return(0);
}
}
}
}

опять тестер не видит его в упор. Точнее на операции BY он модифицирует SellStop ордера в минус, а на Sell -SellСтоп модифицирует в плюс. Что я делаю не так?

Проверял на ДЦ FX-iNVEST и Nord-FX. Сорри за переменные, которые не используются. Маюсь уже второй вечер

У меня есть небольшой опыт в программировании на С++ в MQL пишу впервые

 
Вынесите определение переменных BUY_new и SELL_new за пределы модуля, а то они у Вас обнуляются с каждым тиком.
 

Я перенёс определение переменных в init

Пропущен один показатель SAR.

 
Всё равно стоп-лосс
 

То, что Вы определяете в ините, не касается старта. Пробуйте.

extern int TrailStop = 15;
extern int StopLoss = 15;
extern int Koefficient = 6; 
int Spread,Ticket,Normaling,BUY_new,SELL_new,Error,d,n,Magic;
double Max,Min,Pr,LOTSTEP,Obyem,Obyem1,ma,sar,LastBid,LastCheckPoint,Temp,SL;
bool res,Trail=true;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Magic=(TimeCurrent());
LOTSTEP=MarketInfo(Symbol(),MODE_MINLOT);
if(LOTSTEP==0.1) Normaling=1;
if(LOTSTEP==0.01) Normaling=2;
Obyem1=NormalizeDouble(AccountEquity()/(100000*Koefficient),Normaling);
if (MarketInfo(Symbol(),MODE_MINLOT)>Obyem1) Obyem=LOTSTEP; else Obyem=Obyem1; 
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(OrdersTotal()<1) 
{
if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)<Bid)
{
if(BUY_new==0)
{
if(SELL_new==0)
{
if(Bid >iHigh(NULL, PERIOD_D1,1))
{
RefreshRates();
Ticket=OrderSend(Symbol(),OP_BUY,Obyem,Ask,3,Ask-StopLoss*Point,0,0,Magic,0,Blue);
BUY_new=1;
SELL_new=0;
}
}
}
}
}
if(Ticket>0)
{
if(iSAR(NULL,PERIOD_H1,0.09,0.2,0)>Bid)
{
if(BUY_new==1) 
{
OrderClose(Ticket,Obyem,Bid,3,Blue);
SELL_new=0;
BUY_new=0;
Ticket=0;
}
} 
}
return(0);
}

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