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

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

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

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

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

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

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

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

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

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

А вопрос пока-что остается нерешенным..
17.07.2014, 14:43
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,869
Поблагодарили 9,573 раз(а) / Репутация: 9578
Код:
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, т.к. я только в начале пути, не могли бы Вы растолковать мне правую часть данного уравнения, как бы и понятно, но ранее подобную запись ни где не встречал, хочу услышать Ваш комментарий или где можно с этим ознакомиться, спс.
17.07.2014, 14:45
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Сообщение от: Александр_Стручков
Первое перемещение стоплосса идет сразу на 30-40 пунктов, а потом в след за ценой подтягивается по 1 пункту с каждым движением цены на новый максимум.
Да, в таком контексте ваш код выглядит разумно.
17.07.2014, 15:33
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
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;
Значок означает, что так писать не надо, но можно порадоваться, сколько интересного впереди у людей, начавших изучать программирование.
Ффууу теперь должно быть ясно.
17.07.2014, 15:45
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,869
Поблагодарили 9,573 раз(а) / Репутация: 9578
Значок означает, что так писать не надо, но можно порадоваться, сколько интересного впереди у людей, начавших изучать программирование.
Ффууу теперь должно быть ясно.
Более чем, кратко и доходчиво.
Благодарю, жму руку!
18.07.2014, 02:39
Аватар для tatianati
tatianati tatianati вне форума Активный участник
Регистрация: 10.01.2013 / Сообщений: 25
Поблагодарили 42 раз(а) / Репутация: 43
Перед этим циклом с модификацией отложек надо написать ещё один цикл с обнаружением сработавших. Если сработавшие есть, цикл с модификацией можно не выполнять.
Спасибо, но мне нужно чтобы не весь цикл не выполнялся а только модификация селл ордеров если селлимит стал рыночным, так же отдельно для бай.
Пытаюсь записать: - если нет открытой позиции можно передвигать,
соответственно если есть недолжен передвигать или ошибаюсь?
Вот так делаю для селл
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);

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

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

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

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

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

Последний раз редактировалось tatianati; 18.07.2014 в 04:51.
18.07.2014, 04:58
Аватар для Александр_Стручков
Александр_Стручков Александр_Стручков вне форума Интересующийся
Регистрация: 14.07.2014 / Адрес: Ачинск / Сообщений: 20
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Покажите пожалуйста как это например должно выглядеть.
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
Аватар для tatianati
tatianati tatianati вне форума Активный участник
Регистрация: 10.01.2013 / Сообщений: 25
Поблагодарили 42 раз(а) / Репутация: 43
Сообщение от: Александр_Стручков
Только сейчас обратил внимание, что необходимая 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.
18.07.2014, 05:25
Аватар для Александр_Стручков
Александр_Стручков Александр_Стручков вне форума Интересующийся
Регистрация: 14.07.2014 / Адрес: Ачинск / Сообщений: 20
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Почему сначала идет код, код проверки на наличие открытых позиций вообще за пределами 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
Аватар для tatianati
tatianati tatianati вне форума Активный участник
Регистрация: 10.01.2013 / Сообщений: 25
Поблагодарили 42 раз(а) / Репутация: 43
Сообщение от: Александр_Стручков
Блин.. пропустил один знак. Вот так правильно:

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

Написал код для выставления стоплосса у всех открытых ордеров. Для позиций на покупку выставляет идеально, а для позиций на продажу постоянно присутствует какая-то погрешность. Т.е. если нужно выставить стоплосс 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
Регистрация: 23.11.2011 / Адрес: Львов / Сообщений: 1,403
Поблагодарили 2,259 раз(а) / Репутация: 2260
  • Отправить сообщение для 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 ) ); }
[свернуть]
С уважением Владимир!
http://forexsystems.ru/poleznye-dlya...tml#post467397

ГДЕ ЕСТЬ ЗАКОН - ТАМ НЕТ СВОБОДЫ
18.07.2014, 12:42
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Цитата:
Написал код для выставления стоплосса у всех открытых ордеров.
Не сильно вникая в логику, вижу, что
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 нигде вне цикла не использовалось. Помогает избежать ошибок, когда циклов больше чем один.
Точку с запятой после блока {} ставить не надо.
19.07.2014, 02:50
Аватар для tatianati
tatianati tatianati вне форума Активный участник
Регистрация: 10.01.2013 / Сообщений: 25
Поблагодарили 42 раз(а) / Репутация: 43
Сообщение от: Александр_Стручков
Только сейчас обратил внимание, что необходимая 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.
19.07.2014, 08:20
Аватар для Дмитрий 2010
Дмитрий 2010 Дмитрий 2010 вне форума Интересующийся
Регистрация: 13.08.2010 / Сообщений: 12
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Добрый день. Скажите пожалуйста существуел ли функция чтобы присоединяла определённый скрипт при работе советника. Пример if(a+b>5 && Script125==0){Присоединяем скрипт;Script125=1;}.
Ответить

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


Опции темы

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

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



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


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