Перейти к содержимому

Theme© by Fisana
 

Фотография
* * * * * 1 Голосов

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 91

#1 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:04

Здесь будут опубликованы полезные функции, для использования в программировании MQL4
Функции были взяты с открытых источников. Обсуждаем. Пробуем. Тестируем.

функция закрытие позиции по типу


// Функция закрывает последний ордер или удаляет последний отложенный
// параметр 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()));
}

  • Necron и 6_6gena это нравится

 
 

#2 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:05

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

//если часто применяется вызов простой скользящей средней, 
//удобнее вызывать просто 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)                         ;
}

  • 6_6gena это нравится

#3 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:09

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

//Функция поиска максимума/минимума за заданное количество баров
// 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);          
}


#4 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:16

установка 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,"http://fxgeneral.com/",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,"http://fxgeneral.com/",MG,0,Red);
      if(err<0)
         {
            Print("OrderSend()-  Ошибка OP_SELLSTOP.  op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());
            return(-1);
         }
   }
   return(0);
}


#5 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:18

проверка - есть ли отложенные ордера 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);
}


#6 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:20

функция удаления отложенных ордеров 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);
}


#7 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:27

Закрытие одной предварительно выбранной позиции

// ClosePosBySelect "Закрытие одной предварительно выбранной позиции"
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      pp=NormalizeDouble(pp, dg);
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(SoundSuccess); break;
      } else {
        err=GetLastError();
        if (UseSound) PlaySound(SoundError);
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}



#8 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:34

Закрытие определенных позиций, у которых убыток в валюте депозита
на данный момент больше чем некоторое значение


//Описание : Закрытие тех позиций, у которых убыток в валюте депозита
//превысил некоторое значение

//Параметры:
//sy - наименование инструмента ("" - любой символ,NULL - текущий символ)
//op - операция (-1 - любая позиция)
//mn - MagicNumber (-1 - любой магик)
//pr - профит/убыток

void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}



#9 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:39

Закрытие тех позиций, у которых профит в валюте депозита
превысил некоторое значение



//Закрытие тех позиций, у которых профит в валюте депозита
//превысил некоторое значение
//=========================================================================
// sy - наименование инструмента ("" - любой символ, NULL - текущий символ)
// op - операция     (-1   - любая позиция)
// mn - MagicNumber  (-1   - любой магик)
// pr - профит

void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}



#10 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:41

Закрытие позиций по рыночной цене сначала прибыльных

//           Закрытие позиций по рыночной цене сначала прибыльных
//==============================================================================
//  sy - наименование инструмента   (""   - любой символ, NULL - текущий символ)
//  op - операция                   (-1   - любая позиция)
//  mn - MagicNumber                (-1   - любой магик)

void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderCommission()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}


#11 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:45

Закрытие позиций по рыночной цене

//Закрытие позиций по рыночной цене
//==============================================================================
//  sy - наименование инструмента   (""   - любой символ, NULL - текущий символ)
//  op - операция                   (-1   - любая позиция)
//  mn - MagicNumber                (-1   - любой магик)

void ClosePositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}


#12 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:49

Закрытие одной позиции с максимальным положительным профитом в валюте депозита

//  Закрытие одной позиции с максимальным положительным профитом в валюте депозита
//================================================================================
//  sy - наименование инструмента   (""   - любой символ, NULL - текущий символ)
//  op - операция                   (-1   - любая позиция)
//  mn - MagicNumber                (-1   - любой магик)

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  }
}


#13 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:52

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

//  Возвращает расстояние в пунктах между рынком и ближайшей позицией
//====================================================================
// sy - наименование инструмента   ("" или NULL - текущий символ)
// op - торговая операция          (    -1      - любая позиция)
// mn - MagicNumber                (    -1      - любой магик)

int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}


#14 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 08:57

Возвращает флаг существования в истории позиции или ордера, закрытой (удалённого) между датами.

//  Возвращает флаг существования в истории позиции или ордера, закрытой
//  (удалённого) между датами.   
//==============================================================================
//  sy - наименование инструмента   (""   - любой символ, NULL - текущий символ)
//  op - операция                   (-1   - любая операция)
//  mn - MagicNumber                (-1   - любой магик)
//  d1 - время закрытия             ( 0   - любое время закрытия)
//  d2 - время закрытия             ( 0   - любое время закрытия)

bool ExistInHistoryCloseBetween(string sy="", int op=-1, int mn=-1,
                                datetime d1=0, datetime d2=0) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (d1<=OrderCloseTime() && (d2==0 || d2>=OrderCloseTime())) return(True);
        }
      }
    }
  }
  return(False);
}


#15 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 22 April 2010 - 09:01

Возвращает флаг существования в истории позиции или ордера, открытой (установленного) между датами.

// Возвращает флаг существования в истории позиции или ордера,
// открытой (установленного) между датами.
//=============================================================================
// sy - наименование инструмента   (""   - любой символ, NULL - текущий символ)
// op - операция                   (-1   - любая позиция)
// mn - MagicNumber                (-1   - любой магик)
// d1 - время открытия             ( 0   - любое время открытия)
// d2 - время открытия             ( 0   - любое время открытия)

bool ExistInHistoryOpenBetween(string sy="", int op=-1, int mn=-1,
                               datetime d1=0, datetime d2=0) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (d1<=OrderOpenTime() && (d2==0 || d2>=OrderOpenTime())) return(True);
        }
      }
    }
  }
  return(False);
}




Copyright © 2024 Your Company Name