Полезные функции от KimIV - страница 114

 

Добрый день.

В программировании ещё новичок, может кто подскажет. 

Вопрос. Имеется один или несколько открытых ордеров, известно что они закроются с профитом допустим 20 $.

Нужно узнать, по какой цене закроются ордера при профите 20 $.

Вычисляем общий объём открытых лотов, а дальше?!

Не подскажите как сделать.

Может быть есть уже готовая функция?

Заранее спасибо. 

 
KimIV:

Примеры использования функци DistMarketAndPos().

Зачем может понадобиться функция, которая определяет, как далеко находится рынок от ближайшей к нему позиции? Я вижу, как минимум, четыре основных варианта:

  1. Купили или продали. Рынок пошёл в нашу сторону. И как только он проходит некоторое расстояние, существующие позиции набрали определённую прибыль, так сразу же делаем доливку - входим ещё раз в ту же сторону.
  2. Купили или продали. Рынок пошёл в нашу сторону. И как только он проходит некоторое расстояние, а существующие позиции набрали определённую прибыль, так сразу же мы понимаем, что всё! Разворот близок! Пора переворачиваться. Закрываем текущие позиции и открываемся в противоположную сторону.
  3. Купили или продали. Рынок пошёл против нас. Но мы почему-то уверены в своей правоте и на некотором расстоянии от точки ближайшего входа, то есть на некотором уровне убытка усредняемся - открываемся в ту же сторону.
  4. Купили или продали. Рынок пошёл против нас. И мы поняли, что со входом вышла ошибочка. Поэтому фиксируемся на определённом уровне убытка и открываемся в другую сторону.

ЗЫ. Если кому-то нужна конкретная реализация любого из перечисленных вариантов, пишите сюда заявки. Выполню все пожелания в рамках того, что я перечислил выше.

ЗЫ-ЗЫ. В прицепе скрипт-заготовка для экспериментирования с функцией DistMarketAndPos().


Здравствуйте KimIV, функция очень хорошая, работает, переворачиваю ее, тоже работает, а соединить две половины не могу.

 

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, int mn=-1) {

  double d, p;

  int i, k=OrdersTotal(), r=1000000;


  if (sy=="" || sy=="0") sy=Symbol();

  p=MarketInfo(sy, MODE_POINT);

  if (p==0) if (StringFind(sy, "")<0) p=0.00001; else p=0.01;

  for (i=0; i<k; i++) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {

        if (mn<0 || OrderMagicNumber()==mn) {

          if (OrderType()==OP_BUY) {

            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

          if (OrderType()==OP_SELL) {

            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

        }

      }

    }

  }

return (r);

}  


 

переверните мне ее пожалуйста, все говорят что это не правильно, но она работает.
 
Новички, задавайте вопросы в специально открытой для этого ветке.
 

Новая версия функции Message().


Функция Message() со дня публикации здесь претерпела изменения дважды. В первом изменении была добавлена возможность отключения вывода в журнал экспертов функцией Print() и возможность вывода только первого сообщения из серии одинаковых. Второе изменение добавило направления вывода, то есть в дополнение к имеющимся Comment() и Print() были задействованы функции Alert(), SendMail() и SendNotification(). Именно последнее изменение я и опубликовываю

Функция Message() предназначена для вывода текстового сообщения в различных направлениях. Её можно использовать как в отладочных целях, так и в готовых разработках для пояснения текущей торговой ситуации, для протоколирования работы программы, для своевременного оповещения трейдера о важных изменениях и пр. Функция принимает три параметра, из которых два последних являются необязательными:
  • ms - Строка, текстовое сообщение, подлежащее выводу, передаче.
  • nv - Строка флагов, которые задают направления вывода сообщения. Пять флагов - это пять знакомест. Каждое знакоместо нулём выключает, а единицей включает определённое направление вывода. Слева направа по порядку это Alert, Comment, Print, SendMail и SendNotification. Значение по умолчанию - "01100", то есть включены Comment и Print, остальные выключены.
  • am - Логическое, True - выводить все сообщения, False - из серии одинаковых сообщений выводить только первое. Значение по умолчанию - False.

Про направления вывода Alert и Print (знакоместа 1 и 3) следует отметить, что они умеют выводит сообщение построчно. То есть, если в тексте сообщения есть перенос строки - управляющий символ "\n", то каждая строка будет выведена самостоятельно. Попробуйте тестовый скрипт во вложении, думаю, Вам понравится :-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

ЗЫ. Во вложении скрипт для тестирования функции Message().

Файлы:
 
KimIV:

Новая версия функции Message().


Функция Message() со дня публикации здесь претерпела изменения дважды. В первом изменении была добавлена возможность отключения вывода в журнал экспертов функцией Print() и возможность вывода только первого сообщения из серии одинаковых. Второе изменение добавило направления вывода, то есть в дополнение к имеющимся Comment() и Print() были задействованы функции Alert(), SendMail() и SendNotification(). Именно последнее изменение я и опубликовываю

Функция Message() предназначена для вывода текстового сообщения в различных направлениях. Её можно использовать как в отладочных целях, так и в готовых разработках для пояснения текущей торговой ситуации, для протоколирования работы программы, для своевременного оповещения трейдера о важных изменениях и пр. Функция принимает три параметра, из которых два последних являются необязательными:
  • ms - Строка, текстовое сообщение, подлежащее выводу, передаче.
  • nv - Строка флагов, которые задают направления вывода сообщения. Пять флагов - это пять знакомест. Каждое знакоместо нулём выключает, а единицей включает определённое направление вывода. Слева направа по порядку это Alert, Comment, Print, SendMail и SendNotification. Значение по умолчанию - "01100", то есть включены Comment и Print, остальные выключены.
  • am - Логическое, True - выводить все сообщения, False - из серии одинаковых сообщений выводить только первое. Значение по умолчанию - False.

Про направления вывода Alert и Print (знакоместа 1 и 3) следует отметить, что они умеют выводит сообщение построчно. То есть, если в тексте сообщения есть перенос строки - управляющий символ "\n", то каждая строка будет выведена самостоятельно. Попробуйте тестовый скрипт во вложении, думаю, Вам понравится :-)


ЗЫ. Во вложении скрипт для тестирования функции Message().

Добавляли в вашу функцию OpenPosition проверку на стоплевел?
 
sv.:
Добавляли в вашу функцию OpenPosition проверку на стоплевел?


нет... а какого рода проверку Вы имеете в виду? Ну, допустим, стоп и тейк проверку не прошли, что делать? Есть варианты:

  1. Не открывать,
  2. Скорректировать стоп и тейк.

 
KimIV:


нет... а какого рода проверку Вы имеете в виду? Ну, допустим, стоп и тейк проверку не прошли, что делать? Есть варианты:

  1. Не открывать,
  2. Скорректировать стоп и тейк.

Можно ввести пользовательский переключатель между пунктами 1 и 2.  По образцу:
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Новая версия функции OpenPosition() в скрипте для тестирования.

Что нового?

1. При ошибке 130 Неверные стопы и при значении переменной NumberOfTry>1 функция сделает попытку скорректировать ценовые уровни StopLoss и TakeProfit под значение MODE_STOPLEVEL+MODE_SPREAD относительно Bid для OP_SELL и относительно Ask для OP_BUY.

Замечание:

Для срабатывания корректировки ценовых уровней нужно, чтобы значение глобальной переменной NumberOfTry было больше 1. Это связано с тем, что первая попытка открытия позиции выявляет ошибку 130 и корректирует ценовые уровни, а вторая и последующие попытки откроют позицию со скорректированными уровнями.

Файлы:
 
KimIV, рад вас снова тут видеть с новыми функциями.
 

     

Добрый день.

Можно ли дополнить библиотеку полезных функций от KimIV некоторыми простыми функциями, как например :

1.  Цена открытия, выбранной по некоторым критериям  позиции (символу, типу, величине лота, магическому числу). Эту цену можно запомнить в глобальных переменных и использовать как некоторый ценовой уровень, от которого можно строить  алгоритм советника.

2.  Возвращает тиккет, выбранной по некоторым критериям  позиции  или ордера (символу, типу, величине лота, магическому числу). Тиккет это  важный идентификатор , его можно использовать везде и даже как флаг существования.

Чем больше будет таких простых функций, тем проще будет подобрать  самые  оптимальные из них для себя, не опасаясь, что не ошибешься при модификации существующих.

Спасибо Вам за ваши функции.