Ответ
 
Опции темы
Старый 17.07.2014, 11:00   #2901 (permalink)
Интересующийся
 
Аватар для Александр_Стручков
 
Регистрация: 14.07.2014
Адрес: Ачинск
Сообщений: 20
Репутация: 2
Александр_Стручков
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Поинты: 32
Сообщение от qqmber Посмотреть сообщение
Величины с плавающей точкой нельзя сравнивать на равенство, поскольку они хранятся округленными до ближайшей степени двойки. Попробуйте так
Код:
if (MathAbs(OrderStopLoss() - OrderOpenPrice()+SL*Point) < Point)
В stdlib есть функция CompareDoubles, можно ее использовать.
Спасибо! Для ордеров на покупку работает!

А с ордерами на продажу нет.. Там нужно учитывать спред, спред плавающий. Можно ли как-то узнать значение спреда в момент открытия ордера? Т.е. получить к.л. значение спреда из истории?

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

Последний раз редактировалось Александр_Стручков; 17.07.2014 в 11:38.
Александр_Стручков вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 17.07.2014, 11:51   #2902 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Сообщение от Александр_Стручков Посмотреть сообщение
Спасибо! Для ордеров на покупку работает!
Тут дело не в спреде, чтобы работало на продажу надо знак изменить.
Код:
if (MathAbs(OrderStopLoss() - OrderOpenPrice()-SL*Point) < Point)
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 17.07.2014, 12:13   #2903 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Сообщение от Александр_Стручков Посмотреть сообщение
А с ордерами на продажу нет.. Там нужно учитывать спред, спред плавающий. Можно ли как-то узнать значение спреда в момент открытия ордера? Т.е. получить к.л. значение спреда из истории?

Родилась мысль создать массив для хранения определенных данных по каждому открытому ордеру. Например, тикет ордера, спред в этот момент. Далее начать поиск данных по тикету, а исходя из этого уже получить данные спреда в нужный нам момент. что думаете насчет этого?
Думаю вот что.
Во-первых, при организации трала обычно нет смысла проверять, было ли уже изменение стопа. После первого изменения эта проверка ничего интересного не сообщит. Если только у вас не какой-то специальный случай, когда стоп подтягивается только один раз. Вместо этого вычисляйте, где положено находиться стопу в текущий тик, и если он далеко от этого места, дальше чем на спред, например, тогда только подтягивайте.
Во-вторых, вариантов тралов может быть много, но в большинстве случаев спред в момент открытия вам полезен как прошлогодний снег, а вот текущий можно брать в учет, особенно если трал ползет на расстоянии, сопоставимом со спредом.
В-третьих, хранить данные, описывающие прошлое состояние рынка - глобально плохая идея. Где вы будете их брать после перезапуска терминала при открытых позициях?
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 17.07.2014, 14:25   #2904 (permalink)
Интересующийся
 
Аватар для Александр_Стручков
 
Регистрация: 14.07.2014
Адрес: Ачинск
Сообщений: 20
Репутация: 2
Александр_Стручков
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Поинты: 32
Сообщение от qqmber Посмотреть сообщение
Думаю вот что.
Во-первых, при организации трала обычно нет смысла проверять, было ли уже изменение стопа. После первого изменения эта проверка ничего интересного не сообщит. Если только у вас не какой-то специальный случай, когда стоп подтягивается только один раз. Вместо этого вычисляйте, где положено находиться стопу в текущий тик, и если он далеко от этого места, дальше чем на спред, например, тогда только подтягивайте.
Во-вторых, вариантов тралов может быть много, но в большинстве случаев спред в момент открытия вам полезен как прошлогодний снег, а вот текущий можно брать в учет, особенно если трал ползет на расстоянии, сопоставимом со спредом.
В-третьих, хранить данные, описывающие прошлое состояние рынка - глобально плохая идея. Где вы будете их брать после перезапуска терминала при открытых позициях?
Насчет хранения информации Вы, конечно, хорошо подметили. Надо подумать. На крайний случай с записью/чтением фалов подумать.. Хотя это уже слишком..

А проверка на изменение стоплосса нужна вот зачем:
Идея состоит в том, что тралл должен начать тащить стоплосс только после того, как цена пройдет определенный предел. Например 40 пунктов. Первое перемещение стоплосса идет сразу на 30-40 пунктов, а потом в след за ценой подтягивается по 1 пункту с каждым движением цены на новый максимум.

Дело в том, что если не делать проверку "изменялся ли стоплосс", то как еще оператору указать, что от этого типа трейлинга нужно переходить к другому типу? Т.е. пока стоплосс не изменялся, мы ждем пробития ценой уровня в эти 40 пунктов.

Однако если проверку не делать, то второй тип трала сразу же начнет тащить за собой стоплосс.

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

Хотя может я изобретаю велосипед и просто не знаком с какой-то полезной для меня в данный момент функцией..

А вопрос пока-что остается нерешенным..
Александр_Стручков вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 17.07.2014, 14:43   #2905 (permalink)
 
Аватар для mobidik
 
Регистрация: 09.08.2012
Адрес: Ua_Khm
Сообщений: 1,653
Репутация: 8570
mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik
Сказал(а) спасибо: 634
Поблагодарили 8,566 раз(а) в 1,567 сообщениях
Поинты: 802
Сообщение от qqmber Посмотреть сообщение
Код:
MAX(a,b,c)=a<b?b<c?c:b:c<a?a:c;
MIN(a,b,c)=a>b?b>c?c:b:c>a?a:c;
qqmber, т.к. я только в начале пути, не могли бы Вы растолковать мне правую часть данного уравнения, как бы и понятно, но ранее подобную запись ни где не встречал, хочу услышать Ваш комментарий или где можно с этим ознакомиться, спс.
mobidik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
tommy27 (17.07.2014)
Старый 17.07.2014, 14:45   #2906 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Сообщение от Александр_Стручков Посмотреть сообщение
Первое перемещение стоплосса идет сразу на 30-40 пунктов, а потом в след за ценой подтягивается по 1 пункту с каждым движением цены на новый максимум.
Да, в таком контексте ваш код выглядит разумно.
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 17.07.2014, 15:33   #2907 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Сообщение от mobidik Посмотреть сообщение
qqmber, т.к. я только в начале пути, не могли бы Вы растолковать мне правую часть данного уравнения, как бы и понятно, но ранее подобную запись ни где не встречал, хочу услышать Ваш комментарий или где можно с этим ознакомиться, спс.
MQL, как и другие С-подобные языки, имеет сокращенный вариант оператора if
if(yesno) r=ок; else r=fail; можно короче записать
r=yesno ? ok : fail;
Эта форма часто используется, когда yesno, ok и fail короткие и ясные, для экономии, чтобы не писать к ним длинные if .. else.
Заодно широко встречается в "obfuscated C code" - синтаксически и алгоритмически правильных, но совершенно нечитаемых программах. Так пишут для скрытия алгоритма или для фана. Целые соревнования проводят даже, кто непонятнее код напишет
Так вот, ларчик просто открывается, тут три вложенных кратких оператора x?y:z

Код:
max = a<b ? (b<c ? c : b) : (c<a ? a : c);

Полный эквивалент 
if(a<b)
   if(b<c) max=c;
   else max=b;
else 
   if(c<a) max=a;
   else max=c;
Значок означает, что так писать не надо, но можно порадоваться, сколько интересного впереди у людей, начавших изучать программирование.
Ффууу теперь должно быть ясно.
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
4 пользователя(ей) сказали cпасибо:
ksardas (18.07.2014), mobidik (17.07.2014), tommy27 (17.07.2014), Александр_Стручков (17.07.2014)
Старый 17.07.2014, 15:45   #2908 (permalink)
 
Аватар для mobidik
 
Регистрация: 09.08.2012
Адрес: Ua_Khm
Сообщений: 1,653
Репутация: 8570
mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik
Сказал(а) спасибо: 634
Поблагодарили 8,566 раз(а) в 1,567 сообщениях
Поинты: 802
Сообщение от qqmber Посмотреть сообщение
Значок означает, что так писать не надо, но можно порадоваться, сколько интересного впереди у людей, начавших изучать программирование.
Ффууу теперь должно быть ясно.
Более чем, кратко и доходчиво.
Благодарю, жму руку!
mobidik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 02:39   #2909 (permalink)
Активный участник
 
Аватар для tatianati
 
Регистрация: 10.01.2013
Сообщений: 20
Репутация: 40
tatianati
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 6 сообщениях
Поинты: 24
Сообщение от Ugar Посмотреть сообщение
Перед этим циклом с модификацией отложек надо написать ещё один цикл с обнаружением сработавших. Если сработавшие есть, цикл с модификацией можно не выполнять.
Спасибо, но мне нужно чтобы не весь цикл не выполнялся а только модификация селл ордеров если селлимит стал рыночным, так же отдельно для бай.
Пытаюсь записать: - если нет открытой позиции можно передвигать,
соответственно если есть недолжен передвигать или ошибаюсь?
Вот так делаю для селл
PHP код:
if(OrderType()==OP_SELLLIMIT)
{
s_lm++; 
   if(
high>0.2 && OrderOpenPrice()!=high && ExistPositions(NULLOP_SELL, -1) <1) { // если нет селл--позиций, то переношу лимитник на новый уровень
               
modify_limit_order(OP_SELLLIMIThigh);
        } 
Вот так смотрю, есть ли позиции

PHP код:
bool ExistPositions(string sy=""int op=-1int mn=-1datetime ot=0) {
  
int ik=OrdersTotal();
 
  if (
sy=="0"sy=Symbol();
  for (
i=0i<ki++) {
    if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
      if (
OrderSymbol()==sy || sy=="") {
        if (
OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (
op<|| OrderType()==op) {
            if (
mn<|| OrderMagicNumber()==mn) {
              if (
ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(
False);

Не получается, помогите пожалуйста.
tatianati вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 03:22   #2910 (permalink)
Интересующийся
 
Аватар для Александр_Стручков
 
Регистрация: 14.07.2014
Адрес: Ачинск
Сообщений: 20
Репутация: 2
Александр_Стручков
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Поинты: 32
Сообщение от tatianati Посмотреть сообщение
Спасибо, но мне нужно чтобы не весь цикл не выполнялся а только модификация селл ордеров если селлимит стал рыночным, так же отдельно для бай.
Пытаюсь записать: - если нет открытой позиции можно передвигать,
соответственно если есть недолжен передвигать или ошибаюсь?
В таком случае сделайте две bool переменных. Одну для sell ордеров, вторую для buy.

А потом задайте условие: если проверка, например, по sell ордерам показала результат true, то цикл модификации для этих ордеров не выполнять.

Аналогично сделать и для buy
Александр_Стручков вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 04:43   #2911 (permalink)
Активный участник
 
Аватар для tatianati
 
Регистрация: 10.01.2013
Сообщений: 20
Репутация: 40
tatianati
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 6 сообщениях
Поинты: 24
Сообщение от Александр_Стручков Посмотреть сообщение
В таком случае сделайте две bool переменных. Одну для sell ордеров, вторую для buy.

А потом задайте условие: если проверка, например, по sell ордерам показала результат true, то цикл модификации для этих ордеров не выполнять.

Аналогично сделать и для buy
Покажите пожалуйста как это например должно выглядеть.
bool flag=false;

Последний раз редактировалось tatianati; 18.07.2014 в 04:51.
tatianati вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 04:58   #2912 (permalink)
Интересующийся
 
Аватар для Александр_Стручков
 
Регистрация: 14.07.2014
Адрес: Ачинск
Сообщений: 20
Репутация: 2
Александр_Стручков
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Поинты: 32
Сообщение от tatianati Посмотреть сообщение
Покажите пожалуйста как это например должно выглядеть.
bool flag=false;
Только сейчас обратил внимание, что необходимая bool переменная у Вас уже имеется.
В таком случае я себе представляю это так:


Скрытый текст

PHP код:
Сначала идет Ваш код проверки на наличие открытых позиций

bool ExistPositions
(string sy=""int op=-1int mn=-1datetime ot=0) {
  
int ik=OrdersTotal();
 
  if (
sy=="0"sy=Symbol();
  for (
i=0i<ki++) {
    if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
      if (
OrderSymbol()==sy || sy=="") {
        if (
OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (
op<|| OrderType()==op) {
            if (
mn<|| OrderMagicNumber()==mn) {
              if (
ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(
False);
}

// теперь проверяем значение ExistPositions и исходя из этого уже два варианта работы функции модификации ордеров:

if(OrderType()==OP_SELLLIMIT && ExistPositions=False//(в условие добавляем проверку ExistPositions )
{s_lm++;  
   if(
high>0.2 && OrderOpenPrice()!=high && ExistPositions(NULLOP_SELL, -1) <1
   
modify_limit_order(OP_SELLLIMIThigh); 
 } 
[свернуть]

Надеюсь, что я правильно понял задачу и, если что-то не так, профессионалы подправят
Александр_Стручков вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 05:21   #2913 (permalink)
Активный участник
 
Аватар для tatianati
 
Регистрация: 10.01.2013
Сообщений: 20
Репутация: 40
tatianati
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 6 сообщениях
Поинты: 24
Сообщение от Александр_Стручков Посмотреть сообщение
Только сейчас обратил внимание, что необходимая bool переменная у Вас уже имеется.
В таком случае я себе представляю это так:


Скрытый текст

PHP код:
Сначала идет Ваш код проверки на наличие открытых позиций

bool ExistPositions
(string sy=""int op=-1int mn=-1datetime ot=0) {
  
int ik=OrdersTotal();
 
  if (
sy=="0"sy=Symbol();
  for (
i=0i<ki++) {
    if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
      if (
OrderSymbol()==sy || sy=="") {
        if (
OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (
op<|| OrderType()==op) {
            if (
mn<|| OrderMagicNumber()==mn) {
              if (
ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(
False);
}

// теперь проверяем значение ExistPositions и исходя из этого уже два варианта работы функции модификации ордеров:

if(OrderType()==OP_SELLLIMIT && ExistPositions=False//(в условие добавляем проверку ExistPositions )
{s_lm++;  
   if(
high>0.2 && OrderOpenPrice()!=high && ExistPositions(NULLOP_SELL, -1) <1
   
modify_limit_order(OP_SELLLIMIThigh); 
 } 
[свернуть]

Надеюсь, что я правильно понял задачу и, если что-то не так, профессионалы подправят
Почему сначала идет код, код проверки на наличие открытых позиций вообще за пределами start то есть сейчас уже void OnTick()

Последний раз редактировалось tatianati; 18.07.2014 в 05:29.
tatianati вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 05:25   #2914 (permalink)
Интересующийся
 
Аватар для Александр_Стручков
 
Регистрация: 14.07.2014
Адрес: Ачинск
Сообщений: 20
Репутация: 2
Александр_Стручков
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Поинты: 32
Сообщение от tatianati Посмотреть сообщение
Почему сначала идет код, код проверки на наличие открытых позиций вообще за пределами start то есть сейчас уже void OnTick() Компилятор ругается '&&' - l-value require '==' - l-value require
Блин.. пропустил один знак. Вот так правильно:

PHP код:
if(OrderType()==OP_SELLLIMIT && ExistPositions==False// 

Последний раз редактировалось Александр_Стручков; 18.07.2014 в 05:32.
Александр_Стручков вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 05:33   #2915 (permalink)
Активный участник
 
Аватар для tatianati
 
Регистрация: 10.01.2013
Сообщений: 20
Репутация: 40
tatianati
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 6 сообщениях
Поинты: 24
Сообщение от Александр_Стручков Посмотреть сообщение
Блин.. пропустил один знак. Вот так правильно:

PHP код:
if(OrderType()==OP_SELLLIMIT && ExistPositions==False// 
Спасибо проверять буду вечером сейчас мне пора.
tatianati вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 10:26   #2916 (permalink)
Интересующийся
 
Аватар для Александр_Стручков
 
Регистрация: 14.07.2014
Адрес: Ачинск
Сообщений: 20
Репутация: 2
Александр_Стручков
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Поинты: 32
Всем доброго времени!

Написал код для выставления стоплосса у всех открытых ордеров. Для позиций на покупку выставляет идеально, а для позиций на продажу постоянно присутствует какая-то погрешность. Т.е. если нужно выставить стоплосс 100п., он выставляет то 95, то 97, то 101 и т.д. В чем может быть проблема?

Код ниже

Скрытый текст

PHP код:
extern int SL=100;      // StopLoss

void OnStart()
{
RefreshRates();

bool mod;                                       //ей возвращается значение Ordermodify()
double take;                                    //TakeProfit рассчитанный
double stopl;                                   //StopLoss рассчитанны
int i=OrdersTotal();
bool ordslct;                                   //ей возвращается значение OrderSelect()
int  level;   //для хранения значения минимально допустимого значения стопа и тейка
for(i--;i>=0;i--) // Перебирает по очереди все открытые ордеры.
{ordslct=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
level=MarketInfo(OrderSymbol(),MODE_STOPLEVEL);
 if (
OrderType()==OP_BUY)
  {if (
OrderStopLoss()==0)
      {if (
SL>0&&SL<levelstopl=level;
      else {if (
SL>levelstopl=OrderOpenPrice()-SL*Point;}};
   if (
OrderStopLoss()==0stopl=OrderStopLoss();
   
mod=OrderModify(OrderTicket(),OrderOpenPrice(),stopl,OrderTakeProfit(),OrderExpiration(),clrNONE);// выставить стоплосс и тейкпрофит
  
};

  if (
OrderType()==OP_SELL)
  {if (
OrderStopLoss()==0)
      {if (
SL>0&&SL<levelstopl=level;
      else {if (
SL>levelstopl=OrderOpenPrice()+SL*Point;}};
   if (
OrderStopLoss()!=0stopl=OrderStopLoss();
   
mod=OrderModify(OrderTicket(),OrderOpenPrice(),stopl,OrderTakeProfit(),OrderExpiration(),clrNONE); //  выставить стоплосс и тейкпрофит
  
};

};


[свернуть]



То работает идеально, то косячит со стоплоссами для sell ордеров.. Уже мозг сломал, не могу врубиться..

Последний раз редактировалось Александр_Стручков; 18.07.2014 в 11:09.
Александр_Стручков вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 12:26   #2917 (permalink)
 
Аватар для volodymyr67
 
Регистрация: 23.11.2011
Адрес: Львов
Сообщений: 1,396
Репутация: 2258
volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67 volodymyr67
Сказал(а) спасибо: 1,645
Поблагодарили 2,257 раз(а) в 803 сообщениях
Поинты: 10
Отправить сообщение для volodymyr67 с помощью Skype™

По умолчанию Всем приет !


подскажите пожалоста как этот индикатор прописать сюда чтоб по стрелкам торговал

Скрытый текст

double UpArr(int bar){ return( iCustom(NULL, timeframe, "12_G", gi_76, gi_80, gi_84, gi_88, 4, bar ) ); }
double DnArr(int bar){ return( iCustom(NULL, timeframe, "12_G", gi_76, gi_80, gi_84, gi_88, 5, bar ) ); }
[свернуть]
Вложения:
Тип файла: mq4 Rubicon+Indicator.mq4 (29.3 Кб, 9 просмотров)
Тип файла: ex4 Rubicon+Indicator.ex4 (22.7 Кб, 4 просмотров)

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
С уважением Владимир!
http://forexsystems.ru/poleznye-dlya...tml#post467397

ГДЕ ЕСТЬ ЗАКОН - ТАМ НЕТ СВОБОДЫ
volodymyr67 вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 18.07.2014, 12:42   #2918 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Цитата:
Написал код для выставления стоплосса у всех открытых ордеров.
Не сильно вникая в логику, вижу, что
if (OrderStopLoss()==0) stopl=OrderStopLoss();
if (OrderStopLoss()!=0) stopl=OrderStopLoss();
для buy и sell.
Кроме того, пара советов.
Конструкция for(i--;i>=0;i--) хотя и формально правильная, но шибко нетрадиционная. Обычно пишут for(i=OrdersTotal()-1;i>=0;i--) так чтобы i нигде вне цикла не использовалось. Помогает избежать ошибок, когда циклов больше чем один.
Точку с запятой после блока {} ставить не надо.
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Старый 19.07.2014, 02:50   #2919 (permalink)
Активный участник
 
Аватар для tatianati
 
Регистрация: 10.01.2013
Сообщений: 20
Репутация: 40
tatianati
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 6 сообщениях
Поинты: 24
Сообщение от Александр_Стручков Посмотреть сообщение
Только сейчас обратил внимание, что необходимая bool переменная у Вас уже имеется.
В таком случае я себе представляю это так:


Скрытый текст

PHP код:
Сначала идет Ваш код проверки на наличие открытых позиций

bool ExistPositions
(string sy=""int op=-1int mn=-1datetime ot=0) {
  
int ik=OrdersTotal();
 
  if (
sy=="0"sy=Symbol();
  for (
i=0i<ki++) {
    if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
      if (
OrderSymbol()==sy || sy=="") {
        if (
OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (
op<|| OrderType()==op) {
            if (
mn<|| OrderMagicNumber()==mn) {
              if (
ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(
False);
}

// теперь проверяем значение ExistPositions и исходя из этого уже два варианта работы функции модификации ордеров:

if(OrderType()==OP_SELLLIMIT && ExistPositions=False//(в условие добавляем проверку ExistPositions )
{s_lm++;  
   if(
high>0.2 && OrderOpenPrice()!=high && ExistPositions(NULLOP_SELL, -1) <1
   
modify_limit_order(OP_SELLLIMIThigh); 
 } 
[свернуть]

Надеюсь, что я правильно понял задачу и, если что-то не так, профессионалы подправят
Профессионалы посмотрели и видимо решили что всё правильно(или не посмотрели).
Однако не работает как нужно. Сделала по Вашей рекомендации вот так
PHP код:
for(i=OrdersTotal()-1i>=0i--) 
     {
OrderSelect(iSELECT_BY_POSMODE_TRADES);
      if(
OrderSymbol()==Symbol() && OrderMagicNumber()==magic 
        {
//пересчитываем количество ордеров:
         
if(OrderType()==OP_BUY)      {op_b++; }  
         if(
OrderType()==OP_SELL)     {op_s++; }  
         if(
OrderType()==OP_BUYLIMIT && ExistPositions == False
           {
b_lm++; 
            if(
low>0.2 && OrderOpenPrice()!=low &&  
            
ExistPositions(NULLOP_BUYmagic) <1) {// если нет бай--позиций, то переношу лимитник на новый уровень
               
modify_limit_order(OP_BUYLIMITlow);
               
Sleep(1000*10);
              }
           }
         if(
OrderType()==OP_SELLLIMIT && ExistPositions == False)
           {
s_lm++; 
            if(
high>0.2 && OrderOpenPrice()!=high && 
            
ExistPositions(NULLOP_SELLmagic) <1) { // если нет селл--позиций, то переношу лимитник на новый уровень
               
modify_limit_order(OP_SELLLIMIThigh);
               
Sleep(1000*10);
              }
           }
        }
     } 
что неправильно?

Последний раз редактировалось tatianati; 19.07.2014 в 03:07.
tatianati вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 19.07.2014, 08:20   #2920 (permalink)
Интересующийся
 
Аватар для Дмитрий 2010
 
Регистрация: 13.08.2010
Сообщений: 12
Репутация: 2
Дмитрий 2010
Сказал(а) спасибо: 7
Поблагодарили 1 раз в 1 сообщении
Поинты: 18
Добрый день. Скажите пожалуйста существуел ли функция чтобы присоединяла определённый скрипт при работе советника. Пример if(a+b>5 && Script125==0){Присоединяем скрипт;Script125=1;}.
Дмитрий 2010 вне форума   Ответить с цитированиемОтветить с цитированием  
Ответ

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 21:14. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
SEO by vBSEO