Автоматизация торговли на финансовых рынках Автоматизация торговли на финансовых рынках

 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Доработка e-MovingInWL2

 
Начать новую тему   Ответить на тему    Список форумов Автоматизация торговли на финансовых рынках -> Программирование в MQL4
Предыдущая тема :: Следующая тема  
Автор Сообщение
ReLock



Зарегистрирован: 26.03.2009
Сообщения: 4

СообщениеДобавлено: Чт Мар 26, 2009 7:54 pm    Заголовок сообщения: Доработка e-MovingInWL2 Ответить с цитатой

Взял на себя смелость доработать код эксперта e-MovingInWL2.
Моя первая доработка. Smile Я только учусь.
Код:

void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  double CurrentPips; // Текущая прибыль в пунктах
  int    Multiplier, i, k=OrdersTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      po = MarketInfo(OrderSymbol(), MODE_POINT); // Размер пункта валюты котировки
      if (OrderType() == OP_BUY) // Если тип ордера "Покупка"
      {
         pp = MarketInfo(OrderSymbol(), MODE_BID); // Цена предложения
         CurrentPips = pp - OrderOpenPrice(); // Прибыль в пунктах
         if (CurrentPips > LevelProfit*po)
         {
            Multiplier = CurrentPips / (LevelProfit*po);
            if (OrderStopLoss() < (OrderOpenPrice()+Multiplier*LevelWLoss*po))
            {
               ModifyOrder(-1, OrderOpenPrice()+Multiplier*LevelWLoss*po, -1);
            }
         }
      }
      if (OrderType() == OP_SELL) // Если тип ордера "Продажа"
      {
         pp = MarketInfo(OrderSymbol(), MODE_ASK); // Цена продажи
         CurrentPips = OrderOpenPrice() - pp; // Прибыль в пунктах
         if (CurrentPips > LevelProfit*po)
         {
            Multiplier = CurrentPips / (LevelProfit*po);
            if (OrderStopLoss() > (OrderOpenPrice()-Multiplier*LevelWLoss*po))
            {
               ModifyOrder(-1, OrderOpenPrice()-Multiplier*LevelWLoss*po, -1);
            }
         }
      }
    }
  }
}

т.е. на каждые LevelProfit прибыли я двигаю стоп-лосс на LevelWLoss пунктов. Правда, если, например, у меня LevelProfit = 20, а LevelWLoss = 5, то при прибыли в 100 пунктов я получу несгораемые 25 пунктов. Это всего 1/4. Мало. Sad
Мысль. Надо бы доработать так: если стоп-лосс не указан, то действовать по стандартной схеме. А если указан, то действовать так:
Если разница между стоп-лоссом и ценой предложения (при покупке) или ценой спроса (при продаже) превысила уровень LevelProfit, то двигать стоп-лосс на стоп-лосс+LevelWLoss. Конечно, модификация ордера будет чаще, чем в стандартном случае, но не так часто, как при стандартном трейлинг-стопе. Все зависит от уровней LevelProfit и LevelWLoss.
Может у кого-нибудь будут другие мысли на этот счет? Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ReLock



Зарегистрирован: 26.03.2009
Сообщения: 4

СообщениеДобавлено: Вт Апр 07, 2009 2:21 pm    Заголовок сообщения: Ответить с цитатой

А теперь я доработал на сдвиг лося на процент от профита:
Код:

//+----------------------------------------------------------------------------+
//|                                                         e-MovingInWL4.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//| 27.03.2009  Советник перемещает стоп в безубыток на определенный процент.  |
//+----------------------------------------------------------------------------+
#property copyright "Kim Igor V. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Внешние параметры советника -----------------------------------------+
extern string _P_Expert = "---------- Параметры советника";
extern bool   AllSymbols  = True;      // Следить за позициями всех символов
extern int    Magic       = -1;        // Идентификатор позиций
extern int    LevelProfit = 35;        // Уровень профита в пунктах
extern double PercentWLoss= 0.30;      // Уровень безубытка в процентах
extern bool   ShowComment = True;      // Показывать комментарий

//------- Параметры исполнения торговых приказов ------------------------------+
extern string _P_Performance = "---------- Параметры исполнения";
extern bool   UseSound     = True;          // Использовать звуковой сигнал
extern string SoundSuccess = "expert.wav";  // Звук успеха
extern string SoundError   = "timeout.wav"; // Звук ошибки
extern int    NumberOfTry  = 2;             // Количество торговых попыток

//------- Глобальные переменные советника -------------------------------------+
bool   gbDisabled   = False;           // Флаг блокировки советника
bool   gbNoInit     = False;           // Флаг неудачной инициализации
color  clModifyBuy  = Aqua;            // Цвет значка модификации покупки
color  clModifySell = Tomato;          // Цвет значка модификации продажи

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>

//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
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("Отжата кнопка \"Разрешить запуск советников\"");
  }
  start();
}

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() {
  if (!IsTesting()) Comment("");
}

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (gbDisabled) {
    Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return;
  }
  if (gbNoInit) {
    Message("Не удалось инициализировать советник!"); return;
  }
  if (ShowComment) {
    Comment(IIFs(AllSymbols, "AllSymbols  ", "")
           ,"Magic="+IIFs(Magic<0, "Любой", DoubleToStr(Magic, 0))+"  "
           ,"LevelProfit="+DoubleToStr(LevelProfit, 0)+"п  "
           ,"PercentWLoss="+DoubleToStr(PercentWLoss,2)+"%  "
           ,"Spread: "+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0)+"   "
           ,"Buy swap: "+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2)+"   "
           ,"Sell swap: "+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2)+"   "
           );
  } else Comment("");
  if (NormalizeDouble(PercentWLoss,2) >= 1) {
      Message("Критическая ошибка! Процент безубытка указан больше, чем 1! Советник ОСТАНОВЛЕН!"); return;
  }
  string sy=IIFs(AllSymbols, "", NULL);
  MovingInWL(sy, -1, Magic);
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}

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

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  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(SoundSuccess); break;
      } else {
        er=GetLastError();
        if (UseSound) PlaySound(SoundError);
        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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  double nl; // Новый уровень стоп-лосса
  double cl; // Текущий уровень стоп-лосса
  int    dg; // Количество значащих цифр после точки
  int    i, k = OrdersTotal();

  for (i=0; i<k; i++)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      dg = MarketInfo(OrderSymbol(), MODE_DIGITS); // Количество значащих цифр после точки
      po = MarketInfo(OrderSymbol(), MODE_POINT); // Размер пункта валюты котировки
      if (OrderType() == OP_BUY) // Если тип ордера "Покупка"
      {
         pp = MarketInfo(OrderSymbol(), MODE_BID); // Цена предложения текущая
         cl = OrderOpenPrice();
         if (OrderStopLoss() != 0)
         {
            if (OrderStopLoss() > OrderOpenPrice()) cl = OrderStopLoss();
         }
         if (pp > (cl + LevelProfit*po))
         {
            nl = NormalizeDouble(cl+(LevelProfit*PercentWLoss*po),dg); // Новый уровень стоп-лосса
            if (cl < nl)
            {
               ModifyOrder(-1,nl,-1);
            }
         }
      }
      if (OrderType() == OP_SELL) // Если тип ордера "Продажа"
      {
         pp = MarketInfo(OrderSymbol(), MODE_ASK); // Цена спроса текущая
         cl = OrderOpenPrice();
         if (OrderStopLoss() != 0)
         {
            if (OrderStopLoss() < OrderOpenPrice()) cl = OrderStopLoss();
         }
         if (pp < (cl - LevelProfit*po))
         {
            nl = NormalizeDouble(cl-(LevelProfit*PercentWLoss*po),dg); // Новый уровень стоп-лосса
            if (cl > nl)
            {
               ModifyOrder(-1, nl, -1);
            }
         }
      }
    }
  }
}
//+----------------------------------------------------------------------------+

Да простит меня автор! Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Subtle



Зарегистрирован: 30.06.2009
Сообщения: 1

СообщениеДобавлено: Вт Июн 30, 2009 5:30 pm    Заголовок сообщения: Ответить с цитатой

подписываюсь на тему ..


(А есть что-нибудь новенького ??)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
artemex



Зарегистрирован: 25.06.2010
Сообщения: 1

СообщениеДобавлено: Сб Июн 26, 2010 1:01 am    Заголовок сообщения: Ответить с цитатой

всем привет,интересный советник.а можно ли в него добавить фиксированный стоп лосс,чтоб при открытии сделки,выставлялся сначало стоп,а при профитном движении на n-пунктов,переставлялся в безубыток,а фиксированный удалялся.желательно переделать с исходного кода.Кто нибудь возмется за это?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ReLock



Зарегистрирован: 26.03.2009
Сообщения: 4

СообщениеДобавлено: Пт Фев 04, 2011 9:35 pm    Заголовок сообщения: Ответить с цитатой

artemex писал(а):
всем привет,интересный советник.а можно ли в него добавить фиксированный стоп лосс,чтоб при открытии сделки,выставлялся сначало стоп,а при профитном движении на n-пунктов,переставлялся в безубыток,а фиксированный удалялся.желательно переделать с исходного кода.Кто нибудь возмется за это?

А что мешает при открытии ордера сразу выставить стоп-лосс? Как только одна из открытых позиций на текущем инструменте пойдет в прибыль, советник сам передвинет стоп-лосс в безубыток.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ReLock



Зарегистрирован: 26.03.2009
Сообщения: 4

СообщениеДобавлено: Пт Фев 04, 2011 10:16 pm    Заголовок сообщения: Ответить с цитатой

Код:
//+----------------------------------------------------------------------------+
//|                                                         e-MovingInWL4.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//| 27.03.2009  Советник перемещает стоп в безубыток на определенный процент.  |
//+----------------------------------------------------------------------------+
#property copyright "Kim Igor V. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Внешние параметры советника -----------------------------------------+
extern string _P_Expert = "---------- Параметры советника";
extern bool   AllSymbols  = True;      // Следить за позициями всех символов
extern int    Magic       = -1;        // Идентификатор позиций
extern int    LevelProfit = 35;        // Уровень профита в пунктах
extern double PercentWLoss= 0.30;      // Уровень безубытка в процентах
extern int    DefaultStopLoss = 50;    // Уровень стоп-лосса по умолчанию
extern bool   ShowComment = True;      // Показывать комментарий

//------- Параметры исполнения торговых приказов ------------------------------+
extern string _P_Performance = "---------- Параметры исполнения";
extern bool   UseSound     = True;          // Использовать звуковой сигнал
extern string SoundSuccess = "expert.wav";  // Звук успеха
extern string SoundError   = "timeout.wav"; // Звук ошибки
extern int    NumberOfTry  = 2;             // Количество торговых попыток

//------- Глобальные переменные советника -------------------------------------+
bool   gbDisabled   = False;           // Флаг блокировки советника
bool   gbNoInit     = False;           // Флаг неудачной инициализации
color  clModifyBuy  = Aqua;            // Цвет значка модификации покупки
color  clModifySell = Tomato;          // Цвет значка модификации продажи

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>

//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
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("Отжата кнопка \"Разрешить запуск советников\"");
  }
  start();
}

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() {
  if (!IsTesting()) Comment("");
}

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (gbDisabled) {
    Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return;
  }
  if (gbNoInit) {
    Message("Не удалось инициализировать советник!"); return;
  }
  if (ShowComment) {
    Comment(IIFs(AllSymbols, "AllSymbols  ", "")
           ,"Magic="+IIFs(Magic<0, "Любой", DoubleToStr(Magic, 0))+"  "
           ,"LevelProfit="+DoubleToStr(LevelProfit, 0)+"п  "
           ,"PercentWLoss="+DoubleToStr(PercentWLoss,2)+"%  "
           ,"Default StopLoss="+DoubleToStr(DefaultStopLoss,0)+"п  "
           ,"Spread: "+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0)+"   "
           ,"Buy swap: "+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2)+"   "
           ,"Sell swap: "+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2)+"   "
           );
  } else Comment("");
  if (NormalizeDouble(PercentWLoss,2) >= 1) {
      Message("Критическая ошибка! Процент безубытка указан больше, чем 1! Советник ОСТАНОВЛЕН!"); return;
  }
  string sy=IIFs(AllSymbols, "", NULL);
  MovingInWL(sy, -1, Magic);
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}

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

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  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(SoundSuccess); break;
      } else {
        er=GetLastError();
        if (UseSound) PlaySound(SoundError);
        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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  double nl; // Новый уровень стоп-лосса
  double cl; // Текущий уровень стоп-лосса
  int    dg; // Количество значащих цифр после точки
  int    i, k = OrdersTotal();

  for (i=0; i<k; i++)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      dg = MarketInfo(OrderSymbol(), MODE_DIGITS); // Количество значащих цифр после точки
      po = MarketInfo(OrderSymbol(), MODE_POINT); // Размер пункта валюты котировки
      if (OrderType() == OP_BUY) // Если тип ордера "Покупка"
      {
         pp = MarketInfo(OrderSymbol(), MODE_BID); // Цена предложения текущая
         cl = OrderOpenPrice();
         if (OrderStopLoss() != 0)
         {
            if (OrderStopLoss() > OrderOpenPrice()) cl = OrderStopLoss();
         } else
         {
            nl = NormalizeDouble(cl-DefaultStopLoss*po,dg);
            ModifyOrder(-1,nl,-1);
         }
         
         if (pp > (cl + LevelProfit*po))
         {
            nl = NormalizeDouble(cl+(LevelProfit*PercentWLoss*po),dg); // Новый уровень стоп-лосса
            if (cl < nl)
            {
               ModifyOrder(-1,nl,-1);
            }
         }
      }
      if (OrderType() == OP_SELL) // Если тип ордера "Продажа"
      {
         pp = MarketInfo(OrderSymbol(), MODE_ASK); // Цена спроса текущая
         cl = OrderOpenPrice();
         if (OrderStopLoss() != 0)
         {
            if (OrderStopLoss() < OrderOpenPrice()) cl = OrderStopLoss();
         } else
         {
            nl = NormalizeDouble(cl+DefaultStopLoss*po,dg);
            ModifyOrder(-1,nl,-1);
         }
         if (pp < (cl - LevelProfit*po))
         {
            nl = NormalizeDouble(cl-(LevelProfit*PercentWLoss*po),dg); // Новый уровень стоп-лосса
            if (cl > nl)
            {
               ModifyOrder(-1, nl, -1);
            }
         }
      }
    }
  }
}
//+----------------------------------------------------------------------------+

К сожалению код проверить не могу. При загрузке мой терминал (от FiboGroup) ругается: Expert 'e-MovingInWL2' is not custom indicator and will be removed
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Автоматизация торговли на финансовых рынках -> Программирование в MQL4 Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять вложения в этом форуме
Вы не можете просматривать вложения в этом форуме
Рейтинг@Mail.ru


Powered by phpBB © 2001, 2005 phpBB Group