Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 557
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
OrderSelect() выполняется внутри терминала, запрос на сервер при этом не производится. Поэтому ничего страшного в обращении к списку ордеров на каждом тике нет. Большинство советников так и делает.
А вот вопрос насчет массива относится уже к архитектуре программы. В случае сложного советника, оперирующего большим количеством ордеров, это просто необходимо. Если же советник оперирует одним ордером с простой логикой, то массив становится излишеством.
Стоит лишь уточнить тот факт, что даже при наличии массива ордеров никак не обойтись без обращения к OrderSelect(). Ведь на каждом тике необходимо проверить, существует еще этот ордер, или нет. Также у него могут быть изменены параметры.
Ребята, подскажите как разобраться и с чего начать!
Например: Есть 15 ордеров с лотом 0.01. Надо закрыть в какой либо момент сделку(-и) с обьемом 0.07.
Вопрос как с одним OrderClose(..) закрыть 7 ордеров или обьем 0.07 лота?
Если поставить сразу 0.07 он не видит сделок с объемом 0.01.
Если что новичок в программировании
Подсказали как сделать счетчик в виде countS.
В минуту должно закрываться по три сделки по 0.01 лота. Теперь возник вопрос как преобразовать чтобы все ордера высчитывались по порядку.
Если будет стоять for(int i=OrdersTotal()-1; i>=0; i--){ идут по порядку с последних ордеров,
Если for(int p=0; p<OrdersTotal(); p++){ то с первых через одного ордера.
Счетчик работает но когда лотность например 0.15 он не закрывает по 0.03 лота а закрывает каждую минуту по 0.01.
Что посоветуете добавить?
Как сделать так чтобы из общей лотности можно было закрыть часть в независимости от количество и лотности ордеров?Подсказали как сделать счетчик в виде countS.
В минуту должно закрываться по три сделки по 0.01 лота. Теперь возник вопрос как преобразовать чтобы все ордера высчитывались по порядку.
Если будет стоять for(int i=OrdersTotal()-1; i>=0; i--){ идут по порядку с последних ордеров,
Если for(int p=0; p<OrdersTotal(); p++){ то с первых через одного ордера.
Счетчик работает но когда лотность например 0.15 он не закрывает по 0.03 лота а закрывает каждую минуту по 0.01.
Что посоветуете добавить?
Как сделать так чтобы из общей лотности можно было закрыть часть в независимости от количество и лотности ордеров?При постановке такой задачи (очень странной, к слову), нужно работать со списком "История счета". На каждой новой итерации следует пройтись по этому списку и найти ордера, которые были закрыты в течение текущей минуты, суммировать их объем. Если объем недостаточен, то отсортировать необходимым (так, как Вам нужно; поэтому не спрашивайте, как, это к Вам вопрос) образом и взять один единственный ордер. Его закрыть на 0.01. На следующей итерации все сначала.
При постановке такой задачи (очень странной, к слову), нужно работать со списком "История счета". На каждой новой итерации следует пройтись по этому списку и найти ордера, которые были закрыты в течение текущей минуты, суммировать их объем. Если объем недостаточен, то отсортировать необходимым (так, как Вам нужно; поэтому не спрашивайте, как, это к Вам вопрос) образом и взять один единственный ордер. Его закрыть на 0.01. На следующей итерации все сначала.
Буду пробовать! спасибо
не могу настроить отправку почтовых сообщений с терминала
раньше работало через майл.ру, сейчас прописываю также, тестовое сообщение не уходит
ктонибудь разбирался с этим ?
если для себя любимого (не на продажу) то правильное лечение проблем с почтой :
1) поднять почтарь на localhost который будет заниматься пересылкой, гарантирует доставку и не заумствует с авторизацией и anti-spam защитой. Иначе советники очень быстро попадают во всевозможные "чёрные" списки.
Это не сложно - есть и встроенный win smtp и бесплатные с простыми настройками, на край можно наскриптовать самому :-)
2) использовать альтернативу SendMail() . Чтобы контролировать весь процесс, отсылать более разумные отчёты, с тегами, флагами, опционально в html`е и с картинками.
когда объединяешь 1+2 получаешь в сумме 3 :-) то есть весьма разумное и стабильное решение.
ещё про отправку почты : https://www.mql5.com/ru/blogs/post/718364
-----
Если нужна помощь про конкретику настройку SendMail и MT, то прикладывайте скриншоты, выдержки из исходников, диагностику ошибок..
чтобы это был не просто "подземный стук"
Правильно ли я понимаю, что "TimeCurrent()" вернет время последнего тика, когда он вызывается из пользовательской функции?
Да
Приветствую!
Обратиться к ордеру можно с помощью команды OrderSelect по его номеру.
Вопрос, возможно ли заранее знать номера существующих ордеров, что бы не перебирать их все? Например запоминать этот номер при открытии нового ордера.
Я так понимаю этот номер присваивается по порядку начиная с 1. Какие могут быть нюансы?
За ранее спасибо.
Приветствую!
Обратиться к ордеру можно с помощью команды OrderSelect по его номеру.
Вопрос, возможно ли заранее знать номера существующих ордеров, что бы не перебирать их все? Например запоминать этот номер при открытии нового ордера.
Я так понимаю этот номер присваивается по порядку начиная с 1. Какие могут быть нюансы?
За ранее спасибо.
OrderSend
OrderSelect
Сломал мозг, помогите пожалуйста!
Написал блок расчета корреляции. Но OANDA и investing.com выдают совершенно иные результаты! Причем забавно - и между собой они не совпадают!
Где я ошибаюсь?
Текущая валютная пара - EURUSD, проверяю корреляцию с GBPUSD.
extern string SubSymbol = "GBPUSD";
extern int correlation_time = 24; // на сколько часов проверять скоррелированность выбранных валютных пар
.....
// ------------------------ блок вычисления корреляции --------------------------------------
int period = 15;
int bars_number = MathRound(correlation_time*60/period);
double symbol_avg = 0;
double subsymbol_avg = 0;
double symbol_price[], subsymbol_price[];
double x,y;
int j;
int shift = 0;
ArrayResize(symbol_price, bars_number);
ArrayResize(subsymbol_price, bars_number);
for (j=0; j < bars_number; j++)
{
symbol_price[j] = (iHigh(NULL,period,j+shift) - iLow(NULL,period,j+shift))/2;
subsymbol_price[j] = (iHigh(SubSymbol,period,j+shift) - iLow(SubSymbol,period,j+shift))/2;
symbol_avg = symbol_avg + symbol_price[j];
subsymbol_avg = subsymbol_avg + subsymbol_price[j];
}
symbol_avg = symbol_avg/bars_number;
subsymbol_avg = subsymbol_avg/bars_number;
double ss_xx = 0;
double ss_xy = 0;
double ss_yy = 0;
for (j=0; j < bars_number; j++)
{
x = symbol_price[j] - symbol_avg;
y = subsymbol_price[j] - subsymbol_avg;
ss_xy = ss_xy + x*y;
ss_xx = ss_xx + x*x;
ss_yy = ss_yy + y*y;
}
double correlation = ss_xy/MathSqrt(ss_xx*ss_yy);
Alert(correlation, " ", bars_number);
ArrayFree(symbol_price);
ArrayFree(subsymbol_price);
// ------------------------ конец блока вычисления корреляции ---------------------------------