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

 
Попробуем сдвинуть тележку с мертвой точки.
Первый вариант:

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);
}

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

Попытка благородная, конечно... я тоже когда-то пробовал.
Но тот, кто захочет качества, сделает сам (или закажет за деньги), а остальным это не поможет.
 
А вот тут сразу попутно вопрос. Когда один из советников завис в Слипе, как для других в это время откликается IsTradeAllowed( )? Если истинно, то надо вторично запрашивать на торговлю, а если ложь, то может создасться ситуация, когда не дашь другим торговать.
 
Типа, мои три рубля в общую копилку.
//+------------------------------------------------------------------+
//|                                               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()));
}
//+------------------------------------------------------------------+
 
KimIV,

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

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

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

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

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

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

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

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

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

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

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

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