Download MetaTrader 5
To add comments, please log in or register
How to earn at MQL5.community? Come and find out!
Anna_89
443
Anna_89 2015.06.25 06:55 

Здравствуйте! Помогите найти ошибку в роботе.

Он создан на основе двух скользящих средних периодами 7 и 17. Должен ставится отложенный ордер (BuyStop, приказ приказ приказ приказ приказ приказ sellstop) при перекрещении двух мА. Закрытие происходит по трейлинг стопу и по времени.

А в результате открываются сделки помимо отложенных и текущие (Покупка, Продажа). И сделки ставятся на каждом баре, а не на перекрещении.

//+------------------------------------------------------------------+
//|                                                     Mr. gold.mq4 |
//|                                                         Mr. gold |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mr. gold"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lots             = 0.1;
extern int ChannelDistance     = 100;
extern int Magic               = 8888;   
extern int StopLoss            = 0,
           TakeProfit          = 0,
           TrailingStop        = 0;
extern int ExpirationOrder     = 0;
extern double Rastvor          = 0;    // Расстояние между МА 
           
int Bar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
   
int start()
{
   double minstoplevel;
   double price;
   double stoploss;
   double takeprofit;
   int ticket, Slippage;
   int cnt = OrdersTotal();
   double MA_1, MA_2;
   
   int Order_Total_Amount_BUYSTOP, Order_Total_Amount_SELLSTOP;
       
   if (Bars > Bar &&
      cnt < 2)
      
   {
      MA_1=iMA(NULL,0,7,0,MODE_SMA,PRICE_TYPICAL,0);
      MA_2=iMA(NULL,0,17,0,MODE_SMA,PRICE_CLOSE,0);
         
      minstoplevel=NormalizeDouble((MarketInfo(Symbol(),MODE_SPREAD)*2+1)*Point,Digits);
      
      for (int I = OrdersTotal () - 1; I >= 0; I --)
      {
        OrderSelect (I, SELECT_BY_POS);
      
        if (OrderType () == OP_BUYSTOP)
      {        
         Order_Total_Amount_BUYSTOP ++;
      }
        if (OrderType () == OP_SELLSTOP)
      {
         Order_Total_Amount_SELLSTOP ++;
      }      
      }
      
      // Print("Minimum stop Level=",minstoplevel," points");
      
      // Buy
      if (MA_1!=EMPTY_VALUE &&
      MA_1!=0 &&
      MA_2!=EMPTY_VALUE &&
      MA_2!=0)
      if (MA_1>MA_2+Rastvor*Point)
      if (Order_Total_Amount_BUYSTOP==0)
      {
         price=NormalizeDouble(Bid+minstoplevel+ChannelDistance*Point,Digits);
         //--- вычисленные значения цен SL и TP должны быть нормализованы
         
         if (StopLoss>0)
         stoploss=NormalizeDouble(price-StopLoss*Point,Digits);
         
         if (TakeProfit>0)
         takeprofit=NormalizeDouble(price+TakeProfit*Point,Digits);
         //--- размещаем рыночный ордер на покупку лота
         ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,30,stoploss,takeprofit,"",Magic,TimeCurrent()+ExpirationOrder,clrGreen);      
      }
            
      // Sell
      if (MA_1!=EMPTY_VALUE &&
      MA_1!=0 &&
      MA_2!=EMPTY_VALUE &&
      MA_2!=0)
      if (MA_1<MA_2-Rastvor*Point)
      if (Order_Total_Amount_SELLSTOP==0)
      {
         price=NormalizeDouble(Bid-minstoplevel-ChannelDistance*Point,Digits);
         //--- вычисленные значения цен SL и TP должны быть нормализованы
            
         if (StopLoss>0)
         stoploss=NormalizeDouble(price+StopLoss*Point,Digits);
            
         if (TakeProfit>0)
         takeprofit=NormalizeDouble(price-TakeProfit*Point,Digits);
         //--- размещаем рыночный ордер на покупку лота
         ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,30,stoploss,takeprofit,"",Magic,TimeCurrent()+ExpirationOrder,clrRed);
      }
      // Прочие
      
      Bar = Bars;
   }
   
   // Трейлинг-стоп
   
   Order_Modify_Trailing_Stop ();  
   
   return(0);
}
 
// МОДИФИКАЦИЯ ОРДЕРА

void Order_Modify_Trailing_Stop ()
{
   // СТОП-УРОВНИ
   
   for (int I = OrdersTotal () - 1; I >= 0; I --)
   {
      OrderSelect (I, SELECT_BY_POS);
      
      if (OrderMagicNumber () == Magic)
      {
         // СТОП-УРОВНИ
         
         if (TrailingStop > 0)
         {
            if (OrderType () == OP_BUY ||
               OrderType () == OP_BUYSTOP ||
               OrderType () == OP_BUYLIMIT)
            {
               // Установка
               
               if (NormalizeDouble (MarketInfo (OrderSymbol (), MODE_BID) - OrderOpenPrice (), MarketInfo (OrderSymbol (), MODE_DIGITS)) > NormalizeDouble (TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) &&
                  (NormalizeDouble (MarketInfo (OrderSymbol (), MODE_BID) - TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) > OrderStopLoss () || OrderStopLoss () == 0))
               {
                  OrderModify (OrderTicket (), OrderOpenPrice (), NormalizeDouble (MarketInfo (OrderSymbol (), MODE_BID) - TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)), OrderTakeProfit (), OrderExpiration ());
                  
                  OrderSelect (OrderTicket (), SELECT_BY_TICKET);
               }
            }
            
            if (OrderType () == OP_SELL ||
               OrderType () == OP_SELLSTOP ||
               OrderType () == OP_SELLLIMIT)
            {
               // Установка
               
               if (NormalizeDouble (OrderOpenPrice () - MarketInfo (OrderSymbol (), MODE_ASK), MarketInfo (OrderSymbol (), MODE_DIGITS)) > NormalizeDouble (TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) &&
                  (NormalizeDouble (MarketInfo (OrderSymbol (), MODE_ASK) + TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) < OrderStopLoss () || OrderStopLoss () == 0))
               {
                  OrderModify (OrderTicket (), OrderOpenPrice (), NormalizeDouble (MarketInfo (OrderSymbol (), MODE_ASK) + TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)), OrderTakeProfit (), OrderExpiration ());
                  
                  OrderSelect (OrderTicket (), SELECT_BY_TICKET);
               }
            }
         }
      }
   }
}

  //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
Files:
whroeder1
13644
whroeder1 2015.06.25 11:51  
  1. Don't paste code
    Play video
    Please edit your post.
    For large amounts of code, attach it.

  2. This is the English forum, use the Russian one.
/
To add comments, please log in or register