Такой код будет работать? - страница 2

 
Перед каждым OrderClose надо OrderSelect с проверкой - нормально ли выбрался ордер.
Код я не смотрел, но дело было, скорее всего, именно в этом ;)
 
Спасибо, думаю Вы правы. А можно пример пожалуйста?
OrderSelect с проверкой - нормально ли выбрался ордер
 
А в хелпе посмотреть?)
Нельзя быть таким ленивым ;)
 
komposter:
Нельзя быть таким ленивым ;)
А без нотаций? ;)
 
Спасибо. Ясное дело, я в хэлпе смотрел, понимаю с трудом этот грёбаный ордерселект. Вот специально кодик черканул для себя, чтоб понять что там к чему. Объясните если не сложно на пальцах и извините за тупость
extern int mt=5; int err; int Pause=1000; void start(int t,int tt,bool o,double Lots=0.1) { for(int j=0;j<mt;j++) { Print("open # ",j); t=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,10,1,"",0,MN,Red); OrderSelect(j,SELECT_BY_POS,MODE_TRADES); Print("ordt= ",OrderTicket()); if (t>0){continue; } else { err=GetLastError(); Print("OrderSend failed with error #",err," : ",ErrorDescription(err)); } Print("result open = ",t); } Print("OrdersTotal = ",OrdersTotal()); for(int i=0;i<OrdersTotal();i++) { Print("i = ",i); o=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); Print("i after select = ",i); Print("OrderSelect = ",o); tt=OrderClose(OrderTicket(),Lots,Bid,3,White); if (tt>0) {Print("result close = ",tt);} else { err=GetLastError(); Print("OrderClose failed with error #",err," : ",ErrorDescription(err)); } } }

И вот результат блин

1 2006.01.17 00:00 sell 1 0.10 1.2114 10.0000 1.0000 0.00 10000.00
2 2006.01.17 00:00 sell 2 0.10 1.2114 10.0000 1.0000 0.00 10000.00
3 2006.01.17 00:00 sell 3 0.10 1.2114 10.0000 1.0000 0.00 10000.00
4 2006.01.17 00:00 sell 4 0.10 1.2114 10.0000 1.0000 0.00 10000.00
5 2006.01.17 00:00 sell 5 0.10 1.2114 10.0000 1.0000 0.00 10000.00
6 2006.01.17 00:00 close 1 0.10 1.2117 10.0000 1.0000 -3.00 9997.00
7 2006.01.17 00:00 close 3 0.10 1.2117 10.0000 1.0000 -3.00 9994.00
8 2006.01.17 00:00 close 5 0.10 1.2117 10.0000 1.0000 -3.00 9991.00
9 2006.01.17 04:00 sell 6 0.10 1.2102 10.0000 1.0000 0.00 9991.00
10 2006.01.17 04:00 sell 7 0.10 1.2102 10.0000 1.0000 0.00 9991.00
11 2006.01.17 04:00 sell 8 0.10 1.2102 10.0000 1.0000 0.00 9991.00
12 2006.01.17 04:00 sell 9 0.10 1.2102 10.0000 1.0000 0.00 9991.00
13 2006.01.17 04:00 sell 10 0.10 1.2102 10.0000 1.0000 0.00 9991.00
14 2006.01.17 04:00 close 2 0.10 1.2105 10.0000 1.0000 9.00 10000.00
15 2006.01.17 04:00 close 6 0.10 1.2105 10.0000 1.0000 -3.00 9997.00
16 2006.01.17 04:00 close 8 0.10 1.2105 10.0000 1.0000 -3.00 9994.00
17 2006.01.17 04:00 close 10 0.10 1.2105 10.0000 1.0000 -3.00 9991.00
18 2006.01.17 08:00 sell 11 0.10 1.2120 10.0000 1.0000 0.00 9991.00
19 2006.01.17 08:00 sell 12 0.10 1.2120 10.0000 1.0000 0.00 9991.00
20 2006.01.17 08:00 sell 13 0.10 1.2120 10.0000 1.0000 0.00 9991.00
21 2006.01.17 08:00 sell 14 0.10 1.2120 10.0000 1.0000 0.00 9991.00
22 2006.01.17 08:00 sell 15 0.10 1.2120 10.0000 1.0000 0.00 9991.00
23 2006.01.17 08:00 close 4 0.10 1.2123 10.0000 1.0000 -9.00 9982.00
24 2006.01.17 08:00 close 9 0.10 1.2123 10.0000 1.0000 -21.00 9961.00
25 2006.01.17 08:00 close 12 0.10 1.2123 10.0000 1.0000 -3.00 9958.00
26 2006.01.17 08:00 close 14 0.10 1.2123 10.0000 1.0000 -3.00 9955.00
27 2006.01.17 12:00 sell 16 0.10 1.2107 10.0000 1.0000 0.00 9955.00
28 2006.01.17 12:00 sell 17 0.10 1.2107 10.0000 1.0000 0.00 9955.00
29 2006.01.17 12:00 sell 18 0.10 1.2107 10.0000 1.0000 0.00 9955.00
30 2006.01.17 12:00 sell 19 0.10 1.2107 10.0000 1.0000 0.00 9955.00
31 2006.01.17 12:00 sell 20 0.10 1.2107 10.0000 1.0000 0.00 9955.00
32 2006.01.17 12:00 close 7 0.10 1.2110 10.0000 1.0000 -8.00 9947.00
33 2006.01.17 12:00 close 13 0.10 1.2110 10.0000 1.0000 10.00 9957.00
34 2006.01.17 12:00 close 16 0.10 1.2110 10.0000 1.0000 -3.00 9954.00
35 2006.01.17 12:00 close 18 0.10 1.2110 10.0000 1.0000 -3.00 9951.00
36 2006.01.17 12:00 close 20 0.10 1.2110 10.0000 1.0000 -3.00 9948.00
37 2006.01.17 16:00 sell 21 0.10 1.2065 10.0000 1.0000 0.00 9948.00
38 2006.01.17 16:00 sell 22 0.10 1.2065 10.0000 1.0000 0.00 9948.00
39 2006.01.17 16:00 sell 23 0.10 1.2065 10.0000 1.0000 0.00 9948.00
40 2006.01.17 16:00 sell 24 0.10 1.2065 10.0000 1.0000 0.00 9948.00
41 2006.01.17 16:00 sell 25 0.10 1.2065 10.0000 1.0000 0.00 9948.00
42 2006.01.17 16:00 close 11 0.10 1.2068 10.0000 1.0000 52.00 10000.00
43 2006.01.17 16:00 close 17 0.10 1.2068 10.0000 1.0000 39.00 10039.00
44 2006.01.17 16:00 close 21 0.10 1.2068 10.0000 1.0000 -3.00 10036.00
45 2006.01.17 16:00 close 23 0.10 1.2068 10.0000 1.0000 -3.00 10033.00
46 2006.01.17 16:00 close 25 0.10 1.2068 10.0000 1.0000 -3.00 10030.00
47 2006.01.17 20:00 sell 26 0.10 1.2080 10.0000 1.0000 0.00 10030.00
48 2006.01.17 20:00 sell 27 0.10 1.2080 10.0000 1.0000 0.00 10030.00
49 2006.01.17 20:00 sell 28 0.10 1.2080 10.0000 1.0000 0.00 10030.00
50 2006.01.17 20:00 sell 29 0.10 1.2080 10.0000 1.0000 0.00 10030.00
51 2006.01.17 20:00 sell 30 0.10 1.2080 10.0000 1.0000 0.00 10030.00
52 2006.01.17 20:00 close 15 0.10 1.2083 10.0000 1.0000 37.00 10067.00
53 2006.01.17 20:00 close 22 0.10 1.2083 10.0000 1.0000 -18.00 10049.00
54 2006.01.17 20:00 close 26 0.10 1.2083 10.0000 1.0000 -3.00 10046.00
55 2006.01.17 20:00 close 28 0.10 1.2083 10.0000 1.0000 -3.00 10043.00
56 2006.01.17 20:00 close 30 0.10 1.2083 10.0000 1.0000 -3.00 10040.00
57 2006.01.17 20:00 close at stop 29 0.10 1.2083 10.0000 1.0000 -3.00 10037.00
58 2006.01.17 20:00 close at stop 27 0.10 1.2083 10.0000 1.0000 -3.00 10034.00
59 2006.01.17 20:00 close at stop 24 0.10 1.2083 10.0000 1.0000 -18.00 10016.00
60 2006.01.17 20:00 close at stop 19 0.10 1.2083 10.0000 1.0000 24.00 10040.00
А вот журнал елкипалки
01:50:27 template inputs: mt=5;
01:50:27 2006.01.17 00:00 template EURUSD,H4: open # 0
01:50:27 2006.01.17 00:00 template EURUSD,H4: open #1 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 00:00 template EURUSD,H4: ordt= 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: open # 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: open #2 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 00:00 template EURUSD,H4: ordt= 2
01:50:27 2006.01.17 00:00 template EURUSD,H4: open # 2
01:50:27 2006.01.17 00:00 template EURUSD,H4: open #3 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 00:00 template EURUSD,H4: ordt= 3
01:50:27 2006.01.17 00:00 template EURUSD,H4: open # 3
01:50:27 2006.01.17 00:00 template EURUSD,H4: open #4 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 00:00 template EURUSD,H4: ordt= 4
01:50:27 2006.01.17 00:00 template EURUSD,H4: open # 4
01:50:27 2006.01.17 00:00 template EURUSD,H4: open #5 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 00:00 template EURUSD,H4: ordt= 5
01:50:27 2006.01.17 00:00 template EURUSD,H4: OrdersTotal = 5
01:50:27 2006.01.17 00:00 template EURUSD,H4: i = 0
01:50:27 2006.01.17 00:00 template EURUSD,H4: i after select = 0
01:50:27 2006.01.17 00:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: close #1 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 at price 1.2117
01:50:27 2006.01.17 00:00 template EURUSD,H4: result close = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: i = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: i after select = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: close #3 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 at price 1.2117
01:50:27 2006.01.17 00:00 template EURUSD,H4: result close = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: i = 2
01:50:27 2006.01.17 00:00 template EURUSD,H4: i after select = 2
01:50:27 2006.01.17 00:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: close #5 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 at price 1.2117
01:50:27 2006.01.17 00:00 template EURUSD,H4: result close = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: open # 0
01:50:27 2006.01.17 04:00 template EURUSD,H4: open #6 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 04:00 template EURUSD,H4: ordt= 2
01:50:27 2006.01.17 04:00 template EURUSD,H4: open # 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: open #7 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 04:00 template EURUSD,H4: ordt= 4
01:50:27 2006.01.17 04:00 template EURUSD,H4: open # 2
01:50:27 2006.01.17 04:00 template EURUSD,H4: open #8 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 04:00 template EURUSD,H4: ordt= 6
01:50:27 2006.01.17 04:00 template EURUSD,H4: open # 3
01:50:27 2006.01.17 04:00 template EURUSD,H4: open #9 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 04:00 template EURUSD,H4: ordt= 7
01:50:27 2006.01.17 04:00 template EURUSD,H4: open # 4
01:50:27 2006.01.17 04:00 template EURUSD,H4: open #10 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 ok
01:50:27 2006.01.17 04:00 template EURUSD,H4: ordt= 8
01:50:27 2006.01.17 04:00 template EURUSD,H4: OrdersTotal = 7
01:50:27 2006.01.17 04:00 template EURUSD,H4: i = 0
01:50:27 2006.01.17 04:00 template EURUSD,H4: i after select = 0
01:50:27 2006.01.17 04:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: close #2 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 at price 1.2105
01:50:27 2006.01.17 04:00 template EURUSD,H4: result close = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: i = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: i after select = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: close #6 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 at price 1.2105
01:50:27 2006.01.17 04:00 template EURUSD,H4: result close = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: i = 2
01:50:27 2006.01.17 04:00 template EURUSD,H4: i after select = 2
01:50:27 2006.01.17 04:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: close #8 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 at price 1.2105
01:50:27 2006.01.17 04:00 template EURUSD,H4: result close = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: i = 3
01:50:27 2006.01.17 04:00 template EURUSD,H4: i after select = 3
01:50:27 2006.01.17 04:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 04:00 template EURUSD,H4: close #10 sell 0.10 EURUSD at 1.2102 sl: 10.0000 tp: 1.0000 at price 1.2105
01:50:27 2006.01.17 04:00 template EURUSD,H4: result close = 1
...............................
Плиз, объясните, почему открываются ордера по очереди, а закрываются через один!?!? Уверен, это не глюк МТ, а мой собственный...

И ещё- тут кто-то писал, и так и недописал- об нормализации асков и бидов. Так что- действительно надо писать так-
?????
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,4),3,10,1,"",0,MN,Red);
 
Смысл операции OrderSelect() в том, чтоб могли корректно работать торговые функции.
Сначала надо OrderSelect(), а потом, например, OrderSend().
В первом цикле for() в приведенном коде сделано наоборот.

Вот пример использования OrderSelect(). Функция анализирует состояние терминала.
OrderSelect() выполнена один раз, а далее - несколько обращений к ордеру без какой бы то ни было ссылки на него.
int AG_Terminal_scr() { //=============================================================================================== Предопределения ==== ArrayCopy(Mas_Ord_Old, Mas_Ord_Tek); // Сохраняем предыдущую историю Kol=0; for (i=0; i<=6; i++) Mas_Tip[i]=0; // Обнуление массива типов ордеров ArrayInitialize(Mas_Ord_Tek,0); // Обнуление массива //================================================================================================ Анализ ордеров ==== for (i=1; i<=OrdersTotal(); i++) // По всем ордерам терминала { if((OrderSelect(i-1, SELECT_BY_POS)==true) && (OrderSymbol()==Symbol())) // Если есть следующий и наша вал.пара { Kol++; // Считаем общее количество ордеров //--------------------------------------------------------------------------- Формирование нового массива ордеров ---- Mas_Ord_Tek[Kol][1] = NormalizeDouble( OrderOpenPrice() ,Digits); // Курс открытия ордера Mas_Ord_Tek[Kol][2] = NormalizeDouble( OrderStopLoss() ,Digits); // Курс SL Mas_Ord_Tek[Kol][3] = NormalizeDouble( OrderTakeProfit(),Digits); // Курс ТР Mas_Ord_Tek[Kol][4] = OrderTicket(); // Номер ордера Mas_Ord_Tek[Kol][5] = OrderLots(); // Количество лотов // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tip_Ord = OrderType()+1; // +1 - это дело вкуса Mas_Tip[Tip_Ord]++; // Попутно считаем кол. ордеров разн. типов Mas_Ord_Tek[Kol][6]=Tip_Ord; // Тип ордера //-------------------------------------------------------------------------------------------------------------------- } } Mas_Ord_Tek[0][0] = Kol; // Сохраняем в нулевую ячеечку //==================================================================================================================== return(1); }

--------------

В OrderSend() нормализовать биды и аски не нужно. Это не ошибка, прото в этом нет необходимости.
Речь шла о корректном срабатывании оператора сравнения при его работе с действительными числами.
Дело в том, что 1.5000 не всегда такое. Оно иногда отбражается так, а на самом деле 1.49999(9). Я не знаю сколько там девяток.
Или может оказаться, что это число 1.500001.
После нормализации эти числа строгие до указанного количества знаков. Попутно - это не всегда 4. Смотри в словаре Digits.
 
Спасибо. Смысл функции мне ясен. Функция выбирает ордер из всех какие были или есть по 2-м признакам- либо по тикету, либо по позиции.
SELECT_BY_POS - позиция ордера среди открытых и отложенных ордеров
- вот это не понимаю- что за позиция? То есть открыли пару ордеров, пару закрыли, если выбрано MODE_TRADES , то те, что открыты или висят расставлены по времени установки, а позиция- это номер ордера в этом списке??? Извините за тупость, ну никак не доходит...
И ещё-
В первом цикле for() в приведенном коде сделано наоборот.
Так там же OrderSend!!! Как его можно Select перед тем, как Send??? Я его селектнул после того, как сэнднул, чтобы посмотреть какой ему тикет присвоили. А вот почему закрываются они через 1- не могу понять. Мне кажется, что в результате моего кода сначала должны открыться 5 ордеров, а потом- все по очереди закрыться.
Print("i = ",i); o=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); Print("i after select = ",i);

а результат

01:50:27 2006.01.17 00:00 template EURUSD,H4: i = 2
01:50:27 2006.01.17 00:00 template EURUSD,H4: i after select = 2
01:50:27 2006.01.17 00:00 template EURUSD,H4: OrderSelect = 1
01:50:27 2006.01.17 00:00 template EURUSD,H4: close #5 sell 0.10 EURUSD at 1.2114 sl: 10.0000 tp: 1.0000 at price 1.2117
01:50:27 2006.01.17 00:00 template EURUSD,H4: result close = 1
Вот это не понимаю!!! Почему #5 закрылся, а не #2???
Не ленивый я, просто туговат...
 
Сначала надо OrderSelect(), а потом, например, OrderSend().
Что за глупости?)
зачем для ордерсенда ордерселект???

Он нужен для работы с ордером, и всё. Для отправки нового ордера ничего выбирать не надо ;)
 
- вот это не понимаю- что за позиция? То есть открыли пару ордеров, пару закрыли, если выбрано MODE_TRADES , то те, что открыты или висят расставлены по времени установки, а позиция- это номер ордера в этом списке??? Извините за тупость, ну никак не доходит...
И ещё-
позиция - порядковый № ордера в терминале (НЕ тикет, а именно № в списке)

Так там же OrderSend!!! Как его можно Select перед тем, как Send???
согласен =)

Я его селектнул после того, как сэнднул, чтобы посмотреть какой ему тикет присвоили
для этого можно посмотреть, что вернула ф-ция ОрдерСенд:
int ticket = OrderSend(......);

Вот это не понимаю!!! Почему #5 закрылся, а не #2???
Не ленивый я, просто туговат...
Потому что у ордера с тикетом №5 ПОЗИЦИЯ №2!
Если выбирать по тикету, этого не будет ;)

зы: OrderClose - это bool а не int =)
 
komposter:
Сначала надо OrderSelect(), а потом, например, OrderSend().
Что за глупости?)
зачем для ордерсенда ордерселект???

Он нужен для работы с ордером, и всё. Для отправки нового ордера ничего выбирать не надо ;)
Ну, конечно же, глупость. Извините, эт я под конец дня совсем отупел. . Бывает.
Причина обращения: