![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Смысл стратегии заключается в том, чтобы открывать позиции при выходе линии kijun_sen из «Облака», с учетом показаний двух скользящих средних с периодами 10 и 100. Закрытие: при возвращении kijun_sen обратно в «облако». Стратегия выглядит прибыльной. Особенно если учесть то, что за основу я взял идеи из экспертов, которые на тестировании показывают прибыль.
Эксперт то я написал, но работает он почему-то не полностью. Длинные позиции открывает а короткие не хочет. И кроме того не срабатывают (или не генерирует) сигналы на закрытие позиции. В общем работает почему-то только один блок. Не могу понять почему.
Сразу хочу предупредить, что в програмировании я не силен.
Помогите кто может!!!!!!!!!!!!
extern double TakeProfit = 200;
extern double StopLoss = 40;
extern double Lots = 1.0;
extern double TrailingStop = 40;
extern double MAFastPeriod=10;
extern double MASlowPeriod=100;
extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
int start()
{
double KijunCur, KijunPrev;
double SenkouACurrent, SenkouAPrev;
double SenkouBCurrent, SenkouBPrev;
double MaFastCur, MaFastPrev;
double MaSlowCur, MaSlowPrev;
int cnt=0, ticket, total;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // проверяем TakeProfit
}
if(StopLoss<10)
{
Print("StopLoss loss than 15");
return(0); // проверяем TakeProfit
}
KijunCur=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_KIJUNSEN, 0);
SenkouACurrent=iIchimoku(NULL, 0, Tenkan, Kijun, Senkou, MODE_SENKOUSPANA, 0);
SenkouACurrent=iIchimoku(NULL, 0, Tenkan, Kijun, Senkou, MODE_SENKOUSPANB, 0);
MaFastCur=iMA(NULL,0,MAFastPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaFastPrev=iMA(NULL,0,MAFastPeriod,0,MODE_EMA,PRICE_CLOSE,1);
MaSlowCur=iMA(NULL,0,MASlowPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaSlowPrev=iMA(NULL,0,MASlowPeriod,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((SenkouACurrent-SenkouBCurrent)>1*Point && (KijunCur-SenkouACurrent)>1*Point &&
(MaFastCur-MaSlowCur)>1*Point && (MaFastPrev-MaSlowPrev)>1*Point &&
(MaFastCur-MaFastPrev)>1*Point)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"AT&CF sample",16384,0,Green);
}
if((SenkouBCurrent-SenkouACurrent)>1*Point && (KijunCur-SenkouBCurrent)>1*Point &&
(MaFastCur-MaSlowCur)>1*Point && (MaFastPrev-MaSlowPrev)>1*Point &&
(MaFastCur-MaFastPrev)>1*Point)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"AT&CF sample",16384,0,Green);
return(0);
}
// проверяем на возможность встать в короткую позицию (SELL)
if((SenkouACurrent-SenkouBCurrent)>1*Point && (SenkouBCurrent-KijunCur)>1*Point &&
(MaSlowCur-MaFastCur)>1*Point && (MaSlowPrev-MaFastPrev)>1*Point &&
(MaFastPrev-MaFastCur)>1*Point)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"AT&CF sample",16384,0,Red);
}
if((SenkouBCurrent-SenkouACurrent)>1*Point && (SenkouACurrent-KijunCur)>1*Point &&
(MaSlowCur-MaFastCur)>1*Point && (MaSlowPrev-MaFastPrev)>1*Point &&
(MaFastPrev-MaFastCur)>1*Point)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"AT&CF sample",16384,0,Red);
return(0);
}
return(0);
}
// переходим к важной части эксперта - контролю открытых позиций
// 'важно правильно войти в рынок, но выйти - еще важнее...'
for(cnt=0;cnt<total;cnt++) //Оператор цикла. (Усл. запуска; Усл. заверш.цикла;+1 )
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //Функция выбирает ордер. Возвращает ИСТИНА при успешном завершении функции
//(Позиция ордера, ,ордер выбирается среди открытых и отложенных ордеров)
if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL
OrderSymbol()==Symbol()) // инструмент совпадает?
{
if(OrderType()==OP_BUY) // открыта длинная позиция
{
// проверим, может уже пора закрываться?
if((SenkouACurrent-SenkouBCurrent)>1*Point && (SenkouACurrent-KijunCur)>1*Point)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выходим
}
if((SenkouBCurrent-SenkouACurrent)>1*Point && (SenkouBCurrent-KijunCur)>1*Point)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выходим
}
if((MaSlowPrev-MaSlowCur)>1*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((SenkouACurrent-SenkouBCurrent)>1*Point && (KijunCur-SenkouBCurrent)>1*Point)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выходим
}
if((SenkouBCurrent-SenkouACurrent)>1*Point && (KijunCur-SenkouACurrent)>1*Point)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выходим
}
if((MaSlowCur-MaSlowPrev)>1*Point)
{
OrderClose(OrderTicket(),OrderLots(),Bid,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);
}
// конец.