запоминать в свою структуру или массив нужные цены с тикетами и еще может что нужно, время например, и сразу сортировать после добавления по цене. По ресурсам, если ищите не часто, то одинаково или немного дороже, а если часто, то лучше запоминать. Ну и если конечно у Вас не 100500 ордеров) Тогда тоже накладно может быть. В общем сортировка в структуре или многомерном массиве задача решена только для первого индекса к сожалению.
Иногда пользую несколько одномерных массивов с одинаковыми индексами, тикеты, время, цены. И поиск по индексу нужного свойства. Получаем индекс например меньшего времени или большей цены и получаем тикет нужного ордера. Костыль конечно, но работает понятно.
запоминать в свою структуру или массив нужные цены с тикетами и еще может что нужно, время например, и сразу сортировать после добавления по цене. По ресурсам, если ищите не часто, то одинаково или немного дороже, а если часто, то лучше запоминать. Ну и если конечно у Вас не 100500 ордеров) Тогда тоже накладно может быть. В общем сортировка в структуре или многомерном массиве задача решена только для первого индекса к сожалению.
Иногда пользую несколько одномерных массивов с одинаковыми индексами, тикеты, время, цены. И поиск по индексу нужного свойства. Получаем индекс например меньшего времени или большей цены и получаем тикет нужного ордера. Костыль конечно, но работает понятно.
У меня сделано так:
enum MT_ORD_STATE
{
ORD_NA, // Not available
ORD_SENT,
ORD_ACTIVE,
ORD_CHANGE_SENT,
ORD_DEL_SENT
};
struct MTOrder
{
ulong id;
ulong Ticket;
datetime Time;
datetime TimeNotFound;
double Price;
double Vol;
double VolInit;
uint request_id;
ENUM_ORDER_TYPE Type;
ENUM_ORDER_STATE State;
MT_ORD_STATE MTState;
int Reserved;
bool Idf; // Identified
};
...
MTOrder Orders[]; // С начала массива - ордера на покупку, по убыванию цены,// С конца - на продажу, по возрастанию
Массив всегда отсортирован, новый ордер вставляется в нужую точку, со сдвигом других ордеров, при удалении ордера идёт сдвиг.
bool Tr2MT::UpdOrder(int n) // Только если есть тикет или угадываем
{
string str;
int i;
bool flag=false;
MTOrder ord_tmp={0};
ulong ticket=Orders[n].Ticket;
if(ticket==0)
{
if(!GuessOrdTicket(n))returnfalse; // Если угадываем - он будет в Orders[n].Ticketelse ticket=Orders[n].Ticket;
}
switch(FindOrder(ticket,Orders[n].Time+100000))
{
case ORD_FOUND: //изменён или просто проверка//update (sync) orderif(Orders[n].Price==OrderGetDouble(ORDER_PRICE_OPEN)) // Цена не изменилась
{
if(Orders[n].State==(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)&&Orders[n].MTState!=ORD_NA)
{
if(Orders[n].Vol==OrderGetDouble(ORDER_VOLUME_CURRENT))
returntrue; // Не нужно сохранять состояние, можно сразу выйтиelse
Orders[n].Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
}
else
{
//Orders[n].State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
SetOrdState(Orders[n],(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)); // Обнулит и TimeNotFoundif(Orders[n].Vol!=OrderGetDouble(ORDER_VOLUME_CURRENT))
Orders[n].Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
}
}
else// Цена изменилась
{
ord_tmp=Orders[n];
//ord_tmp.State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
SetOrdState(ord_tmp,(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE));
ord_tmp.Price=OrderGetDouble(ORDER_PRICE_OPEN);
ord_tmp.Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
switch(Orders[n].Type)
{
caseORDER_TYPE_BUY:
caseORDER_TYPE_BUY_LIMIT:
if(ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
{
for(i=n;i>=0;i--)
{
if(i==0// Конец массива ордеров
|| ord_tmp.Price<=Orders[i-1].Price) // Следующий - по большей цене, вставляем перед ним
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i-1]; // Сдвигаем следующий элемент
}
}
}
else// Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
{
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1// Конец массива ордеров
|| Orders[i+1].Ticket==0// Следующий элемент пустой
|| ord_tmp.Price>Orders[i+1].Price // Следующий - по меньшей цене, вставляем перед ним
|| Orders[i+1].Price>Orders[i].Price) // Следующий - ордер уже на продажу
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i+1]; // Сдвигаем следующий элемент
}
}
}
break;
caseORDER_TYPE_SELL:
caseORDER_TYPE_SELL_LIMIT:
if(ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
{
for(i=n;i>=0;i--)
{
if(i==0// Конец массива ордеров
|| Orders[i-1].Ticket==0// Следующий элемент пустой
|| ord_tmp.Price<Orders[i-1].Price // Следующий - по большей цене, вставляем перед ним
|| Orders[i-1].Price<Orders[i].Price) // Следующий - ордер уже на покупку
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i-1]; // Сдвигаем следующий элемент
}
}
}
else// Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
{
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1// Конец массива ордеров
|| ord_tmp.Price>Orders[i+1].Price) // Следующий - по меньшей цене, вставляем перед ним
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i+1]; // Сдвигаем следующий элемент
}
}
}
break;
default:
returnfalse;
break;
}
}
SaveState();
//str=OrdString();//Log(str);break;
case ORD_HIST_FOUND: //исполнен || снят//delete orderif(!DelOrder(n))
returnfalse;
SaveState();
str=OrdHistString(ticket); // Уточнить
Log(str);
break;
case ORD_NOT_FOUND: //отправлен в историю?if(Orders[n].MTState!=ORD_NA)
{
Orders[n].MTState=ORD_NA;
Orders[n].TimeNotFound=TimeCurrent();
SaveState();
printf(__FUNCTION__, "Order not found, ticket:",IntegerToString(Orders[n].Ticket)," TimeNF:",TimeToString(Orders[n].TimeNotFound,TIME_SECONDS));
}
else
{
if(TimeCurrent()-Orders[n].TimeNotFound>60) // > 60 секунд не найден
{
if(!DelOrder(n))
returnfalse;
SaveState();
str="Order not found >60s "+IntegerToString(ticket)+"\n";
Log(str);
}
}
break;
default:
returnfalse; //не тот ордерbreak;
}
returntrue;
}
Неплохо. Не люблю массивы)))), да и никогда с первого раза не получается задуманное без отладки в массивах. ))) Особенно сдвиги, копирования, сортировки не штатные)))
Неплохо. Не люблю массивы)))), да и никогда с первого раза не получается задуманное без отладки в массивах. ))) Особенно сдвиги, копирования, сортировки не штатные)))
Каждый инструмент хорош для своего.
Но, коварную off-by one error проверять и перепроверять ))
Здравствуйте. Если я не по адресу, то подскажите куда написать. Спасибо.
Ищу советник бесплатный MT5, который будет закрывать позиции ВСЕ по достижению профита или лосса, заданного в настройках и открывать сразу новые позиции по направлению, заданному в настройках. Может даст кто-то ссылку на топик? Или может занете советник, который просто открывает 1 позицию по рынку, если видит, что нет открытых и не закрывает.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
запоминать в свою структуру или массив нужные цены с тикетами и еще может что нужно, время например, и сразу сортировать после добавления по цене. По ресурсам, если ищите не часто, то одинаково или немного дороже, а если часто, то лучше запоминать. Ну и если конечно у Вас не 100500 ордеров) Тогда тоже накладно может быть. В общем сортировка в структуре или многомерном массиве задача решена только для первого индекса к сожалению.
Иногда пользую несколько одномерных массивов с одинаковыми индексами, тикеты, время, цены. И поиск по индексу нужного свойства. Получаем индекс например меньшего времени или большей цены и получаем тикет нужного ордера. Костыль конечно, но работает понятно.
запоминать в свою структуру или массив нужные цены с тикетами и еще может что нужно, время например, и сразу сортировать после добавления по цене. По ресурсам, если ищите не часто, то одинаково или немного дороже, а если часто, то лучше запоминать. Ну и если конечно у Вас не 100500 ордеров) Тогда тоже накладно может быть. В общем сортировка в структуре или многомерном массиве задача решена только для первого индекса к сожалению.
Иногда пользую несколько одномерных массивов с одинаковыми индексами, тикеты, время, цены. И поиск по индексу нужного свойства. Получаем индекс например меньшего времени или большей цены и получаем тикет нужного ордера. Костыль конечно, но работает понятно.
У меня сделано так:
enum MT_ORD_STATE { ORD_NA, // Not available ORD_SENT, ORD_ACTIVE, ORD_CHANGE_SENT, ORD_DEL_SENT }; struct MTOrder { ulong id; ulong Ticket; datetime Time; datetime TimeNotFound; double Price; double Vol; double VolInit; uint request_id; ENUM_ORDER_TYPE Type; ENUM_ORDER_STATE State; MT_ORD_STATE MTState; int Reserved; bool Idf; // Identified }; ... MTOrder Orders[]; // С начала массива - ордера на покупку, по убыванию цены, // С конца - на продажу, по возрастаниюМассив всегда отсортирован, новый ордер вставляется в нужую точку, со сдвигом других ордеров, при удалении ордера идёт сдвиг.
Но это в MT5
У меня сделано так:
Массив всегда отсортирован, новый ордер вставляется в нужую точку, со сдвигом других ордеров, при удалении ордера идёт сдвиг.
Но это в MT5
Хорошо бы код сдвига при записи, удалении и сортировки. Для меня не тривиальная задача сортировки массива структуры по полям. Да и сдвиги тоже.)
Хорошо бы код сдвига при записи, удалении и сортировки. Для меня не тривиальная задача сортировки массива структуры по полям. Да и сдвиги тоже.)
И, наверное, самое интересное:
Спасибо.
Неплохо. Не люблю массивы)))), да и никогда с первого раза не получается задуманное без отладки в массивах. ))) Особенно сдвиги, копирования, сортировки не штатные)))Спасибо.
Неплохо. Не люблю массивы)))), да и никогда с первого раза не получается задуманное без отладки в массивах. ))) Особенно сдвиги, копирования, сортировки не штатные)))Каждый инструмент хорош для своего.
Но, коварную off-by one error проверять и перепроверять ))
Вот что значит свежий взгляд на свой старый код!
Вижу два одинаковых косяка, рудименты предыдущей версии.
Одну явную неоптимальность.
И одну устаревшую конструкцию.
Ищу советник бесплатный MT5, который будет закрывать позиции ВСЕ по достижению профита или лосса, заданного в настройках и открывать сразу новые позиции по направлению, заданному в настройках. Может даст кто-то ссылку на топик?
Или может занете советник, который просто открывает 1 позицию по рынку, если видит, что нет открытых и не закрывает.
МТ4 1353
Что за ошибку отображает в журнале?
Код работает правильно
МТ4 1353
Что за ошибку отображает в журнале?
Код работает правильно
Похоже, какие-то объекты, созданные через "new", не уничтожаются при выходе.