Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 238

 
beginner :

Bana böyle bir şey söyle, hesapta, belirli koşullar altında, hepsi aynı anda aynı anda bir sipariş açabilen N danışman var, her biri hesapta 1'den fazla siparişi kontrol etmiyor, ancak sonunda bazen alıyorum N emir, ne yapabilirim?


Oradan iletişime geçin, muhtemelen nedenini tahmin edecekler ve uzaktan bir çözüme ilham verecekler;)
 

Tekrar merhaba, son siparişte stop verme ile ilgili konuyu tekrar gündeme getirmek istiyorum.

Test Cihazında bazen son siparişte durmadığını açıklığa kavuşturmak istiyorum.

Şimdiye kadar bu, ileri testlerde olmadı. Ama dedikleri gibi, neden bekleyelim?

kod

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

Bana böyle bir şey söyle, hesapta, belirli koşullar altında, hepsi aynı anda aynı anda bir sipariş açabilen N danışman var, her biri hesapta 1'den fazla siparişi kontrol etmiyor, ancak sonunda bazen alıyorum N emir, ne yapabilirim?


makaleleri oku

Ticaret işlemleri arasında duraklama

Hata 146 ("Ticari iş parçacığı meşgul") ve bununla nasıl başa çıkılacağı


 
artmedia70 :

Köpeğin kodun bu bölümünü karıştırdığından emin misin? Gösterdiklerinden sonuç çıkarmak zor - birçok bilinmeyen değişken var ve keşfin kendisi görünmüyor.

Sebebi kendiniz bulmak için değişkenlerin değerlerini yazdırın veya yorumlayın. Ardından değerlerini istediğiniz zaman görebilirsiniz.



Temel, saygın Bay Kim'in eOpenByTime Uzman Danışmanıdır. Bir başkasının danışmanından kopan, hafta sonunda anlaşmaları kapatan ve haftanın belirli bir gününde anlaşma açan bir son durak ekledim. Bu formda danışman olması gerektiği gibi çalışır.

Anlaşmanın açılışı aşağıdaki gibidir, sadece anlaşmanın açıldığı haftanın gününü ekledim ama ortalığı karıştıracak bir yer yok gibi görünüyor.

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

Dürüst olmak gerekirse, TimeCurrent'ın neden TimeCurrent + TimeTradeOpen ile karşılaştırıldığını tam olarak anlamıyorum, burada TimeTradeOpen, TimeTradeOpen = "19:51" formunun harici bir parametresidir. (Aslında bu, ihtiyacımız olan pozisyon açılış zamanı .) Ve bu karşılaştırmanın neden işe yaradığını da anlamıyorum. Süre, EA'nın bir pozisyon açmaya çalışacağı süredir.

Mutlak benzetme ile, Cuma günü pozisyonun kapanışını ekledim, kapanışın kendisi de internette düşülmüştü.

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

Her şey çalışırken.

Sonra bir muma belirli bir saat ve haftanın belirli bir gününde bakan bir koşul eklemek istedim, mum yükselişse satarız, düşüşse alırız.

Benzer şekilde, daha önce çalışan bu 3 satırı kopyaladım ama şimdi nedense istemiyorlar.

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

Ondan sonra zaten bir pozisyon açma kodu var. TimeTradeIf benzer bir TimeTradeIf = "19:51" formatına sahiptir ve ayrıca harici parametreler aracılığıyla ayarlanır.

Kodun tamamı oldukça uzun, yapıştırmam gerekiyor mu?

 
Limita :

Tekrar merhaba, son siparişte stop verme ile ilgili konuyu tekrar gündeme getirmek istiyorum.

Test Cihazında bazen son siparişte durmadığını açıklığa kavuşturmak istiyorum.

Şimdiye kadar bu, ileri testlerde olmadı. Ama dedikleri gibi, neden bekleyelim?

kod


Sorunu buldum. Kodla ilgili her şey yolunda. Bu yazar imkansızı istiyor
 
Antonius :


Temel, saygın Bay Kim'in eOpenByTime Uzman Danışmanıdır. Bir başkasının danışmanından kopan, hafta sonunda anlaşmaları kapatan ve haftanın belirli bir gününde anlaşma açan bir son durak ekledim. Bu formda danışman olması gerektiği gibi çalışır.

Anlaşmanın açılışı aşağıdaki gibidir, sadece anlaşmanın açıldığı haftanın gününü ekledim ama ortalığı karıştıracak bir yer yok gibi görünüyor.

Dürüst olmak gerekirse, TimeCurrent'ın neden TimeCurrent + TimeTradeOpen ile karşılaştırıldığını tam olarak anlamıyorum, burada TimeTradeOpen, TimeTradeOpen = "19:51" formunun harici bir parametresidir. (Aslında bu, bir pozisyon açmamız gereken zaman.) Ve bu karşılaştırmanın neden işe yaradığını da anlamıyorum. Süre, EA'nın bir pozisyon açmaya çalışacağı süredir.

Mutlak benzetme ile, Cuma günü pozisyonun kapanışını ekledim, kapanışın kendisi de internette düşülmüştü.

Her şey çalışırken.

Sonra bir muma belirli bir saat ve haftanın belirli bir gününde bakan bir koşul eklemek istedim, mum yükselişse satarız, düşüşse alırız.

Benzer şekilde, daha önce çalışan bu 3 satırı kopyaladım ama şimdi nedense istemiyorlar.

Ondan sonra zaten bir pozisyon açma kodu var. TimeTradeIf benzer bir TimeTradeIf = "19:51" formatına sahiptir ve ayrıca harici parametreler aracılığıyla ayarlanır.

Kodun tamamı oldukça uzun, yapıştırmanız gerekiyor mu?

Dürüst olmak gerekirse, oradaki sorununun ne olduğunu çoktan unuttum. Kodun bu bölümünde sadece kısa pozisyonların varlığının kontrol edildiğini ve sadece kısa pozisyonların açılmasının da kaydedildiğini görüyorum:

 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 :

Dürüst olmak gerekirse, oradaki sorununun ne olduğunu çoktan unuttum. Kodun bu bölümünde sadece kısa pozisyonların varlığının kontrol edildiğini ve sadece kısa pozisyonların açılmasının da kaydedildiğini görüyorum:


Artem, burada her şey doğru, Sell değişkeni harici ve sırasıyla doğru veya yanlış, 1 veya 0 değerini taşıyor,

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

Kim bir göz attı, eOpenByTime .

Mantık topal, eylemlerin algoritması.

Start() fonksiyonunu ve kendilerinde taşıdıkları değişkenleri atmışsa, o zaman bir şey önerilebilir.

 
r772ra :

Artem, burada her şey doğru, Sell değişkeni harici ve sırasıyla doğru veya yanlış, 1 veya 0 değerini taşıyor,

Kim bir göz attı, eOpenByTime .

Mantık topal, eylemlerin algoritması.

Start() fonksiyonunu ve kendilerinde taşıdıkları değişkenleri atmışsa, o zaman bir şey önerilebilir.





Sonuç şudur: eğer belirli bir günde DayOfWeekIf belirli bir zamanda TimeTradeEğer mum boğa ise, o zaman Satış = doğru (sat), düşüş ise, o zaman Satış = yanlış (satın al).

Olması gereken bu, ancak testte sadece alım satım ticareti alıyorum.

eOpenByTime, belirli bir zamanda bir ticaret açmanıza izin verir, haftanın belirli bir gününde bir tane daha ekledim if (DayOfWeek()==DayOfWeekOpen burada DayOfWeekOpen = 1,2,3,4,5

Kodu iki parça halinde ekliyorum, başka bir şekilde uymuyor, sorunlu durumu vurguladım. Onsuz, her şey olması gerektiği gibi çalışır, yani harici olarak Sat'ı ayarlarız ve haftanın doğru gününde, doğru zamanda, doğru yönde bir anlaşma açılır.

Sadece trolü kesin.

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