Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 238

 
beginner:

Potete suggerire la seguente cosa, ci sono N EAs sul conto, che in certe condizioni possono tutti aprire un ordine allo stesso tempo, ognuno di loro controlla non più di 1 ordine sul conto, ma a volte mi ritrovo con N ordini, cosa posso fare?


Contattali, probabilmente indovineranno il motivo e suggeriranno a distanza una soluzione ;)
 

Salve di nuovo, vorrei porre una domanda sul posizionamento di uno stop sull'ultimo ordine.

Voglio chiarire che nel tester a volte uno stop non viene messo sull'ultimo ordine.

Questo non è successo finora nei test in avanti. Ma come si dice, perché aspettare?).

Codice

//+-------------------------------------------------------------------------------------+
//|                        Управление 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:

Potete suggerirmi la seguente cosa, ci sono N EAs sul conto, che in certe condizioni possono tutti aprire un ordine allo stesso tempo, ognuno di loro controlla non più di 1 ordine sul conto, ma a volte mi ritrovo con N ordini, cosa posso fare?


leggere gli articoli

Pausa tra gli scambi

Errore 146 ("Trade flow busy") e come affrontarlo


 
 
artmedia70:

Sei sicuro che questa parte del codice sia la fonte del problema? Da quello che hai mostrato è difficile trarre conclusioni - ci sono molte variabili sconosciute e non si può vedere l'apertura stessa.

Per trovare la ragione da soli, stampate o visualizzate i valori delle variabili con i commenti. Poi sarete in grado di vedere i loro valori in qualsiasi momento.



Questo è basato su eOpenByTime Expert Advisor del signor Kim. Ho anche aggiunto un trailing stop, chiuso alla fine della settimana e aperto in un certo giorno della settimana. In questa forma l'Expert Advisor funziona come dovrebbe essere.

L'apertura dell'affare viene eseguita nel modo seguente, ho aggiunto solo il giorno di una settimana di apertura dell'affare ma non c'è niente da rovinare qui

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

Per essere onesto, non capisco bene perché TimeCurrent è paragonato a TimeCurrent + TimeTradeOpen dove TimeTradeOpen è un parametro esterno del tipo TimeTradeOpen = "19:51". (Questo è in realtà il tempo di apertura della posizione di cui abbiamo bisogno.) Inoltre non capisco perché questo confronto funziona. La durata è il tempo durante il quale l'Expert Advisor cercherà di aprire una posizione.

Per analogia, ho aggiunto la chiusura di una posizione venerdì.

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

Finora, tutto funzionava.

Poi volevo aggiungere una condizione che guarda una candela ad una data ora e un dato giorno della settimana, se la candela è rialzista, allora vendi, se è ribassista, allora compra.

Allo stesso modo, ho copiato queste 3 linee, che hanno funzionato prima, ma ora per qualche motivo non vogliono farlo.

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

Dopodiché segue il codice per l'apertura della posizione. TimeTradeIf ha un formato simile TimeTradeIf = "19:51" ed è anche impostato tramite parametri esterni.

L'intero codice è abbastanza lungo, è necessario inserire?

 
Limita:

Salve di nuovo, vorrei porre una domanda sul posizionamento di uno stop sull'ultimo ordine.

Voglio chiarire che nel tester a volte uno stop non viene messo sull'ultimo ordine.

Questo non è successo finora nei test in avanti. Ma come si dice, perché aspettare?).

Codice


Trovato il problema. Il codice è OK. è lo scrittore che esige l'impossibile ))
 
Antonius:


Si basa su eOpenByTime Expert Advisor dello stimato signor Kim. Ho anche aggiunto un trailing stop, chiuso alla fine della settimana e aperto in un certo giorno della settimana. In questa forma l'EA funziona come dovrebbe.

L'apertura dell'affare viene eseguita nel modo seguente, solo il giorno della settimana di apertura dell'affare viene aggiunto da me ma non c'è posto per fare un errore qui

Per essere onesto, non capisco bene perché TimeCurrent è paragonato a TimeCurrent + TimeTradeOpen, dove TimeTradeOpen è un parametro esterno del tipo TimeTradeOpen = "19:51". (Questo è in realtà il tempo di apertura della posizione di cui abbiamo bisogno.) Inoltre non capisco perché questo confronto funziona. La durata è il tempo durante il quale l'Expert Advisor cercherà di aprire una posizione.

Per analogia, ho aggiunto la chiusura di una posizione venerdì.

Finora, tutto funzionava.

Poi volevo aggiungere una condizione che guarda una candela ad una data ora e un dato giorno della settimana, se la candela è rialzista, allora vendi, se è ribassista, allora compra.

Allo stesso modo, ho copiato queste 3 linee, che hanno funzionato prima, ma ora per qualche motivo non vogliono farlo.

Dopodiché segue il codice per l'apertura della posizione. TimeTradeIf ha un formato simile TimeTradeIf = "19:51" ed è anche impostato tramite parametri esterni.

L'intero codice è abbastanza lungo, devo incollarlo?

Ad essere onesti, ho già dimenticato qual è il problema. In questa sezione di codice vedo che vengono controllate solo le posizioni corte e viene specificata anche l'apertura delle posizioni corte:

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:

Ad essere onesti, ho dimenticato qual è il problema. In questa sezione di codice vedo che solo le posizioni corte sono controllate e solo le posizioni corte sono aperte:


La variabile Sell è esterna e contiene rispettivamente vero o falso, 1 o 0,

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

Quello di Kim è eOpenByTime.

La logica, l'algoritmo delle azioni, è difettoso.

Se lasciasse perdere la funzione start() e le variabili, quello che portano, allora potremmo suggerire qualcosa.

 
r772ra:

Artem, questo è corretto, la variabile Sell è esterna e porta il valore vero o falso, 1 o 0 rispettivamente,

Ho guardato quello di Kim, eOpenByTime.

La logica, l'algoritmo delle azioni, è difettoso.

Se mostrasse la funzione start() e le variabili, cosa portano, allora potremmo suggerire qualcosa.





L'idea è questa: se una candela è rialzista in un certo DayOfWeekIf ad un certo tempo TimeTradeIf, allora Sell = true (vendere), se è ribassista, allora Sell = false (comprare).

Dovrebbe esserlo, ma nel test ottengo solo scambi in vendita.

eOpenByTime permette di aprire l'affare in un dato momento, io ho aggiunto di più in un dato giorno della settimana if (DayOfWeek()==DayOfWeekOpen, dove DayOfWeekOpen = 1,2,3,4,5

Sto allegando il codice in due parti, non c'è altro modo, ho evidenziato la condizione problematica. Tutto funziona come dovrebbe senza di esso, cioè impostiamo Sell e apriamo un affare al momento giusto nel giorno giusto della settimana.

Solo la pesca a strascico è stata tagliata.

//+----------------------------------------------------------------------------+
//|                                                          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);
  }
  
  
}
//+----------------------------------------------------------------------------+
Motivazione: