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

Ugar

Гуру форума
Привет всем. Есть такой код
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
double fir_or_time = OrderOpenTime();
i = iBarShift(NULL,0,fir_or_time);
}
То есть я задаю свечу первого по времени открытия ордера. Но в итоге сов видит последний ордер. Подскажите, что сделано не так?
А чё у тебя время засовывается в дробную переменную?
 

hoz

Активный участник
High[] - массив, iHigh() - функция, котор обрабатывает массив. Вывод, имхо, очевиден. iHigh нужно для мультивалютных расчетов


Ну почему же сразу мультивалютных... также и мультитаймфреймовых.. Мне как-раз МТФ и интересует.

На предмет укоротить:
PHP:
if(GetStateMa() == MA_TALKING_LONG)
  return(
    High[iHighest(Symbol(),i_ExtremumLookingTF,MODE_HIGH,i_maxValueShiftB,0)]
    -
    Low[iLowest(Symbol(),i_ExtremumLookingTF,MODE_HIGH,i_minValueShiftB,0)]
    >= 7*pt
  );

iLowest(..MODE_HIGH..) - бывает, конечно, но чаще MODE_LOW


А на предмет производительности, когда " одно в другое " помещаю, есть разница? Я имею ввиду, если для хая, то maxValue = iHigh(Symbol(),i_ExtremumLookingTF,i_maxValueShiftB) в

PHP:
if((maxValue - minValue) >= 7*pt)


Я так понимаю, в первом случает, на одну ячейку память эксперт больше занимает в каждом случает, а во втором варианте " всё в одном ".
 
Последнее редактирование:

hoz

Активный участник
eevviill. А почему ты считаешь,что таким образом выберется именно первый по времени ордер?

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

Алекc1234

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

И как же это в коде написать?
 

ale002

::: __,,,^._.^,,,__ :::
Ну почему же сразу мультивалютных... также и мультитаймфреймовых.. Мне как-раз МТФ и интересует.
Часто мультиТФ лучше заменить мультиПериодностью - чтобы не дёргать базу лишний раз

А на предмет производительности, когда " одно в другое " помещаю, есть разница?
Каждая лишняя скобка (это тоже оператор) и переменная отжирают чу-чу ресурсов. А по большому счёту в 99% наших игрушек разница практически незаметна. Но можете поставить свои варианты в большой цикл с выводом времени в журнал перед и после него - узнаете разницу в цифрах


И как же это в коде написать?

Попробьте так

PHP:
datetime tTime = 0;
iPos = OrdersTotal();
while (iPos > 0) {
	iPos--;
	if(OrderSelect(iPos, SELECT_BY_POS)) {
		if(tTime == 0) tTime = OrderOpenTime();
		else if(tTime > OrderOpenTime()) tTime = OrderOpenTime();
	}
}
int iBar = iBarShift(NULL,0,tTime);
 

Rust

Новичок форума
Попадая в цикл, выхода из него нет. Происходит зацикливание. тольео полный перезапуск всего терминала поможет выйти из такого зацикливания.

ТОЧНО. Убрал его, так как он просто был лишним там.
Чуток поэкспериментировал ещё и всё затикало, - тик-так.
- с нормальной отчетностью о содеянном.
СПАСИБО Вам и будьте здоровы !
 

eevviill

Заблокирован
eevviill. А почему ты считаешь,что таким образом выберется именно первый по времени ордер?
Ну потому что очередь ордеров строится по временю их открытия.

p.s. Аааа. Точно точно. Это я последний выбрал.
Правильно так.
PHP:
for(int i=0; i<=OrdersTotal()-1; i++) 
 { 
 if(OrderSelect(i,SELECT_BY_POS))
 { 
 if(OrderMagicNumber()==magic) 
 { 
 if(OrderSymbol()==Symbol()) 
 { 
int fir_or_time = OrderOpenTime();
int i = iBarShift(NULL,0,fir_or_time);
break; 
 } 
 } 
 } 
 }
 
Последнее редактирование:

alexshell

Элитный участник
Ну потому что очередь ордеров строится по временю их открытия.

Я для чего спрашивал. Вот это распрастраненная ошибка. По уумолчанию в терминале очередь так и строится. Но ведь пользователь может поменять сортировку ордеров для своего удобства. Допустим по символу или по прибыли. Он ведь не знает что нельзя менять очередь ордеров. И вся логика советника может рухнуть.По этому нужно все таки задавать проверочные условия для определения нужного ордера. И мы уже железно выберем нужный ордер независимо от того как располагаются ордера в терминале.
 

eevviill

Заблокирован
Ну потому что очередь ордеров строится по временю их открытия.

Я для чего спрашивал. Вот это распрастраненная ошибка. По уумолчанию в терминале очередь так и строится. Но ведь пользователь может поменять сортировку ордеров для своего удобства. Допустим по символу или по прибыли. Он ведь не знает что нельзя менять очередь ордеров. И вся логика советника может рухнуть.По этому нужно все таки задавать проверочные условия для определения нужного ордера. И мы уже железно выберем нужный ордер независимо от того как располагаются ордера в терминале.
Хмм. Не знал что если сортировку поменять то ордера будут по ней выбиратся. Сейчас проверю.
 

Алекc1234

Местный житель
Ну потому что очередь ордеров строится по временю их открытия.

p.s. Аааа. Точно точно. Это я последний выбрал.
Правильно так.
PHP:
for(int i=0; i<=OrdersTotal()-1; i++) 
 { 
 if(OrderSelect(i,SELECT_BY_POS))
 { 
 if(OrderMagicNumber()==magic) 
 { 
 if(OrderSymbol()==Symbol()) 
 { 
int fir_or_time = OrderOpenTime();
int i = iBarShift(NULL,0,fir_or_time);
break; 
 } 
 } 
 } 
 }

eevviill, так работает, только есть одна странность. Как только на одной и той же свече открываются два ордера - сов начинает работать неправильно - не по программе. Если ордера открываются на разных свечах - то сов чётко видит первый ордер. Может, у кого-нибудь есть идеи, отчего так?
 

eevviill

Заблокирован
eevviill, так работает, только есть одна странность. Как только на одной и той же свече открываются два ордера - сов начинает работать неправильно - не по программе. Если ордера открываются на разных свечах - то сов чётко видит первый ордер. Может, у кого-нибудь есть идеи, отчего так?
Идей может быть много, а что ты имеешь ввиду под не правильно работает не понятно.
 

Алекc1234

Местный житель
Идей может быть много, а что ты имеешь ввиду под не правильно работает не понятно.

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

eevviill

Заблокирован
Я потом вычисляю цену первого открытого ордера на этой свече, потом смотрю разницу между ценой открытия и текущей ценой и если она меньше определённого значения, то закрываю ордер. Когда ордера открываются на разных свечах, то всё правильно работает, а когда на одной свече, то ордер не закрывается при выполнении условия...
Так зачем ты это ищешь?
PHP:
int fir_or_time = OrderOpenTime(); 
int i = iBarShift(NULL,0,fir_or_time);

Напиши вместо этого.
PHP:
double Or_Op_Pr=OrderOpenPrice();
 
Последнее редактирование:

Алекc1234

Местный житель
Так зачем ты это ищешь?
PHP:
int fir_or_time = OrderOpenTime(); 
int i = iBarShift(NULL,0,fir_or_time);

Напиши вместо этого.
PHP:
double Or_Op_Pr=OrderOpenPrice();

Всё верно, у меня так и сделано было. Но я торгую отложками и бывают проскальзывания, так что реальный OrderOpenPrice() не всегда точно соответствует заданной по отложке. А это значит, что в тестере сов может сработать по одному, а на реале по другому. Это меня не устраивает, поэтому я и провожу разные вычисления, чтобы обойти проскальзывание
 

eevviill

Заблокирован
Всё верно, у меня так и сделано было. Но я торгую отложками и бывают проскальзывания, так что реальный OrderOpenPrice() не всегда точно соответствует заданной по отложке. А это значит, что в тестере сов может сработать по одному, а на реале по другому. Это меня не устраивает, поэтому я и провожу разные вычисления, чтобы обойти проскальзывание
Ну тогда в перебор можно ввести ещё один фильтр
i
PHP:
f(OrderType()==OP_BUY || OrderType()==OP_SELL)  
 {  
...
}
 
Последнее редактирование:

Алекc1234

Местный житель
Ну тогда в перебор можно ввести ещё один фильтр
i
PHP:
f(OrderType()==OP_BUY || OrderType()==OP_SELL)  
 {  
...
}

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