Как реализовать такой алгоритм?

 
Здравствуйте, подскажите, пожалуйста, начинающему как можно реализовать в коде советника алгоритм открытия лимитных ордеров на заданный уровень от цены открытия ордера уже открытого этим советником в данный момент???
Например, советник согласно своего алгоритма работы открывает Sell ордер по EURUSD по цене 1500 и в этот же момент необходимо выставить ордер Sell Limit по цене 1,5050, то есть +50 пунктов от цены открытия (либо наоборот, при открытии советником BUY ордера по цене 1,500 выставить ордер Buy limit на уровень 1,4970, то есть -30 пунктов от цены открытия). При этом желательно наличие возможности изменения уровня выставления лимитников без в мешательство в исходник советника.
Спасибо
 

1. Определить тип последней позиции.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastOpenPos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal(), r=-1;
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderOpenTime()) {
            t=OrderOpenTime();
            r=OrderType();
          }
        }
      }
    }
  }
  return(r);
}

2. Определить цену открытия последней позиции.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает цену открытия последней открытой позиций.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=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 (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}

3. Выставить лимитник функцией OrderSend().

 
Спасибо болшое, буду теперь стараться увязать все в кучу.)
 
Здравствуйте, KimIV. Возникла проблемка... При компеляции советника с кодами, которые вы выложили выше, компилятор выдает ошибку

'(' - function definition unexpected

и указывает, что ошибка в строчках:
int GetTypeLastOpenPos(string sy="", int mn=-1) {
double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {
Подскажите, пожалуйста как ее исправить?
 

Игорь. Продублируйте пож. выложенные функции в Вашу веточку 'Полезные функции от KimIV'

Хотелось бы, чтобы в одном месте сосредоточить всё. Многие из посетителей "сохраняют" ту вашу ветку....

 
yokme:
Здравствуйте, KimIV. Возникла проблемка... При компеляции советника с кодами, которые вы выложили выше, компилятор выдает ошибку

'(' - function definition unexpected

и указывает, что ошибка в строчках:
int GetTypeLastOpenPos(string sy="", int mn=-1) {
double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {
Подскажите, пожалуйста как ее исправить?

Я, Иван, скопировал свои функции в чистый MQ4-файл и попробовал скомпилировать в метаэдиторе. Всё нормально. Нет никаких ошибок. Следовательно, одно из двух:
1. Вы неправильно (не полностью) скопировали мои функции в свой советник.
2. В коде Вашего советника присутствуют сиснтаксические ошибки.

rid писал (а):
Игорь. Продублируйте пож. выложенные функции в Вашу веточку 'Полезные функции от KimIV'
Хотелось бы, чтобы в одном месте сосредоточить всё. Многие из посетителей "сохраняют" ту вашу ветку....
Ок... записал себе в заявки... как дойдёт очередь именно до этих функций, так и выложу с примерами и с пояснениями.
 
'(' - function definition unexpected

и указывает, что ошибка в строчках:
int GetTypeLastOpenPos(string sy="", int mn=-1) {
double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {
Подскажите, пожалуйста как ее исправить?
Ну тут все ясно: объявление функции в теле другой. В MQL4 (как и в Си) такие паскуалевские вольности непозволительны. И как это у тебя так вышло, yokme? Игорь вроде как такой код не выкладывал...
 
Игорь, я уже сбил в кучу, то что хотел, решил сделать советника пока только на покупку, соответственно отпала необходимость определять тип позиции.
Сделал вроде все правильно, но как показала практика  правильно все только для компилятора. Советник только открывает ордер по рынку, а вот определить цену открытой позиции и использовать ее в следующем шаге у него не получается, выдает ошибку. Подскажите пожалуйста в чем может быть ошибка? файл прилагается.
Файлы:
wfubd.mq4  4 kb
 
Mathemat:

'(' - function definition unexpected



и указывает, что ошибка в строчках:

int GetTypeLastOpenPos(string sy="", int mn=-1) {

double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {

Подскажите, пожалуйста как ее исправить?

Ну тут все ясно: объявление функции в теле другой. В MQL4 (как и в Си) такие паскуалевские вольности непозволительны. И как это у тебя так вышло, yokme? Игорь вроде как такой код не выкладывал...

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

Иван, я считаю это очень неприличным, просить кого-то разобраться в коде, в котором чёрт ногу сломит. Это всё равно, что кого-то постороннего просить прибраться в своей комнате после пьяного дебоша.

В том месте, в котором Вы пытаетесь использовать мою функцию, советник не всегда видит открытую позицию. Видимо, это особенности кэширования или многопоточности, я не знаю. Не разбираюсь в этом. Более менее достоверно использовать открытую позицию можно только на следующем тике после открытия. А Вы пытаетесь это сделать на том же тике, на котором её открываете.

В прицепе причёсанный код.

Файлы:
wfubd_1.mq4  4 kb
 
KimIV:

Иван, я считаю это очень неприличным, просить кого-то разобраться в коде, в котором чёрт ногу сломит. Это всё равно, что кого-то постороннего просить прибраться в своей комнате после пьяного дебоша.



В том месте, в котором Вы пытаетесь использовать мою функцию, советник не всегда видит открытую позицию. Видимо, это особенности кэширования или многопоточности, я не знаю. Не разбираюсь в этом. Более менее достоверно использовать открытую позицию можно только на следующем тике после открытия. А Вы пытаетесь это сделать на том же тике, на котором её открываете.



В прицепе причёсанный код.

Игорь, прошу не судить меня строго за оформление кода, поскольку в програмировании я полный профан, а то что я выложил является моей первой попыткой сделать что-то путевое в этой области. К сожалению и с программерской эстэтикой оформления програмных кодов не знаком абсолютно.
Я старался подписывать коментарии к каждой отдельной части кода, функции и переменнным, но как оказалось получилось это плохо))

Спсибо за помощь, буду стараться разобраться в чем неточности.

PS: не сочтите за наглость, если прийдется еще раз обратиться