Как прописать условие в советнике, что бы сделка открывалась чётко при пересечении 2 машек. На данный момент у меня получается вот так, при пересечении 2 машек, позиция на сделку открывается позже и данная сделка не закрывается.
Подобное условие:
iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1)<iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2) && iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1)<iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2)
это не пересечение двух МАшек. Здесь проверяется условие уменьшения значения каждой из МАшек в отдельности. Первое условие - значение МА(9) на первом баре меньше, чем значение МА(9) на предыдущем баре. Второе условие - аналогично, но для МА(144).
Чтобы проверить пересечение двух МА, нужно сравнивать их значения между собой, а не по отдельности:
double fMAFast1 = iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1); double fMAFast2 = iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2); double fMASlow1 = iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1); double fMASlow2 = iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2); if (fMAFast1 > fMASlow1 && fMAFast2 < fMASlow2) { // Быстрая пересекла медленную снизу вверх } if (fMAFast1 < fMASlow1 && fMAFast2 > fMASlow2) { // Быстрая пересекла медленную сверху вниз }
Надо бы знак "=" ещё добавлять, мало ли было совпадения машек, тогда пересечение в Вашем варианте не обнаружится.
if (fMAFast1 > fMASlow1 && fMAFast2 <= fMASlow2)
Надо бы знак "=" ещё добавлять, мало ли было совпадения машек, тогда пересечение в Вашем варианте не обнаружится.
Это уже более глубокий подход, который требует организации цикла с целью поиска бара отсутствия равенства МАшек и установления действительности пересечения, а не касания линий. Для начала - простое.
Составил я код на основе пересечения 2 МА. Как прописать условие в советнике, что бы сделка открывалась чётко при пересечении 2 машек. На данный момент у меня получается вот так, при пересечении 2 машек, позиция на сделку открывается позже и данная сделка не закрывается.
Вообще в данном коде отслеживается изгиб каждой МА по отдельности на предыдущем баре а не пересечение их.
Ihor Herasko правильно подсказал отслеживание их пересечения.
И закрытие по итогу не используется в старте.
Так же надо добавить цикл открытых ордеров для их закрытия.
extern int Slippage=1; extern double lots = 0.1; extern int Magic=6312651; int open, close; int start() { double fMAFast1 = iMA(NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1); double fMAFast2 = iMA(NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2); double fMASlow1 = iMA(NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1); double fMASlow2 = iMA(NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2); int buy=-1, sell=-1; if (fMAFast1 > fMASlow1 && fMAFast2 < fMASlow2) buy=1; //Пересечение вверх, сигнал только на пересечении if (fMAFast1 < fMASlow1 && fMAFast2 > fMASlow2) sell=1; //Пересечение вниз, сигнал только на пересечении //--- int pos=0; for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { pos++;} //--- if (buy==1) { if (pos==0) open=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,0,0,"советник",Magic,0,Blue); for(i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){ if(OrderType()==OP_SELL) close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,LightPink);} } //--- if (sell==1) { if (pos==0) open=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,"советник",Magic,0,Red); for(i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){ if(OrderType()==OP_BUY) close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,LightBlue);} } return(0);}
Так и не понял как сделать что бы открывало на пересечении МА а не на изгибах!!!!
А еще не могу понять почему он сливает?
Так и не понял как сделать что бы открывало на пересечении МА а не на изгибах!!!!
double fMAFast1 = iMA(NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1); double fMAFast2 = iMA(NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2); double fMASlow1 = iMA(NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1); double fMASlow2 = iMA(NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2);
Условие самого факта пересечения машек на предыдущем баре:
Для бай будет так: (fMAFast1 > fMASlow1 && fMAFast2 <= fMASlow2) Для селл будет так: (fMAFast1 < fMASlow1 && fMAFast2 >= fMASlow2)
Условие самого факта пересечения машек на предыдущем баре:
вот........
int start()
{
double fMAFast1 = iMA(NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1);
double fMAFast2 = iMA(NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2);
double fMASlow1 = iMA(NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1);
double fMASlow2 = iMA(NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2);
int buy=-1, sell=-1;
if (fMAFast1 > fMASlow1 && fMAFast2 <= fMASlow2) buy=1; //Пересечение вверх, сигнал только на пересечении
if (fMAFast1 < fMASlow1 && fMAFast2 >= fMASlow2) sell=1; //Пересечение вниз, сигнал только на пересечении
//---
int pos=0;
for(i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
pos++;}
//---
Тот же результат.............. ниче не поменялось...... может тестер дает глюки?
Тот же результат, какой именно тот же??
Что происходит и что должно быть?
А еще не могу понять почему он сливает?
Сергей, не тратьте свое время и деньги.
МА работал тогда, когда брокеры свои графики на миллиметровке рисовали.
Сейчас
не существует рабочих систем на этих индикаторах и любом их сочетании:
вся прибыльность таких систем носит случайный и временных характрер, примерно такой же как и при подбрасывании монетки.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствующую товарищи программисты. Есть вопрос по существу). Составил я код на основе пересечения 2 МА. Ошибок при компиляции нет. Вопрос. Как прописать условие в советнике, что бы
сделка открывалась чётко при пересечении 2 машек. На данный момент у меня получается вот так, при пересечении 2 машек, позиция на сделку открывается позже и данная сделка не закрывается.
Вот так: https://charts.mql5.com/18/328/eurusd-d1-alpari-international-limited.png
Вот сам код:
extern int Slippage=1;
extern double lots = 0.1;
extern int Magic=6312651;
int order;
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
if(OrdersTotal()<1 && iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN,1)>iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2) && iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1)>iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2))
order=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,0,0,"советник",Magic,0,clrNONE);
if(OrdersTotal()<1 && iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1)<iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2) && iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1)<iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2))
order=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,"советник",Magic,0,clrNONE);
return(0);
}
//+------------------------------------------------------------------+
// Закрываем все ордера |
//+------------------------------------------------------------------+
void CloseAll()
{
int ticket,i;
while(OrdersTotal()>0)
{
for(i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<2)
{
if(OrderType()==OP_BUY)
{
if(iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 1)<iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2) && iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1)<iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2))
RefreshRates();
{
ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
if(!ticket) Print(" Ошибка! ",GetLastError());
Sleep(1000);
}
if(OrderType()==OP_SELL)
{
if(iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN,1)>iMA( NULL, 0, 9, 0, 2, PRICE_MEDIAN, 2) && iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 1)>iMA( NULL, 0, 144, 0, 2, PRICE_MEDIAN, 2))
RefreshRates();
{
ticket=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Green);
if(!ticket) Print(" Ошибка! ",GetLastError());
Sleep(1000);
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
Не судите строго, может снова, ни так задал вопрос или где то накосячил). Заранее спасибо.