Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 556

 

Подскажите пожалуйста почему в копированном мною коде с этого сайта перед Magic  компилятор пишет " не объявленный идентификатор" ?

for (int pos=0; pos<=OrdersTotal()-1; pos ++) 
{
 if(OrderSelect (pos, SELECT_BY_POS)==true)
  {if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic &&OrderCloseTime()==0) // если у Вас есть отложенные ордера и открытие
  return;}
 else
  Print("OrderSelect() вернул ошибку - ",GetLastError());
}            
 //продолжае
 
VasiliKolchanov:

Подскажите пожалуйста почему в копированном мною коде с этого сайта перед Magic  компилятор пишет " не объявленный идентификатор" ?

должно быть потому-что он не объявлен

объявите его в начале. или как параметр советника или константу..или переменую, ну хоть как-то..сущность должна существовать :-)

input int Magic=5566; // это чтобы он был в параметрах и можно поменять

// или const int Magic = 8899;

 
VasiliKolchanov:

Подскажите пожалуйста почему в копированном мною коде с этого сайта перед Magic  компилятор пишет " не объявленный идентификатор" ?

Потому что использован идентификатор Magic, тип которого (и значение соответственно) нигде не описано. Нужно объявить переменную (или константу) с таким именем и присвоить ему значение.

 
VasiliKolchanov:

Подскажите пожалуйста почему в копированном мною коде с этого сайта перед Magic  компилятор пишет " не объявленный идентификатор" ?

Потому, что он у вас в коде не объявлен нигде - это же очевидно.
 
Artyom Trishkin:
Потому, что он у вас в коде не объявлен нигде - это же очевидно.
Всем спасибо !
 

Ребята, подскажите как разобраться и с чего начать!

Например: Есть 15 ордеров с лотом 0.01. Надо закрыть в какой либо момент сделку(-и) с обьемом 0.07.

Вопрос как с одним OrderClose(..) закрыть 7 ордеров или обьем 0.07 лота?

Если поставить сразу 0.07 он не видит сделок с объемом 0.01.

Если что новичок в программировании

 
Rustam Bikbulatov:

Ребята, подскажите как разобраться и с чего начать!

Например: Есть 15 ордеров с лотом 0.01. Надо закрыть в какой либо момент сделку(-и) с обьемом 0.07.

Вопрос как с одним OrderClose(..) закрыть 7 ордеров или обьем 0.07 лота?

Если поставить сразу 0.07 он не видит сделок с объемом 0.01.

Если что новичок в программировании

Одним ордером никак не закроешь. Можно только сделать выборку ордеров и последовательно удалять каждый ордер. Причём если удалили ордер меньшего объёма, то у вас остаётся ещё открытый объём. Его-то мы и сравниваем с нашим оставшимся не закрытым объёмом. Закрываем до тех пор пока объём 0.07 не исчерпает себя. Только так.

 
Rustam Bikbulatov:

Ребята, подскажите как разобраться и с чего начать!

Например: Есть 15 ордеров с лотом 0.01. Надо закрыть в какой либо момент сделку(-и) с обьемом 0.07.

Вопрос как с одним OrderClose(..) закрыть 7 ордеров или обьем 0.07 лота?

Если поставить сразу 0.07 он не видит сделок с объемом 0.01.

Если что новичок в программировании

Если брокер разрешает использовать встречное закрытие, то можно открыть один противоположный ордер объемом 0.07, тем самым зафиксировав цену прибыли/убытка для этого объема. Ну а потом все равно потребуется произвести 7 операций закрытия, встречного закрытия (функция OrderCloseBy()). Торговых операций при таком подходе получается больше на одну. Выигрыш в том, что закрытие всех семи ордеров производится по одной цене.

 

Всем привет.

Дайте пожалуйста совет, в основном он о скорости работы советника ну и наверно надежности и правильности написания.

Речь идёт о обращении к открытым и отложенным ордерам в каждом тике и при необходимости их изменение.

В хелпе про OrderSelect написано: "При последовательном выборе ордеров с помощью параметра SELECT_BY_POS информация отдаётся в том порядке, в котором она поступила с торгового сервера."

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

 
Decromor:

Всем привет.

Дайте пожалуйста совет, в основном он о скорости работы советника ну и наверно надежности и правильности написания.

Речь идёт о обращении к открытым и отложенным ордерам в каждом тике и при необходимости их изменение.

В хелпе про OrderSelect написано: "При последовательном выборе ордеров с помощью параметра SELECT_BY_POS информация отдаётся в том порядке, в котором она поступила с торгового сервера."

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

OrderSelect() выполняется внутри терминала, запрос на сервер при этом не производится. Поэтому ничего страшного в обращении к списку ордеров на каждом тике нет. Большинство советников так и делает. 

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

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