Добрый день. Вопрос по массивам. Вопрос: в моем роботе обработка позиций идёт через массив структур и есть необходимость уменьшать весь массив с начала, то есть есть массив из 100 структур, первые 80 уже отработаны и нужно оставить в оригинальном массиве только последние 20 в самом начале массива. Флаг того, что позиция ещё открыта хранится при этом как элемент структуры.
struct p{
double trailingProfit;
int orders[10];
bool flagOpen;// флаг , указывающий на открытость позиции
//тут еще куча связанных параметров
};
p order[];
int OrderN=-1;
int OnInit()
{
ArrayResize(pair,1,1000);
return(INIT_SUCCEEDED);
}
void openOrder(price){
OrderN++;
int t;
ArrayResize(orders,order+1);
t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);
for(intj=0,j<10,++j){
if(orders[OrderN].orders==0) orders[OrderN].orders=t;
break;
}
orders[OrderN].flagOpen=1;
}
//...... тут идет обработка позиций...
void massCut(){
// нужна вот такая функция
}
Когда советник долго работает - массив становится слишком большой для обработки, и есть необходимость его уменьшать. Все старые закрытые ордера находятся в начале, все что находится после первого найденного открытого ордера - надо оставить.
И еще вопрос: как сохранить весь массив при перезагрузке терминала или других ошибках, не связанныйх с работой рынка/терминала, ведущих к сбоям.
Обрати внимание на копирование массивов. Массив можно копировать "сам в себя"... В данном случае можно скопировать массив начиная с индекса 80 до конца в себя начиная с нулевого индекса. А потом изменить размер массива в меньшую сторону. Таким образом последние записи переместятся в начало, и не нужные будут удалены. Во время добавления элементов массива размер его увеличивать.
Второй вариант, для проверки, изменить направление индексации, убавить размер массива и затем вернуть направление индексации...
- www.mql5.com
при появлении нового ордера - пересматриваем массив и записываем его в отработанную ячейку. Если такой нет - увеличиваем размер массива...
или можно делать что-то типа сортировки - пересматриваем массив и перемещаем рабочие ордера в начало массива, а потом уменьшаем размер.
Копирование массива, изменение размера (переаллокация) - очень затратные в плане производительности операции. Целесообразнее в OnInit выделить массив максимального разрешенного у брокера количества ордеров (обычно 100-200) и использовать счетчик элементов.
Лучше при закрытии ордера, копировать на его место последний элемент массива и уменьшать счетчик элементов. Это наиболее простое и эффективное решение (конечно если не важна сортировка)
Если у вас закрытые ордера оказываются в начале массива не просто так, то очень легко сделать, чтобы они оказывались в конце массива, далее уменьшаем счетчик элементов и все :)
Копирование массива, изменение размера (переаллокация) - очень затратные в плане производительности операции. Целесообразнее в OnInit выделить массив максимального разрешенного у брокера количества ордеров (обычно 100-200) и использовать счетчик элементов.
Лучше при закрытии ордера, копировать на его место последний элемент массива и уменьшать счетчик элементов. Это наиболее простое и эффективное решение (конечно если не важна сортировка)
Если у вас закрытые ордера оказываются в начале массива не просто так, то очень легко сделать, чтобы они оказывались в конце массива, далее уменьшаем счетчик элементов и все :)
Есть достоверные длительные тесты подтверждающие это высказывание?
Здесь есть
- www.mql5.com
Есть достоверные длительные тесты подтверждающие это высказывание?
Здесь есть
Копирование массива, изменение размера (переаллокация) - очень затратные в плане производительности операции. Целесообразнее в OnInit выделить массив максимального разрешенного у брокера количества ордеров (обычно 100-200) и использовать счетчик элементов.
Лучше при закрытии ордера, копировать на его место последний элемент массива и уменьшать счетчик элементов. Это наиболее простое и эффективное решение (конечно если не важна сортировка)
Насколько быстрее в тестере отрабатывает такой менеджер ордеров, по сравнению со штатным? Дело в том, что для обнаружения закрытости ордера требуется как раз воспользоваться штатным менеджером ордеров. Если не обращаться, то это надо писать маленький кусочек своего тестера, но вряд ли Вы пошли по этому пути. Поэтому не совсем понимаю, где может выйти экономия от собственного менеджера ордеров.
Если у вас закрытые ордера оказываются в начале массива не просто так, то очень легко сделать, чтобы они оказывались в конце массива, далее уменьшаем счетчик элементов и все :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день. Вопрос по массивам. Вопрос: в моем роботе обработка позиций идёт через массив структур и есть необходимость уменьшать весь массив с начала, то есть есть массив из 100 структур, первые 80 уже отработаны и нужно оставить в оригинальном массиве только последние 20 в самом начале массива. Флаг того, что позиция ещё открыта хранится при этом как элемент структуры.
struct p{
double trailingProfit;
int orders[10];
bool flagOpen;// флаг , указывающий на открытость позиции
//тут еще куча связанных параметров
};
p order[];
int OrderN=-1;
int OnInit()
{
ArrayResize(pair,1,1000);
return(INIT_SUCCEEDED);
}
void openOrder(price){
OrderN++;
int t;
ArrayResize(orders,order+1);
t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);
for(intj=0,j<10,++j){
if(orders[OrderN].orders==0) orders[OrderN].orders=t;
break;
}
orders[OrderN].flagOpen=1;
}
//...... тут идет обработка позиций...
void massCut(){
// нужна вот такая функция
}
Когда советник долго работает - массив становится слишком большой для обработки, и есть необходимость его уменьшать. Все старые закрытые ордера находятся в начале, все что находится после первого найденного открытого ордера - надо оставить.
И еще вопрос: как сохранить весь массив при перезагрузке терминала или других ошибках, не связанныйх с работой рынка/терминала, ведущих к сбоям.