Скачать MetaTrader 5

Создаем эталон по работе с ордерами

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114299
Forex Trader  
Попробуем сдвинуть тележку с мертвой точки.
Первый вариант:

extern int SleepOk = 2000;
extern int SleepErr = 6000;

string err = "";

int Buy(string symbol, double lot, double price, double sl, double tp, int magic, string comment) {
  double bid = MarketInfo(symbol, MODE_BID);
  double ask = MarketInfo(symbol, MODE_ASK);
  double point = MarketInfo(symbol, MODE_POINT);
  double lev = MarketInfo(symbol, MODE_STOPLEVEL)*point;
  int dig = MarketInfo(symbol, MODE_DIGITS);
  
  if (sl > 0 && sl >= price-lev) {
    err = "Buy: Invalid SL. " + 
      "Price= " + DoubleToStr(price, dig) + ". " +
      "SL= " + DoubleToStr(sl, dig) + ".";
    return(-1);
  }

  if (tp > 0 && tp <= price+lev) {
    err = "Buy: Invalid TP. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "TP= " + DoubleToStr(tp, dig) + ".";
    return(-1);
  }

  int res = -1;
  while (res < 0) {
    RefreshRates();
    res = OrderSend(symbol, OP_BUY, lot, price, Slippage, sl, tp, comment, magic);
   	if (res < 0) {
   	  int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	    case ERR_NOT_ENOUGH_MONEY: break;
   	  }
   	  
   	  Print("Error opening BUY order: ", ErrorDescription(code));
			Sleep(SleepErr);
		}
	}
	
	Sleep(SleepOk);
	return(res);
}

int Sell(string symbol, double lot, double price, double sl, double tp, int magic, string comment) {
  double bid = MarketInfo(symbol, MODE_BID);
  double ask = MarketInfo(symbol, MODE_ASK);
  double point = MarketInfo(symbol, MODE_POINT);
  double lev = MarketInfo(symbol, MODE_STOPLEVEL)*point;
  int dig = MarketInfo(symbol, MODE_DIGITS);

  if (sl > 0 && sl <= price+lev) {
    err = "Sell: Invalid SL. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "SL= " + DoubleToStr(sl, dig) + ".";
    return(-1);
  }

  if (tp > 0 && tp >= price-lev) {
    err = "Sell: Invalid TP. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "TP= " + DoubleToStr(tp, dig) + ".";
    return(-1);
  }

  int res = -1;
  while (res < 0) {
    RefreshRates();
    res = OrderSend(symbol, OP_SELL, lot, price, Slippage, sl, tp, comment, magic);
   	if (res < 0) {
   	  int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	    case ERR_NOT_ENOUGH_MONEY: break;
   	  }
   	     	
   	  Print("Error opening SELL order: ", ErrorDescription(code));
      Sleep(SleepErr);
    }
  }
	
  Sleep(SleepOk);
  return(res);
}

int SetBuyStop(string symbol, double lot, double price, double sl, double tp, int magic, string comment) {
  double bid = MarketInfo(symbol, MODE_BID);
  double ask = MarketInfo(symbol, MODE_ASK);
  double point = MarketInfo(symbol, MODE_POINT);
  double lev = MarketInfo(symbol, MODE_STOPLEVEL)*point;
  int dig = MarketInfo(symbol, MODE_DIGITS);
  
  if (price <= ask+lev) {
    err = "SetBuyStop: Invalid Price. " + 
      "Price= " + DoubleToStr(price, dig) + ". " +
      "Ask= " + DoubleToStr(ask, dig) + ".";
    return(-1);
  }

  if (sl > 0 && sl >= price-lev) {
    err = "SetBuyStop: Invalid SL. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "SL= " + DoubleToStr(sl, dig) + ".";
    return(-1);
  }

  if (tp > 0 && tp <= price+lev) {
    err = "SetBuyStop: Invalid TP. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "TP= " + DoubleToStr(tp, dig) + ".";
    return(-1);
  }

  int res = -1;
  while (res < 0) {
    RefreshRates();
    res = OrderSend(symbol, OP_BUYSTOP, lot, price, Slippage, sl, tp, comment, magic);
   	if (res < 0) {
   	  int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	  }
   	
   	  Print("Error setting BUYSTOP order: ", ErrorDescription(code));
			Sleep(SleepErr);
		}
	}
	
	Sleep(SleepOk);
	return(res);
}

int SetSellStop(string symbol, double lot, double price, double sl, double tp, int magic, string comment) {
  double bid = MarketInfo(symbol, MODE_BID);
  double ask = MarketInfo(symbol, MODE_ASK);
  double point = MarketInfo(symbol, MODE_POINT);
  double lev = MarketInfo(symbol, MODE_STOPLEVEL)*point;
  int dig = MarketInfo(symbol, MODE_DIGITS);
  
  if (price >= bid-lev) {
    err = "SetSellStop: Invalid Price. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "Bid= " + DoubleToStr(bid, dig) + ".";
    return(-1);
  }

  if (sl > 0 && sl <= price+lev) {
    err = "SetSellStop: Invalid SL. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "SL= " + DoubleToStr(sl, dig) + ".";
    return(-1);
  }

  if (tp > 0 && tp >= price-lev) {
    err = "SetSellStop: Invalid TP. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "TP= " + DoubleToStr(tp, dig) + ".";
    return(-1);
  }
  
  int res = -1;
  while (res < 0) {
    RefreshRates();
    res = OrderSend(symbol, OP_SELLSTOP, lot, price, Slippage, sl, tp, comment, magic);
   	if (res < 0) {
   	  int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	  }
   	
   	  Print("Error setting SELLSTOP order: ", ErrorDescription(code));
			Sleep(SleepErr);
		}
	}
	
	Sleep(SleepOk);
	return(res);
}

int SetBuyLimit(string symbol, double lot, double price, double sl, double tp, int magic, string comment) {
  double bid = MarketInfo(symbol, MODE_BID);
  double ask = MarketInfo(symbol, MODE_ASK);
  double point = MarketInfo(symbol, MODE_POINT);
  double lev = MarketInfo(symbol, MODE_STOPLEVEL)*point;
  int dig = MarketInfo(symbol, MODE_DIGITS);

  if (price >= ask-lev) {
    err = "SetBuyLimit: Invalid Price. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "Ask= " + DoubleToStr(ask, dig) + ".";
    return(-1);
  }

  if (sl > 0 && sl >= price-lev) {
    err = "SetBuyLimit: Invalid SL. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "SL= " + DoubleToStr(sl, dig) + ".";
    return(-1);
  }

  if (tp > 0 && tp <= price+lev) {
    err = "SetBuyLimit: Invalid TP. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "TP= " + DoubleToStr(tp, dig) + ".";
    return(-1);
  }

  int res = -1;
  while (res < 0) {
    RefreshRates();
    res = OrderSend(symbol, OP_BUYLIMIT, lot, price, Slippage, sl, tp, comment, magic);
    if (res < 0) {
      int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	  }
    
      Print("Error setting BUYLIMIT order: ", ErrorDescription(code));
      Sleep(SleepErr);
    }
  }
	
  Sleep(SleepOk);
  return(res);
}

int SetSellLimit(string symbol, double lot, double price, double sl, double tp, int magic, string comment) {
  double bid = MarketInfo(symbol, MODE_BID);
  double ask = MarketInfo(symbol, MODE_ASK);
  double point = MarketInfo(symbol, MODE_POINT);
  double lev = MarketInfo(symbol, MODE_STOPLEVEL)*point;
  int dig = MarketInfo(symbol, MODE_DIGITS);

  if (price <= bid+lev) {
    err = "SetSellLimit: Invalid Price. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "Bid= " + DoubleToStr(bid, dig) + ".";
    return(-1);
  }

  if (sl > 0 && sl <= price+lev) {
    err = "SetSellLimit: Invalid SL. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "SL= " + DoubleToStr(sl, dig) + ".";
    return(-1);
  }

  if (tp > 0 && tp >= price-lev) {
    err = "SetSellLimit: Invalid TP. " +
      "Price= " + DoubleToStr(price, dig) + ". " +
      "TP= " + DoubleToStr(tp, dig) + ".";
    return(-1);
  }

  int res = -1;
  while (res < 0) {
    RefreshRates();
    res = OrderSend(symbol, OP_SELLLIMIT, lot, price, Slippage, sl, tp, comment, magic);
    if (res < 0) {
      int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	  }
    
      Print("Error setting SELLLIMIT order: ", ErrorDescription(code));
      Sleep(SleepErr);
    }
  }
	
  Sleep(SleepOk);
  return(res);
}

int ModifyOrder(int ticket, double price, double sl, double tp) {
  OrderSelect(ticket, SELECT_BY_TICKET);
  
  double bid = MarketInfo(OrderSymbol(), MODE_BID);
  double ask = MarketInfo(OrderSymbol(), MODE_ASK);
  double point = MarketInfo(OrderSymbol(), MODE_POINT);
  double lev = MarketInfo(OrderSymbol(), MODE_STOPLEVEL)*point;
  int dig = MarketInfo(OrderSymbol(), MODE_DIGITS);
      
  int type = OrderType();

  if (type == OP_BUY) {
    if (sl > 0 && sl >= bid-lev) {
      err = "ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ";
      return(-1);
    }

    if (tp > 0 && tp <= bid+lev) {
      err = "ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ";
      return(-1);
    }
  }
  
  if (type == OP_BUYLIMIT) {
    if (price >= ask-lev) {
      err = "ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". ";
      return(-1);
    }
    
    if (sl > 0 && sl >= price-lev) {
      err = "ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ";
      return(-1);
    }

    if (tp > 0 && tp <= price+lev) {
      err = "ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ";
      return(-1);
    }
  }

  if (type == OP_BUYSTOP) {
    if (price <= ask+lev) {
      err = "ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". ";
      return(-1);
    }
    
    if (sl > 0 && sl >= price-lev) {
      err = "ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ";
      return(-1);
    }

    if (tp > 0 && tp <= price+lev) {
      err = "ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ";
      return(-1);
    }
  }
  
  if (type == OP_SELL) {
    if (sl > 0 && sl <= ask+lev) {
      err = "ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ";
      return(-1);
    }

    if (tp > 0 && tp >= ask-lev) {
      err = "ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ";
      return(-1);
    }  
  }
  
  if (type == OP_SELLLIMIT) {
    if (price <= bid+lev) {
      err = "ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". ";
      return(-1);
    }
    
    if (sl > 0 && sl <= price+lev) {
      err = "ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ";
      return(-1);
    }

    if (tp > 0 && tp >= price-lev) {
      err = "ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ";
      return(-1);
    }
  }

  if (type == OP_SELLSTOP) {
    if (price >= bid-lev) {
      err = "ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". ";
      return(-1);
    }
    
    if (sl > 0 && sl <= price+lev) {
      err = "ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ";
      return(-1);
    }

    if (tp > 0 && tp >= price-lev) {
      err = "ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ";
      return(-1);
    }    
  }

  bool res = false;
  while (!res) {
    RefreshRates();
    res = OrderModify(ticket, price, sl, tp, 0);
    if (!res) {
      int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_STOPS: break;
   	  }
    
      Print("OrderModify failed: ", ErrorDescription(code));
      Sleep(SleepErr);
    }
  }

  Sleep(SleepOk);
  return(0);
}

int CloseOrder(int ticket, double lot, double price) {
  bool res = false;
  while (!res) {
    RefreshRates();
    res = OrderClose(ticket, lot, price, Slippage);
    if (!res) {
      int code = GetLastError();
   	  switch (code) {
   	    case ERR_INVALID_PRICE: break;
   	    case ERR_INVALID_TRADE_VOLUME: break;
   	  }
    
      Print("CloseOrder failed: ", ErrorDescription(code));
      Sleep(SleepErr);
    }
  }

  Sleep(SleepOk);
  return(0);
}

int DeleteOrder(int ticket) {
  bool res = false;
  while (!res) {
    RefreshRates();
    res = OrderDelete(ticket);
    if (!res) {
      Print("DeleteOrder failed: ", ErrorDescription(GetLastError()));
		  Sleep(SleepErr);
    }
  }

  Sleep(SleepOk);
  return(0);
}

Forex Trader
114299
Forex Trader  
не сдвинется тележка...
потому что это не тележка, а ТЕЛЕГА. К тому же на ручнике стоИт...

Попытка благородная, конечно... я тоже когда-то пробовал.
Но тот, кто захочет качества, сделает сам (или закажет за деньги), а остальным это не поможет.
Forex Trader
114299
Forex Trader  
А вот тут сразу попутно вопрос. Когда один из советников завис в Слипе, как для других в это время откликается IsTradeAllowed( )? Если истинно, то надо вторично запрашивать на торговлю, а если ложь, то может создасться ситуация, когда не дашь другим торговать.
Forex Trader
114299
Forex Trader  
Типа, мои три рубля в общую копилку.
//+------------------------------------------------------------------+
//|                                               b-TradeForReal.mqh |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 01.12.2005 v.0.0. Библиотека торговых функций для реала          |
//|   CloseAllPositions()  - Закрытие всех позиций по рыночной цене  |
//|   ExistPosition()      - Возвращает флаг существования позиции   |
//|   ModifyStopLoss()     - Перенос уровня StopLoss                 |
//|   ModifyTakeProfit()   - Перенос уровня TakeProfit               |
//|   SetOrder()           - Установка ордера или открытие позиции   |
//|   GetCommentForOrder() - Возвращает комментарий для ордера       |
//+------------------------------------------------------------------+

//+------ Необходимые глобальные переменные --------------------------
//int    NumberOfTry     = 9;  // Количество попыток
//int    PauseAfterError = 45; // Пауза после ошибки в секундах
//string Name_Expert     = "";
//bool   UseSound        = False;
//string NameFileSound   = "expert.wav";


//+------------------------------------------------------------------+
//| Закрытие всех позиций по рыночной цене                           |
//+------------------------------------------------------------------+
void CloseAllPositions() {
  bool fc;
  int  err, it;

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        fc=False;
        for (it=0; it<NumberOfTry; it++) {
          while (!IsTradeAllowed()) Sleep(5000);
          if (OrderType()==OP_BUY) {
            fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
            if (fc) {
              if (UseSound) PlaySound(NameFileSound); break;
            } else {
              err=GetLastError();
              Print("Error(",err,") closing order: ",ErrorDescription(err),", try ",it);
              Sleep(1000*PauseAfterError);
            }
          }
          if (OrderType()==OP_SELL) {
            fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
            if (fc) {
              if (UseSound) PlaySound(NameFileSound); break;
            } else {
              err=GetLastError();
              Print("Error(",err,") closing order: ",ErrorDescription(err),", try ",it);
              Sleep(1000*PauseAfterError);
            }
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
bool ExistPosition() {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStop  - уровень StopLoss                                     |
//|   lcColor - цвет                                                 |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStop, color lcColor) {
  bool   fm;
  double ldOpen=OrderOpenPrice();
  double ldTake=OrderTakeProfit();
  int    err, it;

  for (it=1; it<=NumberOfTry; it++) {
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify);
    if (fm) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      Print("Error(",err,") modifying StopLoss: ",ErrorDescription(err),", try ",it);
      Sleep(1000*PauseAfterError);
    }
  }
}

//+------------------------------------------------------------------+
//| Перенос уровня TakeProfit                                        |
//| Параметры:                                                       |
//|   ldTake  - уровень TakeProfit                                   |
//|   lcColor - цвет                                                 |
//+------------------------------------------------------------------+
void ModifyTakeProfit(double ldTake, color lcColor) {
  bool   fm;
  double ldOpen=OrderOpenPrice();
  double ldStop=OrderStopLoss();
  int    err, it;

  for (it=1; it<=NumberOfTry; it++) {
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify);
    if (fm) {
      if (fm && UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      Print("Error(",err,") modifying TakeProfit: ",ErrorDescription(err),", try ",it);
      Sleep(1000*PauseAfterError);
    }
  }
}

//+------------------------------------------------------------------+
//| Установка ордера или открытие позиции                            |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake) {
  color  clOpen;
  int    err, it, ticket;
  string lsComm=GetCommentForOrder();

  if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=0; it<NumberOfTry; it++) {
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      Print("Error(",err,") opening order: ",ErrorDescription(err),", try ",it);
      Sleep(1000*PauseAfterError);
    }
  }
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert+" "+GetNameTF(Period()));
}
//+------------------------------------------------------------------+
Forex Trader
114299
Forex Trader  
KimIV,

можно ли немного комментариев, как это работает?
Сначала исполняется OrderSend(), потом советник затряет на неопредлённое время (пока ф-ия не вернёт какое-то значение), потом это значение присваивается переменной ticket. Так?
Меня интересует развитие событий в период застревания. Мы просто тупо ждём? И нет возможности стронуться с места? Такое свойство ф-ии OrderSend()?
    ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen);
Forex Trader
114299
Forex Trader  
to SK
Может быть Вы имели в виду застревание здесь
while (!IsTradeAllowed()) Sleep(5000);

В других местах больше ничего и нигде застрять не может. А в вышеуказанном цикле у меня пока ни разу не застревало. Застрянет, придумаю что-нибудь. Например, что-нить типа этого
for (it=0; it<NumberOfTry; it++)
Forex Trader
114299
Forex Trader  
KimIV,
Спасибо за ответ.

У меня пока не столько опыта в MQL4, сколько мне хотелось бы, поэтому я и спрашиваю.
Говоря "застряёт" я имел ввиду уточнить подробности работы кода по шагам.

Как будет исполняться эта строка кода?
1. Выполнится ф-ия OrderSend(), т.е сформируется и будет отправлен на сервер управляющий сигнал на открытие ордера.

2. Советник попытается выполнить оператор присваивания ticket=OrderSend(...).
По моим представлениям, не тут-то было, поскольку OrderSend() ещё (по крайней мере некоторое конечное время) не получил своё значение, каковое значение (опять же по мои представлениям) он может быть когда-нибудь получит, если сервер вернёт ему ответ некоторого содержания.

3. И только теперь может быть исполнен оператор присваивания.

Прошу, если Вы знаете и понимаете такие подробности, проясните мне этот вопрос.
Что происходит с советником в период, когда он уже отправил сигнал на сервер, но ещё не получил никакого ответа? Правильно ли полагать, что он "застрял", т.е. ждёт ответа..?

(и если не против, можно на "ты")
Forex Trader
114299
Forex Trader  
Ф-ция OrderSend будет "висеть", пока сервер не вернёт какой-нибудь ответ (или терминал сам не забракует заявку - например, стопы близко). Т.е. эта строка может выполняться сколько угодно долго (насколько я предствляю).
После того, как ф-ция что-нибудь вернёт, и произойдёт присваивание ;)
Forex Trader
114299
Forex Trader  
Я думаю так же, как komposter, хотя специальных экспериментов не проводил. 100%-ной уверенности нет, как и потребности выяснять эти подробности.
Forex Trader
114299
Forex Trader  
komposter,
спасибо!:) Оч. хорошо.

А теперь: Что можно сказать о времени начала выполнения оператора, следующего за OrderSend() (в данном случае а=1), если OrderSend() выполняется без присваивания? Он тоже будет "ждать" отклик сервера или ждать не будет, а сразу исполнится?

OrderSend (...);
а=1;
Forex Trader
114299
Forex Trader  
KimIV,
как и потребности выяснять эти подробности

В твоём коде, пожалуй, нет.

У меня такая потребность есть. Мой скрипт будет управлять несколькими ордерами одновременно, я бы хотел написать корректный код, кот. давал бы возможность высвободить время для управления другими ордерами( например, исполнить подтяжку), не дожидаясь исполнения текущего открытия.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий