Помогите с роботом.

Back to topics list To post a new topic, please log in or register
avatar
1
Anna_89 2015.06.25 08: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)
  {
//---
   
  }
Attached files:
  mr.kgoldjma.mq4  (6.38 KB)
avatar
12992
WHRoeder 2015.06.25 13: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.

Back to topics list  

To add comments, please log in or register