Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 66
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
я теоретически знаю почему это произошло, поэтому вопрос, можно кратко о применении массивов?
где нужно инициализировать, удалять и обрабатывать чтоб все после этого работало
P.S
когда забанили в гугле это выглядит примерно вот так:
А почему ты решил что это из-за массива???
нужно
1) где - то создать (в глобальной области, как функцию, в онинит или в онтик?)
2) записывать в него каждый тикет при отправке ордера с присвоением ему номера по порядку
3) вытаскивать их оттуда по мере надобности через номер
4) при закрытии всей сетки обнулять параметры
Не нужно вам его постоянно в памяти держать. Когда нужно найти - вызываете функцию, внутри которой будет локальный массив, в который вы запишете в цикле все ордера/позиции, отсортируете массив как вам нужно, выберите из него нужные ордера, сделаете с ними всё, что нужно, и при выходе из функции забудете про этот локальный массив. При следующем вызове функции она вам посчитает уже те ордера/позиции, которые будут на данный момент вызова, и сделает с ними опять то же самое. И не нужен вам никакой глобальный массив, за которым постоянно следить и контролировать нужно - дешевле выйдет.
Ну не знаю на сколько дешевле. Для каждой ситуации своё решение. В MQL4 нет события OnTradeTransaction() но как-то надо следить за "своими" ордерами... тут и поможет массив глобального уровня переменных.
Только представь что на счёте работает несколько советников, один с тяжёлыми расчётами, а другой с бешеным количеством ордеров... Как будет работать с тяжёлыми расчётами??? Ему ещё и перебор огромного количества ордеров подсунуть? Вообще без перебора конечно не обойтись, но минимизировать эту процедуру желательно.
А определение закрылся-ли ордер??? Перебирать всю историю? Не слишком-ли затратно?
потому что до этого ни разу подобного не случалось, а если произошло где - то я допустил ошибку, поэтому и обращаюсь сюда. Можно разбираться и самому, только на это уходит намного больше времени.
Как ты понял из предыдущего моего поста, я использую массивы достаточно часто и проблем из-за них никогда не испытывал. Однажды писал советник который открывал больше 2000 ордеров тикеты которых сохранялись в массив и ничего, никаких проблем. Что-то не могу я поверить что проблемы из-за массива. Да и где можно ошибку сделать чтобы вылезли такие проблемы???
Вспомнился фильм "Не может быть"... "Губит людей не пиво, губит людей вода"...
Ну не знаю на сколько дешевле. Для каждой ситуации своё решение. В MQL4 нет события OnTradeTransaction() но как-то надо следить за "своими" ордерами... тут и поможет массив глобального уровня переменных.
Только представь что на счёте работает несколько советников, один с тяжёлыми расчётами, а другой с бешеным количеством ордеров... Как будет работать с тяжёлыми расчётами??? Ему ещё и перебор огромного количества ордеров подсунуть? Вообще без перебора конечно не обойтись, но минимизировать эту процедуру желательно.
А определение закрылся-ли ордер??? Перебирать всю историю? Не слишком-ли затратно?
Всё решаемо.
У меня, например, давно уже сделан класс, который и следит за всем этим. Можно создавать/удалять динамически объекты класса под каждый символ, магик, таймфрейм, или всё для одного счёта, или их комбинации - на выбор. Любой необходимый цикл поиска уже выполнен на новом тике один раз, и есть все нужные данные. Конечно, бывает так, что не обойтись без ещё одного цикла всё же, но это второй дополнительный цикл на тик. А не в каждой функции свой цикл - это ужасная растрата ресурсов.
Всё решаемо.
У меня, например, давно уже сделан класс, который и следит за всем этим. Можно создавать/удалять динамически объекты класса под каждый символ, магик, таймфрейм, или всё для одного счёта, или их комбинации - на выбор. Любой необходимый цикл поиска уже выполнен на новом тике один раз, и есть все нужные данные. Конечно, бывает так, что не обойтись без ещё одного цикла всё же, но это второй дополнительный цикл на тик. А не в каждой функции свой цикл - это ужасная растрата ресурсов.
Не нужно вам его постоянно в памяти держать. Когда нужно найти - вызываете функцию, внутри которой будет локальный массив, в который вы запишете в цикле все ордера/позиции, отсортируете массив как вам нужно, выберите из него нужные ордера, сделаете с ними всё, что нужно, и при выходе из функции забудете про этот локальный массив. При следующем вызове функции она вам посчитает уже те ордера/позиции, которые будут на данный момент вызова, и сделает с ними опять то же самое. И не нужен вам никакой глобальный массив, за которым постоянно следить и контролировать нужно - дешевле выйдет.
ок, вот упрощенный вид
Если массив локальный куда его пихать? явно не в онтик.
{
if(FindLastOType()==OP_BUY) //+------ если последний покупка
{
if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
{
TotalClose();
}
else
if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
{
ticket=OrderSend(Symbol(),OP_BUY,(лот2ордера+лот4ордера),Ask,50,0,0,"",Magic,0,clrAzure);
}
}
}
ок, вот упрощенный вид
Если массив локальный куда его пихать? явно не в онтик.
{
if(FindLastOType()==OP_BUY) //+------ если последний покупка
{
if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
{
TotalClose();
}
else
if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
{
ticket=OrderSend(Symbol(),OP_BUY,(лот2ордера+лот4ордера),Ask,50,0,0,"",Magic,0,clrAzure);
}
}
}
{
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
int BytesWritten[1]={0};
// Get the length of the string
int szData=StringLen(DataToWrite);
// Do the write
WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);
// Return true if the number of bytes written matches the expected number
return (BytesWritten[0] == szData);
}
хочу записать в файл строку с переводами на новую строку, но не выходит, этот код отсюда https://www.mql5.com/en/forum/118999
этот код вообще и пишет строку с пробелами после каждой буквы, мне нужно замену найти FileWrite() но рабочую