Нужна помощь новичку - страница 2

 
syncomp:

В процессе написания советника возник еще один вопрос.

Выбор ордеров функцией OrderSelect по номеру позиции. Я так понимваю, что когда отложенный ордер открывается, то изменяется его номер позиции. И не только его. Какой же смысл использовать функцию по pos?

Я к тому, что анализируя код Terminal из учебника подумал о том, что там идет простой перебор ордеров. Но если ордер изменился то порядок Mas_Ord_New и Mas_Ord_Old будет отличаться и тогда весь учет ордеров рухнет.

Ведь в самом терминале МТ4 отложенные ордера стоят ниже строки профита. а потом, когда открываются - перемещаются выше.

Вы неправильно понимаете.

Если внимательно прочитаете справку к функции OrderSelect , то увидите там такой параметр как pool, который может принимать 2 значения: MODE_TRADES и MODE_HISTORY. Так вот MODE_TRADES означает, что ордер выбирается среди открытых и отложенных ордеров. Номер позиции в этом списке (к которому Вы вообще не имеете прямого доступа, но можете определить его экспериментально) совершенно не нужен для работы. Важно лишь то, что пока ордер не закрыт или удален он находится в этом списке. После закрытия/удаления он переходит в список MODE_HISTORY.

Если Вы будете использовать тикеты для выбора своих ордеров, потребуется создать массив для их хранения, корректно помещать в него новые ордера, не затерев существующие, удалять закрывшиеся/удаленные ордера - короче построить целую систему управления только для нахождения своих ордеров. Кроме того, как Вы определите размер массива? Или Ваш советник будет работать только с 2-3 ордерами? И наконец, я совсем не уверен, что вся эта система с хранением тикетов будет работать быстрее и потреблять меньше ресурсов, чем встроенный в терминал список MODE_TRADES. 

Кстати, еще один момент, который Вы никак не сможете реализовать через хранение тикетов. При закрытии ордера частями, оставшаяся на рынке часть получит новый тикет. Как Вы его узнаете?

 

И еще вдогонку. 

Выбирая ордер по тикету Вам придется определять не закрылся ли он. И цена закрытия ордера в этом не поможет. А вот как определить сей факт предоставляю Вам самому найти (в качестве наказания))))))). (шутка)

 
syncomp:

Все равно никак не пойму.

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

 

 Функция «Торговые события в МТ4», Events.mq4 (8.6 Kb). Автор:  komposter. https://www.mql5.com/ru/code/8234. (Описание в статье События в МetaТrader 4).

 
Roll огромное спасибо за ссылку. Статья практически полностью мне все разъяснила.
 

Люди!!! Не пойму!!! В MT4 не работают циклы!!! Это как???!!! for и while!!! Компилятор говорит, что все нормально!!!

Вот простейший код, но он не работает!!!!:

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   for(int i=0;i>10;i++) Comment(i);
//----
   return(0);
  }
//+------------------------------------------------------------------+

 
syncomp:

Люди!!! Не пойму!!! В MT4 не работают циклы!!! Это как???!!! for и while!!! Компилятор говорит, что все нормально!!!

Вот простейший код, но он не работает!!!!:

Не нужно ВЫСОКОПАРНЫХ слов, сначала внимательно посмотрите на свой код!!!

for (int i = 0;i < 10; i++) 
 
TarasBY:

Не нужно ВЫСОКОПАРНЫХ слов, сначала внимательно посмотрите на свой код!!!

Извиняюсь, не понял логику условия работы цикла...
 
Все, написал советник. Уже на демосчете тестирую. Полет пока отменный!!!!
 
midorum:

в функции start() строите такую конструкцию:

 как только ордер откроется он попадет в нужную секцию

ps разумеется набор условий по отбору нужных ордеров и набор типов отложек подбираете под себя 


спасибо, тоже помогло, искал такое же решение))

написал своё с использованием маджика, но так удобнее и компактнее, ещё раз спасибо) 

 

Еще проблема. Бывает так, что ордер по функции OrderSend не открывается. уже sleepage менял...Через GetLasterror не хочу обрабатывать.

выход увидел такой - пока номер ордера не назначен (равен 0), то ордер не открылся, не важно по какой ошибке.

ticket=0;

while(ticket==0) ticket=OrderSend....;

Что не так?

Как зациклить до бесконечности пока ордер не откроется?

Причина обращения: