MQL4: полезные функции пишем сюда

Discussion in 'Индикаторы, скрипты и эксперты для МТ4' started by RickD, Jun 5, 2006.

  1. RickD

    RickD MQL4 developer

    Получить количество ордеров (рыночных либо отложенных) данного типа.

    Code:
     
    int OrdersCount(int type)
    {
      int orders = 0;
     
      int cnt = OrdersTotal();
      for (int i=0; i<cnt; i++) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
     
    	//Опционально
    	//if (OrderSymbol() != Symbol()) continue;
    	//Опционально
    	//if (OrderMagicNumber() != Magic) continue;
     
    	if (OrderType() == type) orders++;
      }
     
      return (orders);
    }
    В эксперте эту функцию можно использовать следующим образом:

    Code:
     
    int start() 
    {
      int BuyCnt = OrdersCount(OP_BUY);
      if (BuyCnt > 0) return (0);
      ..
    Закрыть все ордера:

    Code:
     
    void CloseOrders() 
    {
      int cnt = OrdersTotal();
      for (int i=cnt-1; i>=0; i--) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    
    	//По желанию
    	//if (OrderSymbol() != Symbol()) continue;
    	//По желанию
    	//if (OrderMagicNumber() != Magic) continue;
    
    	if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
    	if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
      }
    }
    Закрыть все ордера данного типа:

    Code:
     
    void CloseOrders(int type) 
    {
      int cnt = OrdersTotal();
      for (int i=cnt-1; i>=0; i--) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    
    	//По желанию
    	//if (OrderSymbol() != Symbol()) continue;
    	//По желанию
    	//if (OrderMagicNumber() != Magic) continue;
    	
    	if (OrderType() != type) continue;
    	
    	if (type == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
    	if (type == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
      }
    }
    Slippage - допустимое проскальзывание в пунктах

    Удалить все отложенные ордера данного типа:

    Code:
     
    void DeleteOrders(int type) 
    {
      int cnt = OrdersTotal();
      for (int i=cnt-1; i>=0; i--) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    	//По желанию
    	//if (OrderSymbol() != Symbol()) continue;
    	//По желанию
    	//if (OrderMagicNumber() != Magic) continue;
    	
    	if (OrderType() != type) continue;
    	
    	if (type == OP_BUYSTOP || type == OP_SELLSTOP) OrderDelete(OrderTicket());
    	if (type == OP_BUYLIMIT || type == OP_SELLLIMIT) OrderDelete(OrderTicket());	
      }
    }
     
  2. RickD

    RickD MQL4 developer

    Получить время открытия последнего ордера данного типа.
    Смотрим в открытых ордерах и в истории.
    Если не найдено ордеров, удовлетворяющих условиям поиска, возвращаем -1.

    Code:
    datetime GetLastOpenTime(int type) {
    
      datetime tm = -1;
    
      int cnt = OrdersTotal();
      for (int i=0; i<cnt; i++) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    	
    	//Опционально
    	if (OrderSymbol() != Symbol()) continue;
    	if (OrderMagicNumber() != Magic) continue;
    	
    	if (OrderType() != type) continue;
    	
    	tm = MathMax(tm, OrderOpenTime());
      }
    
      cnt = HistoryTotal();
      for (i=0; i<cnt; i++) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    
    	//Опционально
    	if (OrderSymbol() != Symbol()) continue;
    	if (OrderMagicNumber() != Magic) continue;
    	
    	if (OrderType() != type) continue;
    	
    	tm = MathMax(tm, OrderOpenTime());
      }
    
      return (tm);
    }
     
  3. RickD

    RickD MQL4 developer

    Польза от функции GetLastOpenTime такая.
    Например мы не хотим открывать лонг-ордера чаще чем раз в 2 часа.
    Тогда условие на открытие будет выглядеть так:

    Code:
     if (CurTime() - GetLastOpenTime(OP_BUY) >= 2*60*60) {
       OrderSend(Symbol(), OP_BUY, ...
     }
     
  4. RickD

    RickD MQL4 developer

    Получить дату следующего дня:

    Code:
      datetime Time0 = CurTime();
      datetime Tomorrow = Time0 + 24*60*60;
      int day = TimeDayOfYear(Tomorrow);
      int month = TimeMonth(Tomorrow);
      int year = TimeYear(Tomorrow);
     
  5. RickD

    RickD MQL4 developer

    Получить тикет последнего закрытого ордера из истории.
    Если тип ордера не указан, берется самый последний ордер любого типа.
    Если ордеров, отвечающих указанным критерию не найдено, возвращает -1.

    Code:
    int GetLastOrderHist(int type = -1) 
    {
      int ticket = -1;
      datetime dt = 0;
      int cnt = HistoryTotal();
    	
      for (int i=0; i < cnt; i++) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    
    	//Опционально
    	if (OrderSymbol() != Symbol()) continue;
    	//Опционально
    	if (OrderMagicNumber() != Magic) continue;
    	
    	if (type != -1 && OrderType() != type) continue;
    	
    	if (OrderCloseTime() > dt) {
    	  dt = OrderCloseTime();
    	  ticket = OrderTicket();
    	}
      }
      
      return (ticket);
    }
     
  6. Kara

    Kara New Member

    Функция вычисляющая стоимость одного пункта в долл. для любой валютной пары



    Code:
    double PipsPrise()
      {
       string Symb,S;
       
       Symb=Symbol();
       S=StringSubstr(Symb,3,3);
       if(S=="USD")return(MarketInfo(Symb,MODE_LOTSIZE)*Point);
       if(S=="EUR"||S=="GBP"||S=="AUD"||S=="NZD")
      	return(MarketInfo(Symb,MODE_LOTSIZE)*Point*MarketInfo(S+"USD",MODE_ASK));   
       if(S=="CHF"||S=="CAD"||S=="JPY"||S=="SEK"||S=="NOK"||S=="SGD"||S=="DKK"||S=="ZAR")
      	return(MarketInfo(Symb,MODE_LOTSIZE)*Point*(1/MarketInfo("USD"+S,MODE_ASK)));  
       return(0);
      }
     
  7. RickD

    RickD MQL4 developer

    Полезная штука. Только не любой пары, а лишь указанной. Было бы неплохо обобщить и сделать действительно для любой пары, а также акций, спота и фьючерсов.
     
  8. Kara

    Kara New Member

    Ну если в параметрах передавать символ то тогда точно для любой пары получится

    Code:
    double PipsPrise(Symb)
      {
       string S;
       
       S=StringSubstr(Symb,3,3);
       if(S=="USD")return(MarketInfo(Symb,MODE_LOTSIZE)*Point);
       if(S=="EUR"||S=="GBP"||S=="AUD"||S=="NZD")
    	  return(MarketInfo(Symb,MODE_LOTSIZE)*Point*MarketInfo(S+"USD",MODE_ASK));   
       if(S=="CHF"||S=="CAD"||S=="JPY"||S=="SEK"||S=="NOK"||S=="SGD"||S=="DKK"||S=="ZAR")
    	  return(MarketInfo(Symb,MODE_LOTSIZE)*Point*(1/MarketInfo("USD"+S,MODE_ASK)));  
       return(0);
      }

    Вызывается в основном коде соответственно так:
    Code:
    ...
     pip=PipsPrise("EURUSD");
    ...
    
    
    или
    
    ...
     pip=PipsPrise(Symbol());
    ...
     
  9. RickD

    RickD MQL4 developer

    Функция для расчета рабочего лота по следующим условиям.
    lotmin - стартовый размер лота.
    lotmax - верхнее ограничение на размер лота.
    Если последняя сделка закрылась в +, то увеличиваем лот на величину lotstep.
    Как только последняя сделка закрылась в -, возвращаемся к lotmin.
    Т.е. при наступлении серии положительных сделок мы увеличиваем нагрузку на лот.

    Будем использовать функцию GetLastOrderHist, описанную выше.

    Code:
    // --- Параметры управления капиталом ---
    extern bool uplot = true; - вкл/выкл изменение величины лота
    extern int lastprofit = 1; - принимает значения -1/1. 
    -1 - увеличение лота после минусовой сделки до первой плюсовой.
    1 - увеличение лота после плюсовой сделки до первой минусовой.
    extern double lotmin = 0.1; - начальное значение
    extern double lotmax = 0.5; - потолок
    extern double lotstep = 0.1; - приращение лота 
    
    double GetLots() {
      
      double lot = lotmin;
      if (!uplot) return (lot);
      
      int ticket = GetLastOrderHist();
      if (ticket == -1) return (lot);
      
      if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lot);
      if (OrderProfit()*lastprofit < 0) return (lot);
      
      lot = MathMin(OrderLots() + lotstep, lotmax);
      return (lot);
    }
     
  10. RickD

    RickD MQL4 developer

    Трейлинг-стоп.
    MinProfit - когда профит достигает указанное количество пунктов, трейлинг начинает работу
    TrailingStop - величина трала
    TrailingStep - шаг
    l - префикс для лонгов
    s - префикс для шортов

    Code:
    extern bool UseTrailing = true;
    extern int lMinProfit = 30;
    extern int sMinProfit = 30;
    extern int lTrailingStop = 15;
    extern int sTrailingStop = 15;
    extern int lTrailingStep = 5;
    extern int sTrailingStep = 5;
    
    if (UseTrailing) TrailingPositions();  
    
    void TrailingPositions() 
    {
      int cnt = OrdersTotal();
    
      for (int i=0; i<cnt; i++) {
    	if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    	if (OrderSymbol() != Symbol()) continue;		
    
    	if (OrderType() == OP_BUY) {
      	if (Bid-OrderOpenPrice() > lMinProfit*Point) {
    		if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) {
    	  	OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point, OrderTakeProfit(), 0, Blue);
    		}
      	}
    	}
    
    	if (OrderType() == OP_SELL) {
      	if (OrderOpenPrice()-Ask > sMinProfit*Point) {
    		if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point || OrderStopLoss() == 0) {
    	  	OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point, OrderTakeProfit(), 0, Blue);
    		}
      	}
    	}
      }
      
    }
     
  11. RickD

    RickD MQL4 developer

    2 метода - Buy и Sell. Помимо открытия позиции нормализуют цены и выводят в лог входные параметры. Возвращают номер тикета, либо -1 в случае ошибки. После открытия ордера выдерживается установленный таймаут.

    Code:
    #include <stdlib.mqh>
    #include <stderror.mqh>
    
    int SleepOk = 2000;
    int SleepErr = 6000;
    int Slippage = 3;
    
    //~~~~~
    
    int Buy(string symbol, double lot, double price, double sl, double tp, int magic, string comment="") {
      int dig = MarketInfo(symbol, MODE_DIGITS);
    
      price = NormalizeDouble(price, dig);
      sl = NormalizeDouble(sl, dig);
      tp = NormalizeDouble(tp, dig);
    	
      string _lot = DoubleToStr(lot, 1);
      string _price = DoubleToStr(price, dig);
      string _sl = DoubleToStr(sl, dig);
      string _tp = DoubleToStr(tp, dig);
    
      Print("Buy \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");
    
      int res = OrderSend(symbol, OP_BUY, lot, price, Slippage, sl, tp, comment, magic);
      if (res >= 0) {
    	Sleep(SleepOk);
    	return (res);
      } 	
       	
      int code = GetLastError();
      Print("Error opening BUY order: ", ErrorDescription(code), " (", code, ")");
      Sleep(SleepErr);
    	
      return (-1);
    }
    
    int Sell(string symbol, double lot, double price, double sl, double tp, int magic, string comment="") {
      int dig = MarketInfo(symbol, MODE_DIGITS);
    
      price = NormalizeDouble(price, dig);
      sl = NormalizeDouble(sl, dig);
      tp = NormalizeDouble(tp, dig);
      
      string _lot = DoubleToStr(lot, 1);
      string _price = DoubleToStr(price, dig);
      string _sl = DoubleToStr(sl, dig);
      string _tp = DoubleToStr(tp, dig);
    
      Print("Sell \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");
      
      int res = OrderSend(symbol, OP_SELL, lot, price, Slippage, sl, tp, comment, magic);
      if (res >= 0) {
    	Sleep(SleepOk);
    	return (res);
      } 	
       	
      int code = GetLastError();
      Print("Error opening SELL order: ", ErrorDescription(code), " (", code, ")");
      Sleep(SleepErr);
    	
      return (-1);
    }
     
  12. RickD

    RickD MQL4 developer

    Открыть позицию в заданное время.
    Код удобнее всего поместить в скрипт, который работает в бесконечном цикле. Это даст возможность открыться в нужное время, не дожидаясь прихода первого тика.

    OpenTime - время открытия.
    OpenPeriod - рабочий интервал, мин

    Code:
      extern string OpenTime = "00:00";
      extern int OpenPeriod = 10;
    
      datetime tm0 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OpenTime);
      datetime tm1 = tm0 + OpenPeriod*60;
    
      if (CurTime() < tm0 || CurTime() > tm1) return;
    
      //Открываем позицию либо ставим ордер
    Дополнительно следует использовать проверку на максимально допустимое количество открытых ордеров.
     
  13. RickD

    RickD MQL4 developer

    Эксперт, закрывающий ордера по рынку с указанным тейкпрофитом.
    TakeProfit можно ставить 1, 2, 3, ...


    Code:
    extern int TakeProfit = 2;
    extern int Slippage = 3;
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void init () {
    }
    
    void deinit() {
    }
    
    void start() {
    
      if (TakeProfit == 0) return;
    
      int cnt = OrdersTotal();
      for (int i=cnt-1; i >= 0; i--) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    	if (OrderSymbol() != Symbol()) continue;
      
    	int type = OrderType();
    	if (type == OP_BUY) {
      	if (Bid > OrderOpenPrice() + TakeProfit*Point)
    		OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);   
    	}
      
    	if (type == OP_SELL) {
      	if (Ask < OrderOpenPrice() - TakeProfit*Point) 
    		OrderClose(OrderTicket(), OrderLots(), Ask, Slippage); 
    	}
      }
    }
     
  14. RickD

    RickD MQL4 developer

    Функция возвращает длину цепочки ордеров с положительным профитом. Считаем с конца history.

    Code:
    int GetLastPositiveOrdersCount() 
    {
      int PosCnt = 0;
      int cnt = HistoryTotal();
      for (int i = cnt-1; i >=0; i--) {
    	
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    	//if (OrderSymbol() != Symbol()) continue;
    	//if (OrderMagicNumber() != Magic) continue;
    
    	  
    	int type = OrderType();
    	if (type != OP_BUY && type != OP_SELL) continue;
    	  
    	if (OrderProfit() < 0) break;
    
    	PosCnt++;
      }
    
      return (PosCnt);
    }
     
  15. RickD

    RickD MQL4 developer

    Привет.
    Приблизительно такой скрипт будет. Раз в час будет добавлять строку в файл file.csv.
    Сделан по простому - потому при перезапуске снова добавит данные за текущий час. Можно использовать глобальные переменные для запоминания последнего времени записи.

    Code:
    int Hour0 = -1; 
    
    void init () {
      Comment("");
    }
    
    void deinit() {
      Comment("");
    }
    
    void start() {
      for (;;) {
    	Comment(TimeToStr(LocalTime(),TIME_DATE|TIME_SECONDS ));
    	
    	if (Hour() != Hour0) {
    	  Hour0 = Hour();
    	  Write();
    	}
    	
    	Sleep(5000);
      }
    }
    
    void Write() 
    {  
      int hFile = FileOpen("file.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
      if (hFile == -1) {
    	Print("Cannot open csv file!");
    	return;
      }
    
      FileSeek(hFile, 0, SEEK_END);
      FileWrite(hFile, 
    	TimeToStr(LocalTime()), 
    	DoubleToStr(AccountEquity(), 2),
      );
      
      FileClose(hFile);
    	
    }
     
  16. tovaroved

    tovaroved New Member

    кррасную и синюю кнопки нажимаю всегда вручную, но скриптов всяких много пишу.... в основном, работа с графическими объектами....

    мои любимые функции:
    Code:
    /////////////////////////////////////////////////////////
    datetime bar2time(int b){int t; 
      if(b<0) t=Time[0]-(b)*TFsec; 
      else if(b>(Bars-1)) t=Time[Bars-1]-(b-Bars+1)*TFsec; 
      else t=Time[b];  
      return(t);
    }
    /////////////////////////////////////////////////////////
    int time2bar(datetime t){int b,t0=Time[0]; 
      if(t>t0) b=(t0-t)/TFsec; 
      else if(t<Time[Bars-2]) b=(Bars-2)+(Time[Bars-2]-t)/TFsec; 
      else b=iBarShift(0,0,t); return(b);
    }
    (где-то в инициализации должно быть)
    Code:
    TFsec=Period()*60;
     
  17. tovaroved

    tovaroved New Member

    дальше...
    наш ответ дебильной системе описания фиб в объектах:
    Code:
    #define _W EMPTY_VALUE
    void OS(string nameO, int iprop_id, double k){ObjectSet(nameO,iprop_id,k);}
    void Fibz(string o, double a0=_W,double a1=_W,double a2=_W,double a3=_W,double a4=_W,double a5=_W,double a6=_W,double a7=_W,double a8=_W,double a9=_W,
     double a10=_W,double a11=_W,double a12=_W,double a13=_W,double a14=_W,double a15=_W,double a16=_W,double a17=_W,double a18=_W,double a19=_W){
    OS(o, OBJPROP_FIBOLEVELS, 25);int c=-1;double a=
    a0; if(a!=_W){c++; OS(o,c+210,a);}a=
    a1; if(a!=_W){c++; OS(o,c+210,a);}a=
    a2; if(a!=_W){c++; OS(o,c+210,a);}a=
    a3; if(a!=_W){c++; OS(o,c+210,a);}a=
    a4; if(a!=_W){c++; OS(o,c+210,a);}a=
    a5; if(a!=_W){c++; OS(o,c+210,a);}a=
    a6; if(a!=_W){c++; OS(o,c+210,a);}a=
    a7; if(a!=_W){c++; OS(o,c+210,a);}a=
    a8; if(a!=_W){c++; OS(o,c+210,a);}a=
    a9; if(a!=_W){c++; OS(o,c+210,a);}a=
    a10; if(a!=_W){c++; OS(o,c+210,a);}a=
    a11; if(a!=_W){c++; OS(o,c+210,a);}a=
    a12; if(a!=_W){c++; OS(o,c+210,a);}a=
    a13; if(a!=_W){c++; OS(o,c+210,a);}a=
    a14; if(a!=_W){c++; OS(o,c+210,a);}a=
    a15; if(a!=_W){c++; OS(o,c+210,a);}a=
    a16; if(a!=_W){c++; OS(o,c+210,a);}a=
    a17; if(a!=_W){c++; OS(o,c+210,a);}a=
    a18; if(a!=_W){c++; OS(o,c+210,a);}a=
    a19; if(a!=_W){c++; OS(o,c+210,a);}
    OS(o, OBJPROP_FIBOLEVELS, c+1);
    }/////////////////////////////////////////////////////////// */
    void DFibz(string o, string a0="_",string a1="_",string a2="_",string a3="_",string a4="_",string a5="_",string a6="_",string a7="_",string a8="_",string a9="_",
     string a10="_",string a11="_",string a12="_",string a13="_",string a14="_",string a15="_",string a16="_",string a17="_",string a18="_",string a19="_"){
    int c=-1;string a=
    a0; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a1; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a2; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a3; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a4; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a5; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a6; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a7; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a8; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a9; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a10; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a11; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a12; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a13; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a14; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a15; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a16; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a17; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a18; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}a=
    a19; if(a!="_"){c++; ObjectSetFiboDescription(o,c,a);}
    }///////////////////////////////////////////////////////////
    в итоге Веер Ганна в Metatrader 4 становится реальностью с помощью всего лишь трёх строчек кода!
    Code:
    void fenik(string c, int b1, double p1, int b2, double p2){  
      ObjectCreate(c,OBJ_FIBOFAN,0,bar2time(b1),p1,bar2time(b2),p2);  
      Fibz(c, 0,	0.5,  -1,	  0.75,  -3,	0.875,  -7,	  0.9375, -15,	 0.96875, -31);
      FibzD(c, 1, "1/2",   2,	 "1/4",   4,	"1/8",   8,	  "1/16",  16,	  "1/32",  32);
    }
     
  18. RickD

    RickD MQL4 developer

    Как определить предыдущий ордер SELL или BUY

    Можно так:

    Code:
    datetime LastBuyTm = GetLastOrderOpenTime(OP_BUY);
    datetime LastSellTm = GetLastOrderOpenTime(OP_SELL);
    // LastBuyTm > LastSellTm: последним был BUY ордер
    // LastSellTm > LastBuyTm: последним был SELL ордер
     
    datetime GetLastOrderOpenTime(int type) 
    {
      datetime tm = -1;
     
      int cnt = OrdersTotal();
      for (int i=0; i<cnt; i++) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    	
    	//Опционально
    	if (OrderSymbol() != Symbol()) continue;
    	if (OrderMagicNumber() != Magic) continue;
    	
    	if (OrderType() != type) continue;
    	
    	tm = MathMax(tm, OrderOpenTime());
      }
      
      cnt = HistoryTotal();
      for (i=0; i<cnt; i++) {
    	if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
       
    	//Опционально
    	if (OrderSymbol() != Symbol()) continue;
    	if (OrderMagicNumber() != Magic) continue;
    	
    	if (OrderType() != type) continue;
    	
    	tm = MathMax(tm, OrderOpenTime());
      }
     
      return (tm);
    }
     
  19. Викуся

    Викуся Штучка

    А по-моему Point нужно поменять на MarketInfo(Symb,MODE_POINT) .

    Тогда совсем правильно будет.

    !!! За скрипты большое спасибо !!!
     
  20. RickD

    RickD MQL4 developer

    Способ программного закрытия терминала.
    Как посоветовал многоуважаемый Dedushka - это как раз то, что нужно при MarginCall.

    Code:
    #include <WinUser32.mqh>
    
    int start() {
      int hwnd = WindowHandle(Symbol(), Period());
      int hwnd_parent = 0;
    
      while(!IsStopped()) {
    	hwnd = GetParent(hwnd);
    	if (hwnd == 0) break;
    	hwnd_parent = hwnd;
      }
    
      if (hwnd_parent != 0)
    	PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
    
      return (0);
    }
     

Share This Page