Ответить
22.07.2013, 11:03
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,625
Поблагодарили 3,758 раз(а) / Репутация: 3750
Сообщение от: Алекc1234
Подскажите, пожалуйста, как написать в коде: "если ордер не модифицировался, то..." Есть код с модификацией отложенных ордеров OrderModify(OrderTicket().......
Хочется, чтоб было дальше, что если не произошла модификация, то.....
Посмотри документацию... OrderModify() Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
Вот и присвой булевой переменной? например xxx результат выполнения функции, а потом условие if(!xxx) повторная попытка.
22.07.2013, 11:09
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 701
Поблагодарили 276 раз(а) / Репутация: 276
Посмотри документацию... OrderModify() Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
Вот и присвой булевой переменной? например xxx результат выполнения функции, а потом условие if(!xxx) повторная попытка.
Спасибо, только можно Вас попросить написать всё это в коде, а то я не совсем врубаюсь, как это написать....
Мой тейкпрофит-магнит, а стоплосс-паразит
Тебе повезло,ты не такой как все
Ты работаешь на форексе
22.07.2013, 11:18
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,509 раз(а) / Репутация: 2535
Сообщение от: Алекc1234
Подскажите, пожалуйста, как написать в коде: "если ордер не модифицировался, то..." Есть код с модификацией отложенных ордеров OrderModify(OrderTicket().......
Хочется, чтоб было дальше, что если не произошла модификация, то.....
В самом ордере вы не найдёте признаков модификаци, делать надо у себя в коде. Вариантов минимум 4, самый надёжный - сравнить изменяемое значение (напр SL) реальное с настройками бота. Напр узнать что трал уже модифицировал SL:

PHP код:
if(OrderOpenPrice() - OrderStopLoss() < СтопЛосс_из_настроек) {
    
// знач ордер уже модифицировался
} else {
    
// ещё не модифицировался

2й вар - у себя вести учёт модификаций. Для этого можно завести отдельную переменную глобальную, статичную static или суперглобальную GlobalVariableSet. Напр

PHP код:
static bool b_First_Touch true;

if(
b_First_Touch) {
    
// ещё не модифицировался
    
b_First_Touch OrderModify();
} else {
    
// уже модифицировался

22.07.2013, 11:40
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,625
Поблагодарили 3,758 раз(а) / Репутация: 3750
Ну, в-первых, как мне показалось вопрос не об этом
Сообщение от: Алекc1234
Хочется, чтоб было дальше, что если не произошла модификация, то.....
А во-вторых

PHP код:
static bool b_First_Touch true;

if(
b_First_Touch) {
    
// ещё не модифицировался
    
b_First_Touch OrderModify();
} else {
    
// уже модифицировался

Если b_First_Touch = true; и после успешной модификации ей присваивается значение true то на следующем тике вновь будет попытка его модифицировать.

Код будет примерно такой
Код:
       bool res;
  while(!res)
   {
    res = OrderModify(Ticket, OrderOpenPrice(), OrderSL, OrderTP, 0, CLR_NONE);
    if(res) break;
     }
Но такой код при некоторых других ошибках может привести к зависанию терминала. Циклами while() надо пользоваться осторожно и понимая что ты делаешь.

К сожалению я срочно должен уехать. Может ale002 перепишет этот кусок с циклом for()
22.07.2013, 11:59
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,509 раз(а) / Репутация: 2535
Точна! Ща пойду застрелюсь :( Надо так:

b_First_Touch = (!OrderModify(...));


А если вопрос про то как доканать сервер чтобы он таки модифицировал ордер, я делаю так: в глобальные всех ботов пишу переменные

PHP код:
int
    gi_Try_To_Trade 
3// кол-во попыток отправки ордера
    
gi_Connect_Wait // пауза перед повтором отправки ордера. В секундах

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

PHP код:
int i_Try gi_Try_To_Trade;
while(
i_Try 0) { // попытки выставить
    
i_Try--;
    if(
OrderModify(...)) break; // всё OK, выход из цикла досрочно
    
else Sleep(1000 gi_Connect_Wait); // не вышло, подождёмс

Хотя на сам деле всё сложнее - нужна предварительная проверка на тему можно ли модифицировать при текущей цене с нужными парамами + обработка ошибок
22.07.2013, 12:43
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 701
Поблагодарили 276 раз(а) / Репутация: 276
А если вопрос про то как доканать сервер чтобы он таки модифицировал ордер, я делаю так: в глобальные всех ботов пишу переменные

PHP код:
int
    gi_Try_To_Trade 
3// кол-во попыток отправки ордера
    
gi_Connect_Wait // пауза перед повтором отправки ордера. В секундах

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

PHP код:
int i_Try gi_Try_To_Trade;
while(
i_Try 0) { // попытки выставить
    
i_Try--;
    if(
OrderModify(...)) break; // всё OK, выход из цикла досрочно
    
else Sleep(1000 gi_Connect_Wait); // не вышло, подождёмс

Хотя на сам деле всё сложнее - нужна предварительная проверка на тему можно ли модифицировать при текущей цене с нужными парамами + обработка ошибок
Огромное спасибо. У меня именно советник зависает каждые 2-3 часа и какое-то время отказывается модифицировать отложки. Вот, сейчас вставил этот код, посмотрю, что получится!
Мой тейкпрофит-магнит, а стоплосс-паразит
Тебе повезло,ты не такой как все
Ты работаешь на форексе
ale002 
22.07.2013, 13:03
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,509 раз(а) / Репутация: 2535
Если регулярно виснет, оч вероятно что вы пытаетесь модифицировать слишком близко к цене - надо проверять переменные MarketInfo(Symbol(), MODE_STOPLEVEL) и MarketInfo(Symbol(), MODE_FREEZELEVEL). Или в расчётах ашипка и уровни SL/TP оказываются не с той стороны от цены. Выведите Print'ом значения Bid, Ask и ваши новые уровни в случае неудачного OrderModify и это проясниццо
22.07.2013, 13:12
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 701
Поблагодарили 276 раз(а) / Репутация: 276
Если регулярно виснет, оч вероятно что вы пытаетесь модифицировать слишком близко к цене - надо проверять переменные MarketInfo(Symbol(), MODE_STOPLEVEL) и MarketInfo(Symbol(), MODE_FREEZELEVEL). Или в расчётах ашипка и уровни SL/TP оказываются не с той стороны от цены. Выведите Print'ом значения Bid, Ask и ваши новые уровни в случае неудачного OrderModify и это проясниццо
Нет, в этом смысле всё у меня в порядке. Хотя ТП у меня равен нулю. Возможно ли, что от этого идёт ошибка? Могу попробовать поставить далеко ТП и посмотрю, будет ли так нормально работать....
Мой тейкпрофит-магнит, а стоплосс-паразит
Тебе повезло,ты не такой как все
Ты работаешь на форексе
23.07.2013, 11:11
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 701
Поблагодарили 276 раз(а) / Репутация: 276
Если регулярно виснет, оч вероятно что вы пытаетесь модифицировать слишком близко к цене - надо проверять переменные MarketInfo(Symbol(), MODE_STOPLEVEL) и MarketInfo(Symbol(), MODE_FREEZELEVEL). Или в расчётах ашипка и уровни SL/TP оказываются не с той стороны от цены. Выведите Print'ом значения Bid, Ask и ваши новые уровни в случае неудачного OrderModify и это проясниццо
Через каждые 2-3 часа выскакивает ошибка Trade Timeout. И на 4 минуты советник зависает - спит что ли, потом снова модифицирует нормально. Как с этим бороться понятия не имею!
Мой тейкпрофит-магнит, а стоплосс-паразит
Тебе повезло,ты не такой как все
Ты работаешь на форексе
23.07.2013, 11:18
Аватар для evgen_82
evgen_82 evgen_82 вне форума Активный участник
Регистрация: 02.01.2013 / Сообщений: 35
Поблагодарили 35 раз(а) / Репутация: 36
Добрый день. Вот пишу функцию, ее задача, перебрать все ордера по магику и вернуть тикет ордера с наименьшим профитом.

Посмотрите, я правильно все написал:

Код:
int TicketMinProfitPos(string sy="", int op=-1, int mn=-1) {
double mi, p;
int    i, k=OrdersTotal(), pp=0, ti=0;
double arr_Orders[10][10];
int Qnt=0; // объявление и обнуление счётчика ордеров
ArrayInitialize (arr_Orders,0); // обнуление массива

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
             Qnt++;
             arr_Orders[Qnt][8]=OrderProfit();
       } arr_Orders[0][0]=Qnt;
     }
   }
 }
}

int index1=0;
double min= 10000000;
  for (int i=0;i<10;i++) {
       if (arr_Orders[i][8]< min)
       { index1=i; min=arr_Orders[i][8]}
  }
return(min);
}

Последний раз редактировалось evgen_82; 23.07.2013 в 11:24.
23.07.2013, 11:35
Аватар для jib07
jib07 jib07 вне форума Местный житель
Регистрация: 11.04.2011 / Сообщений: 336
Поблагодарили 269 раз(а) / Репутация: 270
Добрый день. Вот пишу функцию, ее задача, перебрать все ордера по магику и вернуть тикет ордера с наименьшим профитом.

Посмотрите, я правильно все написал:
Код:
//------- ТИКЕТ МИН ПРОФИТА--------------------
int badtick ()// тикет мин профита
{
  int    tick;
  double prof=100000;
  int    total=OrdersTotal()-1;   
  
  for (int i = total; i >= 0; i--)// перебираем 
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))// текущие 
    { 
      if (OrderMagicNumber() == magic && OrderSymbol() == Symbol())// наши и символ графика
      {
        if (OrderType() <=1 )// селлы и баи
        {
          if (OrderProfit() < prof)// ищем мин профит
          {
            prof=OrderProfit();// пишем профит
            tick=OrderTicket();// пишем тикет
          }
        }
      }
    }
  }
  return(tick);// возвращаем тик с мин профитом
}
//Х------- ТИКЕТ МИН ПРОФИТА-------------
Зачем париться с массивами?
28.07.2013, 20:28
Аватар для evgen_82
evgen_82 evgen_82 вне форума Активный участник
Регистрация: 02.01.2013 / Сообщений: 35
Поблагодарили 35 раз(а) / Репутация: 36
Опять нужна помощь.
Пишу функцию для фильтра сигналов по ATR
Имеем настройки:
Код:
string IIIIIIIII = "Фильтр волатильности по дневному ATR";
int    	iATR_H1_TF                 = 60;
int    	iATR_H1_PER               = 14;
double Max_ATR                        = 1.7;
double H1_ATR;
Сама функция
Код:
double ATR_Max() {
int i;
double m;
datetime tim;
if ( tim != Time[0] ) {  
while( i < 24 ) {
double a = iATR( NULL, iATR_H1_TF, iATR_H1_PER, i );
   if ( m < a ) {
   m = a;
   }
   i++;
 }
tim = Time[0];
}
Alert( " Максимальное значение ATR для видимого количества баров равно - ", m );
return(m);
}
Так эта функция всегда по алерту выдает - 0
Что с ней не так то?
28.07.2013, 22:26
Аватар для blum32
blum32 blum32 вне форума Активный участник
Регистрация: 12.11.2010 / Сообщений: 82
Поблагодарили 36 раз(а) / Репутация: 37
Опять нужна помощь.
Пишу функцию для фильтра сигналов по ATR
Имеем настройки:
Код:
string IIIIIIIII = "Фильтр волатильности по дневному ATR";
int    	iATR_H1_TF                 = 60;
int    	iATR_H1_PER               = 14;
double Max_ATR                        = 1.7;
double H1_ATR;
Сама функция
Код:
double ATR_Max() {
int i;
double m;
datetime tim;
if ( tim != Time[0] ) {  
while( i < 24 ) {
double a = iATR( NULL, iATR_H1_TF, iATR_H1_PER, i );
   if ( m < a ) {
   m = a;
   }
   i++;
 }
tim = Time[0];
}
Alert( " Максимальное значение ATR для видимого количества баров равно - ", m );
return(m);
}
Так эта функция всегда по алерту выдает - 0
Что с ней не так то?

datetime tim=Time[0]; вынесите в инит(), а то каждый раз она у вас будет в начале этой ф-ции обнуляться

Последний раз редактировалось blum32; 28.07.2013 в 22:34.
30.07.2013, 20:22
Аватар для gzh
gzh gzh вне форума Интересующийся
Регистрация: 11.12.2012 / Сообщений: 47
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Приветствую!
Господа знающие, скажите пожалуйста, как сделать, чтобы отложенные ордера выставились от цены открытия Недельной свечи ? и возможно ли это сделать ?
Не могу решить этот вопрос, подскажите как реализовать,буду благодарен!
30.07.2013, 20:28
Аватар для expforex
expforex expforex вне форума Программиров
Регистрация: 11.01.2009 / Сообщений: 2,136
Поблагодарили 2,104 раз(а) / Репутация: 2162
Приветствую!
Господа знающие, скажите пожалуйста, как сделать, чтобы отложенные ордера выставились от цены открытия Недельной свечи ? и возможно ли это сделать ?
Не могу решить этот вопрос, подскажите как реализовать,буду благодарен!
double OpenW=iOpen(Symbol(),PERIOD_W1,0);

Это цена открытия недельной свечи
Советники на заказ! admin@expforex.com
Говорим Спасибо
31.07.2013, 13:19
Аватар для gzh
gzh gzh вне форума Интересующийся
Регистрация: 11.12.2012 / Сообщений: 47
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Благодарю! Оказалось так просто.
Еще можете подсказать пожалуйста, как сделать, если ордер закрылся с прибылью, то больше не выставлять ордера на этой свече,только на следующей ??
Уже попробовал 2 варианта, но не получается.
07.08.2013, 07:58
Аватар для aufx
aufx aufx вне форума Интересующийся
Регистрация: 16.11.2012 / Сообщений: 26
Поблагодарили 2 раз(а) / Репутация: 3
Всем добрый день!
Подскажите пожалуйста.

В индикаторе при выводе на график используется функция WindowPriceMax.
Что бы нагляднее был график используется ее значения для маштабирования выводимой информации. В общем все замечательно но при изменении таймфрейма , WindowPriceMax возвращает значение не текущего окна а предыдущего. К примеру запустили индикатор на D1, WindowPriceMax вернул значение для D1, перешли на H4 WindowPriceMax вернул значение для D1, перешли с H4 на H1 WindowPriceMax вернул значение для H4. Т.о. WindowPriceMax возвращает значение для предыдущего окна а не для текущего. Так и должно быть?
Возможно ли сделать так что бы WindowPriceMax возвращал значения для текущего окна а не для предыдущего?
09.08.2013, 13:46
Аватар для sergch
sergch sergch вне форума Местный житель
Регистрация: 05.04.2009 / Сообщений: 13
Поблагодарили 24 раз(а) / Репутация: 24
Можно ли вытащить с этого индюка через iCustom() данные о полосках?
09.08.2013, 14:51
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Можно ли вытащить с этого индюка через iCustom() данные о полосках?
Нельзя, у индикатора слишком много переменных. iCustom(), как и другие функции, может принять только 64 параметра, из которых 5 штук её собственные обязательные. Индикатор с 60 переменными и больше не взлетит.
Это сознательно сделано автором, он об этом писал. Пробуйте третью версию Симфонии, есть мнение, что она вполне работоспособна, и у неё код открыт.
sergch 
09.08.2013, 15:03
Аватар для sergch
sergch sergch вне форума Местный житель
Регистрация: 05.04.2009 / Сообщений: 13
Поблагодарили 24 раз(а) / Репутация: 24
Пробуйте третью версию Симфонии, есть мнение, что она вполне работоспособна, и у неё код открыт.
Спасибо за информацию.
В 3-ей версии тоже запутано все. Он использует дополнительные файлы, тобишь каждая полоса - отдельный индюк и подключает каждый из них через тот же iCustom(). я еще не вникал в логику дальнейших вычислений, но вскорем времени надеюсь это сделать.

З.Ы.
Совсем недавно начал вникать в MQL и сразу же понял, что стандартной книги не хватает, слишком мало примеров. Если знаете стоящее чтиво - скиньте в ЛС, очень уж хочется изучить этот язык, а программировать через С/С++ слишком уж накладно по времени.

Последний раз редактировалось sergch; 09.08.2013 в 15:06.
Ответить

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


Опции темы

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

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



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


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