Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
Подскажите, пожалуйста, как написать в коде: "если ордер не модифицировался, то..." Есть код с модификацией отложенных ордеров OrderModify(OrderTicket().......
Хочется, чтоб было дальше, что если не произошла модификация, то.....
Посмотри документацию... OrderModify() Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
Вот и присвой булевой переменной? например xxx результат выполнения функции, а потом условие if(!xxx) повторная попытка.
 

Алекc1234

Местный житель
Посмотри документацию... OrderModify() Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
Вот и присвой булевой переменной? например xxx результат выполнения функции, а потом условие if(!xxx) повторная попытка.

Спасибо, только можно Вас попросить написать всё это в коде, а то я не совсем врубаюсь, как это написать....
 

ale002

::: __,,,^._.^,,,__ :::
Подскажите, пожалуйста, как написать в коде: "если ордер не модифицировался, то..." Есть код с модификацией отложенных ордеров OrderModify(OrderTicket().......
Хочется, чтоб было дальше, что если не произошла модификация, то.....

В самом ордере вы не найдёте признаков модификаци, делать надо у себя в коде. Вариантов минимум 4, самый надёжный - сравнить изменяемое значение (напр SL) реальное с настройками бота. Напр узнать что трал уже модифицировал SL:

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

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

PHP:
Expand Collapse Copy
static bool b_First_Touch = true;

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

AlexeyVik

Программист mql4 mql5
Ну, в-первых, как мне показалось вопрос не об этом
Хочется, чтоб было дальше, что если не произошла модификация, то.....
А во-вторых
PHP:
Expand Collapse Copy
static bool b_First_Touch = true;

if(b_First_Touch) {
    // ещё не модифицировался
    b_First_Touch = OrderModify();
} else {
    // уже модифицировался
}
Если b_First_Touch = true; и после успешной модификации ей присваивается значение true то на следующем тике вновь будет попытка его модифицировать.

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

К сожалению я срочно должен уехать. Может ale002 перепишет этот кусок с циклом for()
 

ale002

::: __,,,^._.^,,,__ :::
Точна! Ща пойду застрелюсь :( Надо так:

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


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

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

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

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

Хотя на сам деле всё сложнее - нужна предварительная проверка на тему можно ли модифицировать при текущей цене с нужными парамами + обработка ошибок
 

Алекc1234

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

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

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

PHP:
Expand Collapse Copy
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

::: __,,,^._.^,,,__ :::
Если регулярно виснет, оч вероятно что вы пытаетесь модифицировать слишком близко к цене - надо проверять переменные MarketInfo(Symbol(), MODE_STOPLEVEL) и MarketInfo(Symbol(), MODE_FREEZELEVEL). Или в расчётах ашипка и уровни SL/TP оказываются не с той стороны от цены. Выведите Print'ом значения Bid, Ask и ваши новые уровни в случае неудачного OrderModify и это проясниццо
 

Алекc1234

Местный житель
Если регулярно виснет, оч вероятно что вы пытаетесь модифицировать слишком близко к цене - надо проверять переменные MarketInfo(Symbol(), MODE_STOPLEVEL) и MarketInfo(Symbol(), MODE_FREEZELEVEL). Или в расчётах ашипка и уровни SL/TP оказываются не с той стороны от цены. Выведите Print'ом значения Bid, Ask и ваши новые уровни в случае неудачного OrderModify и это проясниццо

Нет, в этом смысле всё у меня в порядке. Хотя ТП у меня равен нулю. Возможно ли, что от этого идёт ошибка? Могу попробовать поставить далеко ТП и посмотрю, будет ли так нормально работать....
 

Алекc1234

Местный житель
Если регулярно виснет, оч вероятно что вы пытаетесь модифицировать слишком близко к цене - надо проверять переменные MarketInfo(Symbol(), MODE_STOPLEVEL) и MarketInfo(Symbol(), MODE_FREEZELEVEL). Или в расчётах ашипка и уровни SL/TP оказываются не с той стороны от цены. Выведите Print'ом значения Bid, Ask и ваши новые уровни в случае неудачного OrderModify и это проясниццо

Через каждые 2-3 часа выскакивает ошибка Trade Timeout. И на 4 минуты советник зависает - спит что ли, потом снова модифицирует нормально. Как с этим бороться понятия не имею!
 

evgen_82

Активный участник
Добрый день. Вот пишу функцию, ее задача, перебрать все ордера по магику и вернуть тикет ордера с наименьшим профитом.

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

Код:
Expand Collapse Copy
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);
}
 
Последнее редактирование:

jib07

Местный житель
Добрый день. Вот пишу функцию, ее задача, перебрать все ордера по магику и вернуть тикет ордера с наименьшим профитом.

Посмотрите, я правильно все написал:
Код:
Expand Collapse Copy
//------- ТИКЕТ МИН ПРОФИТА--------------------
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);// возвращаем тик с мин профитом
}
//Х------- ТИКЕТ МИН ПРОФИТА-------------
Зачем париться с массивами?*hi*
 

evgen_82

Активный участник
Опять нужна помощь.
Пишу функцию для фильтра сигналов по ATR
Имеем настройки:
Код:
Expand Collapse Copy
string IIIIIIIII = "Фильтр волатильности по дневному ATR";
int    	iATR_H1_TF                 = 60;
int    	iATR_H1_PER               = 14;
double Max_ATR                        = 1.7;
double H1_ATR;
Сама функция
Код:
Expand Collapse Copy
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
Что с ней не так то?
 

blum32

Активный участник
Опять нужна помощь.
Пишу функцию для фильтра сигналов по ATR
Имеем настройки:
Код:
Expand Collapse Copy
string IIIIIIIII = "Фильтр волатильности по дневному ATR";
int    	iATR_H1_TF                 = 60;
int    	iATR_H1_PER               = 14;
double Max_ATR                        = 1.7;
double H1_ATR;
Сама функция
Код:
Expand Collapse Copy
double ATR_Max() {
int i;
double m;
[COLOR="Red"]datetime tim;[/COLOR]
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]; вынесите в инит(), а то каждый раз она у вас будет в начале этой ф-ции обнуляться
 
Последнее редактирование:

gzh

Интересующийся
Приветствую!
Господа знающие, скажите пожалуйста, как сделать, чтобы отложенные ордера выставились от цены открытия Недельной свечи ? и возможно ли это сделать ?
Не могу решить этот вопрос, подскажите как реализовать,буду благодарен!
 

expforex

Программиров
Приветствую!
Господа знающие, скажите пожалуйста, как сделать, чтобы отложенные ордера выставились от цены открытия Недельной свечи ? и возможно ли это сделать ?
Не могу решить этот вопрос, подскажите как реализовать,буду благодарен!

double OpenW=iOpen(Symbol(),PERIOD_W1,0);

Это цена открытия недельной свечи
 

gzh

Интересующийся
Благодарю! Оказалось так просто.
Еще можете подсказать пожалуйста, как сделать, если ордер закрылся с прибылью, то больше не выставлять ордера на этой свече,только на следующей ??
Уже попробовал 2 варианта, но не получается.
 

aufx

Интересующийся
Всем добрый день!
Подскажите пожалуйста.

В индикаторе при выводе на график используется функция WindowPriceMax.
Что бы нагляднее был график используется ее значения для маштабирования выводимой информации. В общем все замечательно но при изменении таймфрейма , WindowPriceMax возвращает значение не текущего окна а предыдущего. К примеру запустили индикатор на D1, WindowPriceMax вернул значение для D1, перешли на H4 WindowPriceMax вернул значение для D1, перешли с H4 на H1 WindowPriceMax вернул значение для H4. Т.о. WindowPriceMax возвращает значение для предыдущего окна а не для текущего. Так и должно быть?
Возможно ли сделать так что бы WindowPriceMax возвращал значения для текущего окна а не для предыдущего?
 

qqmber

Почетный гражданин
Можно ли вытащить с этого индюка через iCustom() данные о полосках?

Нельзя, у индикатора слишком много переменных. iCustom(), как и другие функции, может принять только 64 параметра, из которых 5 штук её собственные обязательные. Индикатор с 60 переменными и больше не взлетит.
Это сознательно сделано автором, он об этом писал. Пробуйте третью версию Симфонии, есть мнение, что она вполне работоспособна, и у неё код открыт.
 

sergch

Активный участник
Пробуйте третью версию Симфонии, есть мнение, что она вполне работоспособна, и у неё код открыт.

Спасибо за информацию.
В 3-ей версии тоже запутано все. Он использует дополнительные файлы, тобишь каждая полоса - отдельный индюк и подключает каждый из них через тот же iCustom(). я еще не вникал в логику дальнейших вычислений, но вскорем времени надеюсь это сделать.

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