Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 238

 
beginner:

Pouvez-vous suggérer la chose suivante, il y a N EAs sur le compte, qui sous certaines conditions peuvent tous ouvrir un ordre en même temps, chacun d'entre eux ne vérifie pas plus d'un ordre sur le compte, mais parfois je me retrouve avec N ordres, que puis-je faire ?


Contactez-les, ils devineront probablement la raison et proposeront à distance une solution ;)
 

Bonjour, je voudrais à nouveau poser une question sur le placement d'un stop sur le dernier ordre.

Je tiens à préciser que dans le testeur, il arrive qu'un stop ne soit pas placé sur le dernier ordre.

Cela ne s'est pas produit jusqu'à présent sur les tests avant. Mais comme on dit, pourquoi attendre ?)

Code

//+-------------------------------------------------------------------------------------+
//|                        Управление StopLoss, TakeProfit                              |
//+-------------------------------------------------------------------------------------+
bool ProfitManagement()
{
double StopLossBuy = BuyAP+Profit*Point;                             //Вычисляем StopLoss
double StopLossSell = SellAP-Profit*Point;
RefreshRates();
for(int good = OrdersTotal()-1; good >= 0; good --)   // Выбираем со всего масива ордеров
 {
 if(OrderSelect (good, SELECT_BY_POS, MODE_TRADES))             
 if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)   //Выбирам ордера експерта
  { 
//-------------------------Order Buy-----------------------------------------------------  
if (BuyCount >1)                                           //Если открыти длинные позиции
 if (BuyAP < Bid)                                                //Если  мы идем по рынку  
 if (MathAbs(OrderStopLoss() - StopLossBuy) >= Tick)           // Профит не равен нужному
 if (Bid - StopLossBuy > (PipStepProfit*0.5)*Point)   // Если стоп дальше чем 0,5 пипстеп
 if (Bid - StopLossBuy > DedZone)                    // Уровень достаточно удален от цены
 if (WaitForTradeContext())                                // Свободен ли торговый поток?
 if (OrderType() == OP_BUY)                                        // Выбираем ордера Buy
 if (!OrderModify(OrderTicket(), 0, NP(StopLossBuy), 0, 0, Lime))    // Изменяем StopLoss
  {
 Alert (Symbol()," Хрень со стопами! ",   GetLastError());
 return(false);
  }
//-------------------------Окончание блока-----------------------------------------------

// далее по логике в таком же духе
 
beginner:

Pouvez-vous suggérer la chose suivante, il y a N EAs sur le compte, qui sous certaines conditions peuvent tous ouvrir un ordre en même temps, chacun d'entre eux ne vérifie pas plus d'un ordre sur le compte, mais parfois je me retrouve avec N ordres, que puis-je faire ?


lire les articles

Pause entre les transactions

Erreur 146 ("Trade flow busy") et comment y rem édier


 
 
artmedia70:

Êtes-vous sûr que cette partie du code est la source du problème ? D'après ce que vous avez montré, il est difficile de tirer des conclusions - il y a beaucoup de variables inconnues et vous ne pouvez pas voir l'ouverture elle-même.

Pour trouver la raison vous-même, imprimez ou affichez les valeurs des variables avec des commentaires. Vous pourrez alors voir leurs valeurs à tout moment.



Ceci est basé sur le conseiller expert eOpenByTime de M. Kim. J'ai également ajouté un stop suiveur, fermé à la fin de la semaine et ouvert à un certain jour de la semaine. Sous cette forme, le conseiller expert fonctionne comme il se doit.

L'ouverture du marché se fait de la manière suivante, j'ai ajouté seulement le jour d'une semaine d'ouverture du marché mais il n'y a rien à redire ici.

  if (DayOfWeek()==DayOfWeekOpen
  && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)
  && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration)
  {
    if (!ExistPositions("", Sell, MagicNumber)) {
      double sl, tp;
      if (Sell) {
        if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
        if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      } else {
        if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
        if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      }
      OpenPosition("", Sell, Lots, sl, tp, MagicNumber);
    }
  }

Pour être honnête, je ne comprends pas bien pourquoi TimeCurrent est comparé à TimeCurrent + TimeTradeOpen où TimeTradeOpen est un paramètre externe du type TimeTradeOpen = "19:51". (C'est en fait le temps d'ouverture de poste dont nous avons besoin.) Je ne comprends pas non plus pourquoi cette comparaison fonctionne. La durée est le temps pendant lequel le conseiller expert va essayer d'ouvrir une position.

Par analogie, j'ai ajouté la clôture d'une position le vendredi.

if (DayOfWeek()==DayOfWeekClose
  && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)
   && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)+Duration)
{  if (OrdersTotal()>0)
   {  for (int i=OrdersTotal()-1; i>=0; i--)
      {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {  
            if (OrderType()==OP_BUY)
            {  RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Bid,1000);
               return(0);
            }
            if (OrderType()==OP_SELL)
            {  RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Ask,1000);
               return(0);
            }
         }
}  }  }

Jusqu'à présent, tout fonctionnait.

Puis j'ai voulu ajouter une condition qui regarde un chandelier à une heure donnée et un jour donné de la semaine, si le chandelier est haussier, alors on vend, s'il est baissier, alors on achète.

De la même manière, j'ai copié ces 3 lignes, qui ont fonctionné auparavant, mais maintenant, pour une raison quelconque, elles ne veulent plus.

if (DayOfWeek()==DayOfWeekIf
 && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)
 && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)+Duration)
   {
    if  (iClose("XAUUSD",PERIOD_H1,0)-iOpen("XAUUSD",PERIOD_H1,0)>=0)
    Sell = true;
    if  (iOpen("XAUUSD",PERIOD_H1,0)-iClose("XAUUSD",PERIOD_H1,0)>0)
    Sell =false;
   }

Ensuite, le code pour l'ouverture de la position suit. TimeTradeIf a un format similaire TimeTradeIf = "19:51" et est également défini par des paramètres externes.

Le code entier est assez long, avez-vous besoin d'insérer ?

 
Limita:

Bonjour, je voudrais à nouveau poser une question sur le placement d'un stop sur le dernier ordre.

Je tiens à préciser que dans le testeur, il arrive qu'un stop ne soit pas placé sur le dernier ordre.

Cela ne s'est pas produit jusqu'à présent sur les tests avant. Mais comme on dit, pourquoi attendre ?)

Code


J'ai trouvé le problème. Le code est OK. C'est l'écrivain qui demande l'impossible ;))
 
Antonius:


Il est basé sur le conseiller expert eOpenByTime de l'estimé M. Kim. J'ai également ajouté un stop suiveur, fermé à la fin de la semaine et ouvert à un certain jour de la semaine. Sous cette forme, l'EA fonctionne comme il se doit.

L'ouverture du marché est effectuée de la manière suivante, seul le jour de la semaine de l'ouverture du marché est ajouté par moi mais il n'y a pas de place pour l'erreur ici.

Pour être honnête, je ne comprends pas bien pourquoi TimeCurrent est comparé à TimeCurrent + TimeTradeOpen, où TimeTradeOpen est un paramètre externe du type TimeTradeOpen = "19:51". (C'est en fait le temps d'ouverture de poste dont nous avons besoin.) Je ne comprends pas non plus pourquoi cette comparaison fonctionne. La durée est le temps pendant lequel le Conseiller Expert va essayer d'ouvrir une position.

Par analogie, j'ai ajouté la clôture d'une position le vendredi.

Jusqu'à présent, tout fonctionnait.

Puis j'ai voulu ajouter une condition qui regarde un chandelier à une heure donnée et un jour donné de la semaine, si le chandelier est haussier, alors on vend, s'il est baissier, alors on achète.

De la même manière, j'ai copié ces 3 lignes, qui ont fonctionné auparavant, mais maintenant, pour une raison quelconque, elles ne veulent plus.

Ensuite, le code pour l'ouverture de la position suit. TimeTradeIf a un format similaire TimeTradeIf = "19:51" et est également défini par des paramètres externes.

Le code entier est assez long, dois-je le coller ?

Pour être honnête, j'ai déjà oublié quel est le problème. Dans cette section de code, je vois que seules les positions courtes sont vérifiées et que l'ouverture des positions courtes est également spécifiée :

if (!ExistPositions("", Sell, MagicNumber)) {            // вместо Sell должно быть OP_SELL или 1
   double sl, tp;
   if (Sell) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      } 
   else {                                                // Это расчёт для OP_BUY - зачем он тут?
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      }
   OpenPosition("", Sell, Lots, sl, tp, MagicNumber);    // вместо Sell должно быть OP_SELL или 1
   }                                                     // ну и, если нужен Buy, то OP_BUY или 0
 
artmedia70:

Pour être honnête, j'ai oublié quel est le problème. Dans cette section de code, je vois que seules les positions courtes sont vérifiées et que seules les positions courtes sont ouvertes :


La variable Sell est externe et contient true ou false, 1 ou 0, respectivement,

extern bool   Sell       = False;      // True-Sell, False-Buy

Celle de Kim est eOpenByTime.

La logique, l'algorithme des actions, est défectueux.

S'il veut bien laisser tomber la fonction start() et les variables, ce qu'elles portent, alors nous pourrons proposer quelque chose.

 
r772ra:

Artem, c'est correct, la variable Sell est externe et porte la valeur true ou false, 1 ou 0 respectivement,

J'ai regardé celui de Kim, eOpenByTime.

La logique, l'algorithme des actions, est défectueux.

S'il voulait bien montrer la fonction start() et les variables, ce qu'elles portent, alors nous pourrions suggérer quelque chose.





L'idée est la suivante : si une bougie est haussière un certain DayOfWeekIf à un certain moment TimeTradeIf, alors Sell = vrai (vendre), si elle est baissière, alors Sell = faux (acheter).

Il devrait l'être, mais dans le test, je ne reçois que des échanges à vendre.

eOpenByTime permet d'ouvrir une transaction à un moment donné, j'en ai ajouté d'autres à un jour de la semaine donné if (DayOfWeek()==DayOfWeekOpen, où DayOfWeekOpen = 1,2,3,4,5

Je joins le code en deux parties, il n'y a pas d'autre solution, j'ai mis en évidence la condition problématique. Tout fonctionne comme il se doit sans lui, c'est-à-dire que nous mettons en place Sell et ouvrons une affaire au bon moment, le bon jour de la semaine.

Seul le chalut a été coupé.

//+----------------------------------------------------------------------------+
//|                                                          e-OpenByTime.mq4  |
//|                                                                            |
//|  Идея      : Владимир,  sibtrade@hotbox.ru                                 |
//|  Реализация: Ким Игорь В. aka KimIV, http://www.kimiv.ru                   |
//|                                                                            |
//|  2007.04.27  Открытие позиции в заданное время.                            |
//|  2008.04.10  Параметр MarketWatch.                                         |
//|  2008.04.14  Параметр Duration.                                            |
//+----------------------------------------------------------------------------+

#property copyright "Владимир & KimIV"
#property link  "http://www.kimiv.ru"

//------- Внешние параметры советника -----------------------------------------+
extern string _P_Trade = "---------- Параметры торговли";
extern int    DayOfWeekOpen    = 3;    // День недели открытия позиции
extern string TimeTradeOpen  = "19:51";    // Время открытия позиции
extern int    DayOfWeekIf    = 3;    // День недели условия
extern string TimeTradeIf    = "19:51"; // Время условия
extern int    DayOfWeekClose  = 5;    // День недели закрытия позиции
extern string TimeTradeClose  = "19:51";    // Время закрытия позиции

extern int    Duration   = 300;        // Продолжительность в секундах
//extern bool   Sell       = False;      // True-Sell, False-Buy
extern double Lots       = 0.1;        // Размер лота
extern int    StopLoss   = 30;         // Размер стопа в пунктах
extern int    TakeProfit = 60;         // Размер тейка в пунктах

extern string _P_Expert = "---------- Параметры советника";
extern int    MagicNumber   = 0;
extern int    NumberAccount = 0;            // Номер торгового счёта
extern bool   UseSound      = True;         // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern bool   ShowComment   = True;         // Показывать комментарий
extern bool   MarketWatch   = True;         // Запросы под исполнение "Market Watch".
extern int    Slippage      = 3;            // Проскальзывание цены
extern int    NumberOfTry   = 5;            // Количество торговых попыток
                                                
//------- Глобальные переменные советника -------------------------------------+
bool  gbDisabled = False;         // Флаг блокировки советника
bool  gbNoInit   = False;         // Флаг неудачной инициализации
color clOpenBuy  = LightBlue;     // Цвет значка открытия покупки
color clOpenSell = LightCoral;    // Цвет значка открытия продажи

bool   Sell;
//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>        // Стандартная библиотека МТ4

//int deinit()
//  {
//----
   
//----
 //  return(0);
 // }
  
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Функция инициализации                                                     |
//+----------------------------------------------------------------------------+
void init() {
  gbNoInit=False;
  if (!IsTradeAllowed()) {
    Message("Для нормальной работы советника необходимо\n"+
            "Разрешить советнику торговать");
    gbNoInit=True; return;
  }
  if (!IsLibrariesAllowed()) {
    Message("Для нормальной работы советника необходимо\n"+
            "Разрешить импорт из внешних экспертов");
    gbNoInit=True; return;
  }
  if (!IsTesting()) {
    if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком");
    else Message("Отжата кнопка \"Разрешить запуск советников\"");
  }
}

//+----------------------------------------------------------------------------+
//|  Функция деинициализации                                                   |
//+----------------------------------------------------------------------------+
void deinit() {
 if (!IsTesting()) Comment("");
 
      ObjectDelete("SLb"); //Трейлингстоп
   ObjectDelete("SLs"); //Трейлингстоп
   return(0);
    
 }

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {

  if (gbDisabled) {
    Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return;
  }
  if (gbNoInit) {
    Message("Не удалось инициализировать советник!"); return;
  }
  if (!IsTesting()) {
    if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
      Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
      return;
    } else Comment("");
    if (ShowComment) {
      string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES)
               +"  TimeTrade="+TimeTradeOpen
               +"  Позиция="+GetNameOP(Sell)
               +"  Lots="+DoubleToStr(Lots, 1)
               +"  StopLoss="+DoubleToStr(StopLoss, 0)+" п."
               +"  TakeProfit="+DoubleToStr(TakeProfit, 0)+" п."
               +IIFs(MarketWatch, "  MarketWatch", "")
               ;
      Comment(st);
    } else Comment("");
  }

   // ================= Условие =====================================
 //Sell = false;
 if (DayOfWeek()==DayOfWeekIf
 && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)
 && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)+Duration)
   {
    if  (iClose("XAUUSD",PERIOD_H1,0)-iOpen("XAUUSD",PERIOD_H1,0)>=0)
    Sell = true;
    if  (iOpen("XAUUSD",PERIOD_H1,0)-iClose("XAUUSD",PERIOD_H1,0)>0)
    Sell =false;
   }
   // Без условия все работает правильно. Sell тогда задаем во внешних параметрах. 
    
    
   // ================= Открытие позиции =====================================
  if (DayOfWeek()==DayOfWeekOpen
  && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)
  && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration)
  {
    if (!ExistPositions("", Sell, MagicNumber)) {
      double sl, tp;
      if (Sell) {
        if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
        if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      } else {
        if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
        if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      }
      OpenPosition("", Sell, Lots, sl, tp, MagicNumber);
    }
  }

  
//================= Закрытие всех ордеров в пятницу =====================================  
  
  if (DayOfWeek()==DayOfWeekClose
  && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)
   && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)+Duration)
{  if (OrdersTotal()>0)
   {  for (int i=OrdersTotal()-1; i>=0; i--)
      {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {  
            if (OrderType()==OP_BUY)
            {  RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Bid,1000);
               return(0);
            }
            if (OrderType()==OP_SELL)
            {  RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Ask,1000);
               return(0);
            }
         }
}  }  }
  
}

//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("Buy Limit");
    case OP_SELLLIMIT: return("Sell Limit");
    case OP_BUYSTOP  : return("Buy Stop");
    case OP_SELLSTOP : return("Sell Stop");
    default          : return("Unknown Operation");
  }
}

 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование таймфрейма                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  switch (TimeFrame) {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("Daily");
    case PERIOD_W1:  return("Weekly");
    case PERIOD_MN1: return("Monthly");
    default:         return("UnknownPeriod");
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);

  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.04.2008                                                     |
//|  Описание : Открывает позицию по рыночной цене.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());

  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    if (MarketWatch)
      ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, lsComm, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
    if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
  }
  
  
}
//+----------------------------------------------------------------------------+
Raison: