포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 238

 
beginner :

그런 것을 말해 주세요. 특정 조건에서 동시에 주문을 모두 열 수 있는 N명의 고문이 계정에 있습니다. 각 고문은 계정에서 1개 이하의 주문을 확인하지만 결국에는 때때로 다음을 얻습니다. N 주문, 무엇을 할 수 있습니까?


거기 에 연락하면 아마도 이유를 추측하고 원격으로 솔루션에 영감을 줄 것입니다.)
 

안녕하세요 다시 한 번 마지막 주문에 대한 중지와 관련하여 문제를 다시 제기하고 싶습니다.

테스터 에서 때때로 마지막 주문에 중지를 설정하지 않는다는 점을 명확히 하고 싶습니다.

지금까지 이것은 순방향 테스트에서 발생하지 않았습니다. 그러나 그들이 말했듯이 왜 기다리십니까?

코드

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

그런 것을 말해 주세요. 특정 조건에서 동시에 주문을 모두 열 수 있는 N명의 고문이 계정에 있습니다. 각 고문은 계정에서 1개 이하의 주문을 확인하지만 결국에는 때때로 다음을 얻습니다. N 주문, 무엇을 할 수 있습니까?


기사 읽기

거래 작업 사이에 일시 중지

오류 146("거래 스레드가 사용 중입니다") 및 처리 방법


 
artmedia70 :

개가 코드의 이 섹션을 뒤졌다고 확신합니까? 당신이 보여준 것에서 결론을 도출하는 것은 어렵습니다. 알려지지 않은 변수가 많고 발견 자체가 보이지 않습니다.

원인을 직접 찾으려면 변수 값을 인쇄하거나 주석으로 처리하십시오. 그러면 언제든지 그들의 가치를 볼 수 있습니다.



기본은 존경받는 Mr. Kim의 eOpenByTime Expert Advisor입니다. 나는 다른 사람의 조언자에게서 떼어낸 후행 스탑을 추가하여 주말에 거래를 마감하고 요일에 거래를 엽니다. 이 형식에서 고문은 원래대로 작동합니다.

딜 개시는 이렇습니다, 딜이 열린 요일만 추가했는데 흐트러질 곳이 없을 것 같습니다

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

솔직히 말해서 왜 TimeCurrent가 TimeCurrent + TimeTradeOpen과 비교되는지 잘 모르겠습니다. 여기서 TimeTradeOpen은 TimeTradeOpen = "19:51" 형식의 외부 매개변수입니다. (사실, 이것은 우리에게 필요한 포지션 개시 시간 입니다.) 그리고 이 비교가 작동하는 이유도 이해하지 못합니다. 기간은 EA가 포지션을 개설하려고 시도하는 시간입니다.

절대적으로 유추하여 금요일에 포지션 마감을 추가했으며 마감 자체도 인터넷에서 차감되었습니다.

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

모든 것이 작동하는 동안.

그런 다음 주어진 시간과 요일에 양초를 바라보는 조건을 추가하고 싶었습니다. 양초가 강세이면 매도하고 약세이면 매수합니다.

마찬가지로, 이전에 작동했던 이 3줄을 복사했지만 지금은 어떤 이유로 원하지 않습니다.

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

그 후, 이미 포지션 오픈 코드가 있습니다. TimeTradeIf는 TimeTradeIf = "19:51"과 유사한 형식을 가지며 외부 매개변수를 통해서도 설정됩니다.

전체 코드가 꽤 깁니다. 붙여넣으셔야 합니까?

 
Limita :

안녕하세요 다시 한 번 마지막 주문에 대한 중지와 관련하여 문제를 다시 제기하고 싶습니다.

테스터 에서 때때로 마지막 주문에 중지를 설정하지 않는다는 점을 명확히 하고 싶습니다.

지금까지 이것은 순방향 테스트에서 발생하지 않았습니다. 그러나 그들이 말했듯이 왜 기다리십니까?

코드


문제를 찾았습니다. 코드로 모든 것이 정상입니다. 이 작가는 불가능한 것을 요구한다
 
Antonius :


기본은 존경받는 Mr. Kim의 eOpenByTime Expert Advisor입니다. 나는 다른 사람의 조언자에게서 떼어낸 후행 스탑을 추가하여 주말에 거래를 마감하고 요일에 거래를 엽니다. 이 형식에서 고문은 원래대로 작동합니다.

딜 개시는 이렇습니다, 딜이 열린 요일만 추가했는데 흐트러질 곳이 없을 것 같습니다

솔직히 말해서 왜 TimeCurrent가 TimeCurrent + TimeTradeOpen과 비교되는지 잘 모르겠습니다. 여기서 TimeTradeOpen은 TimeTradeOpen = "19:51" 형식의 외부 매개변수입니다. (사실 지금이 포지션을 열어야 할 때입니다.) 그리고 이 비교가 왜 효과가 있는지 저도 이해가 되지 않습니다. 기간은 EA가 포지션을 개설하려고 시도하는 시간입니다.

절대적으로 유추하여 금요일에 포지션 마감을 추가했으며 마감 자체도 인터넷에서 차감되었습니다.

모든 것이 작동하는 동안.

그런 다음 주어진 시간과 요일에 양초를 보는 조건을 추가하고 싶었습니다. 양초가 강세이면 매도하고 약세이면 매수합니다.

마찬가지로, 이전에 작동했던 이 3줄을 복사했지만 지금은 어떤 이유로 원하지 않습니다.

그 후, 이미 포지션 오픈 코드가 있습니다. TimeTradeIf는 TimeTradeIf = "19:51"과 유사한 형식을 가지며 외부 매개변수를 통해서도 설정됩니다.

전체 코드가 꽤 깁니다. 붙여넣으셔야 합니까?

솔직히 말해서, 나는 이미 당신의 문제가 무엇인지 잊어 버렸습니다. 여기 코드의 이 섹션에서 숏 포지션의 존재만 확인하고 숏 포지션의 개시도 등록된 것을 볼 수 있습니다.

 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 :

솔직히 말해서, 나는 이미 당신의 문제가 무엇인지 잊어 버렸습니다. 여기 코드의 이 섹션에서 숏 포지션의 존재만 확인하고 숏 포지션의 개시도 등록된 것을 볼 수 있습니다.


Artem, 여기에서는 모든 것이 정확하고 Sell 변수는 외부적이며 각각 true 또는 false, 1 또는 0 값을 전달합니다.

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

Kim은 eOpenByTime 을 보았습니다.

논리는 절름발이, 행동 알고리즘입니다.

그가 start() 함수와 그것들이 가지고 있는 변수들을 버렸다면, 뭔가 제안될 수 있습니다.

 
r772ra :

Artem, 여기에서는 모든 것이 정확하고 Sell 변수는 외부적이며 각각 true 또는 false, 1 또는 0 값을 전달합니다.

Kim은 eOpenByTime 을 보았습니다.

논리는 절름발이, 행동 알고리즘입니다.

그가 start() 함수와 그것들이 가지고 있는 변수들을 버렸다면, 뭔가 제안될 수 있습니다.





결론은 다음과 같습니다. 특정 날짜에 DayOfWeek이면 특정 시간 TimeTrade양초가 강세이면 Sell = true(매도)이고, 약세이면 Sell = false(매수)입니다.

이렇게 되어야 하지만 테스트에서는 판매 거래만 받습니다.

eOpenByTime을 사용하면 주어진 시간에 거래를 열 수 있습니다. 나는 주어진 요일에 다른 거래를 추가했습니다. if (DayOfWeek()==DayOfWeekOpen 여기서 DayOfWeekOpen = 1,2,3,4,5

두 부분으로 코드를 첨부했는데 다른 방식으로 맞지 않아 문제가 있는 조건을 강조 표시했습니다. 그것 없이는 모든 것이 제대로 작동합니다. 즉, 우리는 외부에서 Sell을 설정하고 적절한 요일에 적절한 시간에 올바른 방향으로 거래가 열립니다.

트롤만 잘라냅니다.

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