Фракталы и средная

 

Здравствуйте уважаемые форумчане.

Не могу решить на мой взгляд довольно простую задачу а именно...

Надо заставить советник покупать на первом фрактале пересекшем среднюю вверх и то же самое на продажу только вниз. Схематически это выглядит так(Сделки выделил кружочком):

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

#define MAGICMA  55555555

extern int Delta = 3;
extern int MASlow = 13;
extern int StopLoss = 1000;
extern int  LevelWLoss  = 10;      // Уровень безубытка
extern int  LevelProfit = 1000;     // Уровень профита

int TakeProfit = 0;
double FUP, FDOWN, MA;
bool up, down, isDown, isUp;
int prevtime = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   TakeProfit = StopLoss*Delta;      
   MA = iMA(NULL,0,MASlow,8,MODE_SMMA,PRICE_MEDIAN,0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
  void bu()
{
   bool   fm;
  double pBid, pAsk, pp;
  int    i, nd, o=OrdersTotal();
  string comm="";

  for (i=0; i<o; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      nd=MarketInfo(OrderSymbol(), MODE_DIGITS);
      pp=MarketInfo(OrderSymbol(), MODE_POINT);
      
      if (OrderType()==OP_BUY) {
        
        if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*pp) {
          pBid=MarketInfo(OrderSymbol(), MODE_BID);
          if (pBid-OrderOpenPrice()>LevelProfit*pp) {
            fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*pp,OrderTakeProfit(),CLR_NONE);
          }
        }
      }
      if (OrderType()==OP_SELL) {
        
        if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*pp) {
          pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
          if (OrderOpenPrice()-pAsk>LevelProfit*pp) {
            fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*pp,OrderTakeProfit(),CLR_NONE);
          }
        }
      }
      if (fm) {
        break;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Подсчет лотов                                                    |
//+------------------------------------------------------------------+
double GetLots()
{
   return (NormalizeDouble(AccountBalance()/10000,2));
}
//+------------------------------------------------------------------+
//| Подсчет ордеров                                                  |
//+------------------------------------------------------------------+
void CalculateOrders()
{
     for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUYSTOP)
         {
            
            if(OrderOpenPrice()>FUP) OrderDelete(OrderTicket());
            else up = false;
         }
         
         if(OrderType()==OP_SELLSTOP)
         {
            if(OrderOpenPrice()<FUP) OrderDelete(OrderTicket());
            else down = false;
         }
        }
     }
}
double GetLastUp()
{
   double frac;
   for(int i=3; i<Bars; i++)   
   {
      frac = iFractals(Symbol(), Period(), MODE_UPPER, i);
      if(frac>0) return (frac);
   }
}
double GetLastDown()
{
   double frac;
   for(int i=3; i<Bars; i++)   
   {
      frac = iFractals(Symbol(), Period(), MODE_LOWER, i);
      if(frac>0) return (frac);
   }
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(Bars<100 || IsTradeAllowed()==false) return;
   if(Time[0] == prevtime) return (0);
   prevtime = Time[0];
   
   bu();
   
   double Lots = GetLots();
   
   if(Ask>MA) isDown = true;
   if(Bid<MA) isUp = true;
   
   FUP   = GetLastUp();
   FDOWN = GetLastDown(); 
   
   up = false;
   down = false;
   
   if(isUp)
   if(FUP>MA)
   {
      up = true;      
   }
   if(isDown)
   if(FDOWN<MA)
   { 
      down = true;      
   }
   
   CalculateOrders();
   
   if(up == true)
   {
      OrderSend(Symbol(), OP_BUYSTOP, Lots, FUP, 1, FUP-StopLoss*Point, FUP+TakeProfit*Point, "Покупка",MAGICMA,0, Green);
   }
   
   if(down == true)
   {
      OrderSend(Symbol(), OP_SELLSTOP, Lots, FDOWN, 1, FDOWN+StopLoss*Point, FDOWN-TakeProfit*Point, "Продажа",MAGICMA,0, Red);
   }
//----
   return(0);
  }

 
jhon:

Здравствуйте уважаемые форумчане.

Не могу решить на мой взгляд довольно простую задачу а именно...

Надо заставить советник покупать на первом фрактале пересекшем среднюю вверх и то же самое на продажу только вниз. Схематически это выглядит так(Сделки выделил кружочком):

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

Не все правильно...

Теперь вот выставляет все там, где надо. Посмотрите код. Думаю, что поймете, чего там было не совсем так.

Файлы:
frnma.mq4  8 kb