Вопрос бывалым по пересечению 2 МА.

 

Приветствующую товарищи программисты. Есть вопрос по существу). Составил я код на основе пересечения 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);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Не судите строго, может снова, ни так задал вопрос или где то накосячил). Заранее спасибо.

 
Игорь:

Как прописать условие в советнике, что бы сделка открывалась чётко при пересечении 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)
{
   // Быстрая пересекла медленную сверху вниз
}
 
Ihor Herasko:

Надо бы знак "=" ещё добавлять, мало ли было совпадения машек, тогда пересечение в Вашем варианте не обнаружится.

if (fMAFast1 > fMASlow1 && fMAFast2 <= fMASlow2)
 
Andrei Fandeev:

Надо бы знак "=" ещё добавлять, мало ли было совпадения машек, тогда пересечение в Вашем варианте не обнаружится.

Это уже более глубокий подход, который требует организации цикла с целью поиска бара отсутствия равенства МАшек и установления действительности пересечения, а не касания линий. Для начала - простое.

 
Игорь:

Составил я код на основе пересечения 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)
 
Тот же результат.............. ниче не поменялось...... может тестер дает глюки?
 
FXwin:

Условие самого факта пересечения машек на предыдущем баре:

вот........


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++;}
//---

 
Сергей Дыбленко:
Тот же результат.............. ниче не поменялось...... может тестер дает глюки?

Тот же результат, какой именно тот же??
Что происходит и что должно быть?

 
Сергей Дыбленко:

А еще не могу понять почему он сливает?

Сергей, не тратьте свое время и деньги. 
МА работал тогда, когда брокеры свои графики на миллиметровке рисовали. 
Сейчас не существует рабочих систем на этих индикаторах и любом их сочетании:

вся прибыльность таких систем носит случайный и временных характрер, примерно такой же как и при подбрасывании монетки.