Полезные mql функции

  • Автор темы Автор темы Юрий FT
  • Дата начала Дата начала

Юрий FT

Модератор
Здесь буду выкладывать свои функции, которые применяю для разработки советников. Если кому нужно применяйте, задавайте вопросы. Критика приветствуется.
 

Юрий FT

Модератор
закрытие позиции по типу

Код:
Expand Collapse Copy
//Закрывает позицю по типу, при type=1 зароет последний buy, при  type=2 зароет последний sell. 
//Переменная для названия магиг номера - MG; Запишет ошибку в журнал в случае таковой. 
int yOrderClose(int type)
   {
   int err;
   for(int i=1; i<=OrdersTotal(); i++)          
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {
         if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1 && OrderMagicNumber()==MG)
         {
          err=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
          if(err<0){Print("OrderClose()-  Ошибка закрытия OP_BUY.  OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Bid "+Bid+" "+GetLastError());return(-1);}
         }
         if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==2 && OrderMagicNumber()==MG)
         {
          err=OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
          if(err<0){Print("OrderClose()-  Ошибка закрытия OP_SELL.  OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Ask "+Ask+" "+GetLastError());return(-1);}
         }
        }
       }
   return(0);
   }
 

Юрий FT

Модератор
упрощенный вызов скользящей средней

Код:
Expand Collapse Copy
//если часто применяется вызов простой скользящей средней, удобнее вызывать просто yMa(период средней), значительно сокращает размер кода. 
double yMa(int per)   {
int    timeframe      =1440        ;
int    period         =per         ;
int    ma_shift       =0           ;
int    ma_method      =MODE_SMA    ;
int    applied_price  =PRICE_CLOSE ;
int    shift          =1           ;
double ma             =iMA(NULL,timeframe,period,ma_shift,ma_method,applied_price,shift);
return(ma)                         ;
}
 

Юрий FT

Модератор
поиск максимума минимума за заданное количество баров

Код:
Expand Collapse Copy
//Функция поиска максимума/минимума за заданное количество баров type-максимум или минимум, barsearch -количество баров
double yMaxDayPrice(int type,int barsearch) {
int    timeframe      =1440        ;
double minmax;
if(type==2){
minmax =Low[iLowest(timeframe,0,MODE_LOW,barsearch,0)];
}
if(type==1){
minmax =High[iHighest(timeframe,0,MODE_HIGH,barsearch,0)];
}
return(minmax);          
}
 

Юрий FT

Модератор
установка OP_BUYSTOP или OP_SELLSTOP ордеров

Код:
Expand Collapse Copy
//установка ордеров OP_BUYSTOP или OP_SELLSTOP, type - тип ордера 1-BUYSTOP , 2 - SELLSTOP, open - цена открытия, stop - стоп лосс. 
int ySendStopOrder(int type,double open,double stop)
{double op,sl,tp;int err;
   
   if(type==1)
   {
   op=open;sl=stop;
   err=OrderSend(Symbol(),OP_BUYSTOP,Lots,NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),0,"57 FORTRADER.RU",MG,0,Red);
   if(err<0){Print("OrderSend()-  Ошибка OP_BUYSTOP.  op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);}
   }
   
   if(type==2)
   {
    op=open;sl=stop;
    err=OrderSend(Symbol(),OP_SELLSTOP,Lots,NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),0,"57 FORTRADER.RU",MG,0,Red);
    if(err<0){Print("OrderSend()-  Ошибка OP_SELLSTOP.  op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);}
   }
return(0);
}
 

Юрий FT

Модератор
проверка - есть ли отложенные ордера BUYSTOP SELLSTOP

Код:
Expand Collapse Copy
//проверяет есть ли стоп ордера BUYSTOP SELLSTOP 
int yChStopPos(int type) 
{int i;
   for( i=1; i<=OrdersTotal(); i++)         
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true) 
       {                                   
           if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol() && type==1){return(1);}
           if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol() && type==2){return(1);}
       }
    }   
return(0);
}
 

Юрий FT

Модератор
функция удаления отложенных ордеров SELLSTOP или BUYSTOP

Код:
Expand Collapse Copy
//удаляет отложенные стоп ордера SELLSTOP или BUYSTOP по type
int yDeleteOrder(int type)
{
   for( int i=1; i<=OrdersTotal(); i++)          
   {
    if(OrderSelect(i-1,SELECT_BY_POS)==true) 
    {                                       
     if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol() && type==2)
     {
      OrderDelete(OrderTicket()); 
     }//if
  
    if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol() && type==1)
     {
      OrderDelete(OrderTicket()); 
     }//if
    }//if
   }
   return(0);
}
 

Юрий FT

Модератор
функция трелингстоп

Код:
Expand Collapse Copy
//функция трейлингстопа с шагом.
extern int TrailingStop=40;
extern int TrailingStep=5;

int  yTrailingStop()
{int i;bool err;

   for( i=1; i<=OrdersTotal(); i++)        
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true)
       {  
        if(TrailingStop>0 && OrderType()==OP_BUY && OrderSymbol()==Symbol())  
        {                
         if(Bid-OrderOpenPrice()>=TrailingStop*Point*mn && TrailingStop>0 && (Bid-Point*TrailingStop*mn)>OrderStopLoss())
          {
           if(((Bid-Point*TrailingStop*mn)-OrderStopLoss())>=TrailingStep*Point*mn)
           {
            Print("ТРЕЙЛИМ");
            err=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop*mn,OrderTakeProfit(),0,Green);
            if(err==false){return(-1);}
            GlobalVariableSet(DoubleToStr(OrderTicket(),0),Bid);
           }//if(Bid>=OrderStopLoss()
          }//if(Bid-OrderOpenPrice()
         }//if(BBUSize>0
        }//if(OrderSelect(i
           
       if(OrderSelect(i-1,SELECT_BY_POS)==true)
       {
        if(OrderType()==OP_SELL && OrderSymbol()==Symbol() )  
        {        
         if(OrderOpenPrice()-Ask>=TrailingStop*Point*mn && TrailingStop>0 && OrderStopLoss()>(Ask+TrailingStop*Point*mn))
          {
           if((OrderStopLoss()-(Ask+TrailingStop*Point*mn))>TrailingStep*Point*mn)
           {
            Print("ТРЕЙЛИМ");
            err=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point*mn,OrderTakeProfit(),0,Green);
            if(err==false){return(-1);}
           }//if(Ask<=OrderStopLoss()
          }//if(OrderOpenPrice()
         }//if(BBUSize>0 
       }// if(OrderSelect
    }// for( i=1;
return(0);
}
 

Юрий FT

Модератор
При использовании таких функций, основная логика советника сокращается например вот до такого кода:
Код:
Expand Collapse Copy
if(DayOfWeek()==5 && Hour()==timeopen&& yMa(maper10) > yMa(maper40) && yChStopPos(1)==0){
 max9day= yMaxDayPrice(1, maxdays);
ySendStopOrder(1,max9day+indent*Point*mn,max9day-StopLoss*Point*mn);
}

if(DayOfWeek()==5 && Hour()==timeopen&& yMa(maper10) < yMa(maper40) && yChStopPos(2)==0){
 max9day= yMaxDayPrice(2, maxdays);
ySendStopOrder(2,max9day-indent*Point*mn,max9day+StopLoss*Point*mn);
}

if(Hour()==timeclose){yOrderClose(1);yOrderClose(2);yDeleteOrder(1);yDeleteOrder(2);}

yTrailingStop();
 

StatBars

Интересующийся
Код:
Expand Collapse Copy
//Закрывает позицю по типу, при type=1 зароет последний buy, при  type=2 зароет последний sell. 
//Переменная для названия магиг номера - MG; Запишет ошибку в журнал в случае таковой. 
int yOrderClose(int type)
   {
   int err;
   for(int i=1; i<=OrdersTotal(); i++)          
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {
         if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1 && OrderMagicNumber()==MG)
         {
          err=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
          if(err<0){Print("OrderClose()-  Ошибка закрытия OP_BUY.  OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Bid "+Bid+" "+GetLastError());return(-1);}
         }
         if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==2 && OrderMagicNumber()==MG)
         {
          err=OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
          if(err<0){Print("OrderClose()-  Ошибка закрытия OP_SELL.  OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Ask "+Ask+" "+GetLastError());return(-1);}
         }
        }
       }
   return(0);
   }
Извиняюсь что залез в Вашу тему, если Вы против могу и не появляться здесь...
Просто случайно зашёл сюда, смотрю вроде функции, полезно...
Но в первой же функции обнаружил ошибки, остальные не смотрел.
Вот корректный вариант:
Код:
Expand Collapse Copy
// Функция закрывает последний ордер или удаляет последний отложенный
// параметр type может принимать значения OP_BUY, OP_SELL, OP_BUYSTOP,OP_SELLSTOP, OP_BUYLIMIT, OP_SELLLIMIT
// Если в ордерах не применяется Magic Number, то параметр mg можно не передавать.
bool Close_LastOrder_by_type( int type, int mg = 0)
{
   // ищем самый последний ордер
   datetime time=0;
   int ticket=-1,i;
   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderType()==type && OrderSymbol()==Symbol() && OrderMagicNumber()==mg)
         {
            if(OrderOpenTime()>time)
            {
               time=OrderOpenTime();
               ticket=OrderTicket();
            }
         }
      }
   }
   if(OrderTicket()!=ticket)OrderSelect(ticket,SELECT_BY_TICKET);
   
   if(OrderType()<=1)return(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3));
      else return(OrderDelete(OrderTicket()));
}
 

wetser

Новичок форума
Здесь буду выкладывать свои функции, которые применяю для разработки советников. Если кому нужно применяйте, задавайте вопросы. Критика приветствуется.

Jürij!!!
A esti li u was takaja funkzija kak MM (Monej- Managment)? Esli esti moschete wiloschiti?:question:
 

StatBars

Интересующийся
Код:
Expand Collapse Copy
// Функция проверяет закрылся ли ордер по стопу. Если ордер закрылся по стопу возвращает true
// в ином случае вернёт false
bool IsClosed_by_StopLoss(int type, int mn, string sym)
{
   if(FindOrder_by_type(type,mn, sym)
   || OrdersHistoryTotal()==0
   )return(false);// Если ордер ещё открыт выходим
   
   datetime order_open_time=0;
   int ticket=-1, i;
   //Находим последний ордер по указанным входным параметрам
   for( i= OrdersHistoryTotal()-1; i >= 0 ; i-- )
   {
      OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      if( OrderType()==type && OrderMagicNumber() == mn && sym==OrderSymbol() )
         if( order_open_time < OrderOpenTime() )
         {
            order_open_time = OrderOpenTime(); 
            ticket = OrderTicket();
         }
   }
   if( ticket == -1 )return(false);
   
   if( OrderTicket() != ticket )OrderSelect(ticket,SELECT_BY_TICKET);
   if( OrderClosePrice() == OrderStopLoss() )return(true);
   
   return(false);
}

//---- Ищет ордера по типу, в случае успеха возвращает true ----//
bool FindOrder_by_type(int type, int mn, string sym)
{
   for(int i= OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber() == mn && type == OrderType() && sym==OrderSymbol())
         return(true);
   }
   return(false);
}

Функция и вспомогательная к ней, проверяет закрыллся ли последний по заданным параметрам ордер по стопу. Если нужно проверять закрытие по TakeProfit то просто заменить OrderStopLoss() на OrderTakeProfit().
Для этих функций желательно ещё ввести параметр Comment ордера для более точной идентификации ордеров.
 

Alizee -Gourmandises 2001

Прохожий
Если можете,то напишите код:
Перевод в Безубыточность:
если быстрая МА выше или ниже медленной МА на N-пунктов,но не больше,чем
на N-пунктов (это Вторая настройка для N-пунктов ), то открыть ордер.
Кто-нибудь,пожалуйста разместите здесь этот код в открытом доступе.
 

vladicho

Прохожий
vladicho сказал(а):
Код:
Expand Collapse Copy
enum searchMinMaxBy { BY_MIN = 0, BY_MAX };
double MinMaxDayPrice(string symbol, searchMinMaxBy searchBy, int barSearch, int timeFrame = 0, int startFrom = 0) 
{
   double extremum = 0.0;
   switch (searchBy)
   {
      case BY_MIN: extremum = Low[iLowest(symbol, timeFrame, MODE_LOW, barSearch, 0)];
      case BY_MAX: extremum = High[iHighest(symbol, timeFrame, MODE_HIGH, barSearch, 0)];
   }
   return (extremum);          
}        
}
how about this one :)
 

Jozef

Почетный гражданин
Здеся нет самой полезной функции: что-бы ДЦ не срывал копыта советнику
 
Верх