Ответить
10.03.2010, 17:43
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

По умолчанию Полезные mql функции

Здесь буду выкладывать свои функции, которые применяю для разработки советников. Если кому нужно применяйте, задавайте вопросы. Критика приветствуется.
10.03.2010, 17:46
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

По умолчанию закрытие позиции по типу

Код:
//Закрывает позицю по типу, при 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);
   }
10.03.2010, 17:51
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

По умолчанию упрощенный вызов скользящей средней

Код:
//если часто применяется вызов простой скользящей средней, удобнее вызывать просто 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)                         ;
}
10.03.2010, 18:02
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

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

Код:
//Функция поиска максимума/минимума за заданное количество баров 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);          
}
10.03.2010, 18:04
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

По умолчанию установка OP_BUYSTOP или OP_SELLSTOP ордеров

Код:
//установка ордеров 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);
}
10.03.2010, 18:06
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

По умолчанию проверка - есть ли отложенные ордера BUYSTOP SELLSTOP

Код:
//проверяет есть ли стоп ордера 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);
}
10.03.2010, 18:08
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

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

Код:
//удаляет отложенные стоп ордера 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);
}
10.03.2010, 18:10
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510

По умолчанию функция трелингстоп

Код:
//функция трейлингстопа с шагом.
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);
}
10.03.2010, 18:17
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510
При использовании таких функций, основная логика советника сокращается например вот до такого кода:
Код:
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();
13.03.2010, 09:06
Аватар для StatBars
StatBars StatBars вне форума Новичок форума
Регистрация: 29.12.2009 / Адрес: Ростов-на-Дону / Сообщений: 28
Поблагодарили 5 раз(а) / Репутация: 4
  • Отправить сообщение для StatBars с помощью ICQ
Код:
//Закрывает позицю по типу, при 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);
   }
Извиняюсь что залез в Вашу тему, если Вы против могу и не появляться здесь...
Просто случайно зашёл сюда, смотрю вроде функции, полезно...
Но в первой же функции обнаружил ошибки, остальные не смотрел.
Вот корректный вариант:
Код:
// Функция закрывает последний ордер или удаляет последний отложенный
// параметр 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()));
}
12.04.2010, 10:46
Аватар для wetser
wetser wetser вне форума Новичок форума
Регистрация: 06.01.2010 / Сообщений: 24
Поблагодарили 8 раз(а) / Репутация: 6
Здесь буду выкладывать свои функции, которые применяю для разработки советников. Если кому нужно применяйте, задавайте вопросы. Критика приветствуется.
Jürij!!!
A esti li u was takaja funkzija kak MM (Monej- Managment)? Esli esti moschete wiloschiti?
25.04.2010, 12:03
Аватар для StatBars
StatBars StatBars вне форума Новичок форума
Регистрация: 29.12.2009 / Адрес: Ростов-на-Дону / Сообщений: 28
Поблагодарили 5 раз(а) / Репутация: 4
  • Отправить сообщение для StatBars с помощью ICQ
Код:
// Функция проверяет закрылся ли ордер по стопу. Если ордер закрылся по стопу возвращает 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 ордера для более точной идентификации ордеров.
02.05.2010, 21:38
Аватар для Alizee -Gourmandises 2001
Alizee -Gourmandises 2001 Alizee -Gourmandises 2001 вне форума Интересующийся
Регистрация: 02.05.2010 / Сообщений: 6
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Если можете,то напишите код:
Перевод в Безубыточность:
если быстрая МА выше или ниже медленной МА на N-пунктов,но не больше,чем
на N-пунктов (это Вторая настройка для N-пунктов ), то открыть ордер.
Кто-нибудь,пожалуйста разместите здесь этот код в открытом доступе.
21.05.2014, 12:00
Аватар для vladicho
vladicho vladicho вне форума Прохожий
Регистрация: 21.05.2014 / Сообщений: 1
Поблагодарили 0 раз(а) / Репутация: 1
Сообщение от vladicho
Код:
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
24.03.2015, 16:02
Аватар для Jozef
Jozef Jozef вне форума Почётный гражданин
Регистрация: 04.12.2010 / Сообщений: 248
Поблагодарили 372 раз(а) / Репутация: 389
Здеся нет самой полезной функции: что-бы ДЦ не срывал копыта советнику
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 13:31. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO