Группа "Стол заказов MQL"

Рейтинг 2089



РЕКОМЕНДУЮ



помогите доделать советник

Delta.mq4 (3 Kb) результатом доволен, но есть вот такая идея, можно сделать так, чтобы открытая по советнику позиция закрывалась при достижении тикового обьема до определенного значения и этот параметр вывести в настройки, например открылась позиция, в настройках стоит обьем 115 при достижении его, либо больше сделка закрывается, для новостей это был бы вообще трэшш*bomb* ,
  • 0
  • Просмотров: 2094
  • 12 декабря 2014, 19:57
  • Walerii
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
индикатор для Н4
Следующая запись в группе  
Помогите доработать советника
12 декабря 2014
13 декабря 2014

Комментарии (2)

+
0
Посмотрите вариант.


//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int    Delta   = 200;  // расстояние до ордера и стопы
extern int    Slip    = 30;   // проскальзывание ордера
extern int    Try     = 5;    // количество попыток выставить ордер
extern double Lots    = 0.1;  // объем позиции
extern double MaxLot  = 5;    // максимальный объем позиции
extern double TickVol = 11.5; // тиковый объем
extern int    MAGIC   = 333;  // магик
double lot;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s,err;
   double price;   
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(b<1)
    {
     price=Ask+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lot(),fND(price),Slip,fND(price-Delta*Point),fND(price+Delta*Point),"",MAGIC,0,Blue);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order BUYSTOP");     
    }             
                    
   //--- sell 
   if(s<1)
    {
     price=Bid-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lot(),fND(price),Slip,fND(price+Delta*Point),fND(price-Delta*Point),"",MAGIC,0,Red);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order SELLSTOP");     
    }
   if (err>Try) return;  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
         if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
        }
      }
    }     
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {  
   if(OrdersHistoryTotal()==0)
    {
     lot=Lots;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderProfit()>0)                     
       {
        lot=Lots;  
       }
      if(OrderProfit()<=0)
        {
         lot=OrderLots()*2;  
        }
     }
    if(lot>MaxLot)lot=MaxLot;            
   return(lot);
  } 
//+------------------------------------------------------------------+
void ClosePos()
  {
   double tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
    
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
     if(TickVol>0) ClosePos();   
//---
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 13 декабря 2014, 09:22
+
0
Поправил. Сейчас ставит ордера при превышении указанного тикового объема и значение объема выводится в окно терминала.

avatar

  34  AM2 Сообщений: 15891 - Андрей

  • 15 декабря 2014, 16:50

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари