Kalkin писал(а):Nord писал(а):Любопытства ради: а по какому алгоритму открываются сами "дальние" и "ближние" сделки? Или все руками, а сов просто по текущему эквити работает?
Это сов-"закрывашка", работает с уже имеющимися позициями.
int ArTickets[];
int ArPips[];
int orderscnt = 0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
orderscnt++;
ArrayResize(ArTickets, orderscnt);
ArrayResize(ArPips, orderscnt);
ArTickets[orderscnt-1] = OrderTicket();
RefreshRates();
if (OrderType()==OP_BUY)
ArPips[orderscnt-1] = int((Bid-OrderOpenPrice())/Point);
else if (OrderType()==OP_SELL)
ArPips[orderscnt-1] = int((OrderOpenPrice()-Ask)/Point);
}
}
// сортировка по пипсам
int t;
int i, j;
for (i=orderscnt-1; i>0; i--) {
for (j=0; j<i; j++) {
if (ArPips[j]>ArPips[j+1]) {
t=ArPips[j];
ArPips[j]=ArPips[j+1];
ArPips[j+1]=t;
t=ArTickets[j];
ArTickets[j]=ArTickets[j+1];
ArTickets[j+1]=t;
}
}
}
Kalkin писал(а):Для начала создаются два целочисленных массива: ArTickets[] для хранения тикетов всех позиций и ArPips[] для текущего значения прибыли/убытка в пунктах:
- Код: выделить все
int ArTickets[];
int ArPips[];
Затем перебираются все имеющиеся позиции и эти массивы просто заполняются значениями. Также учитывается, что для позиций на покупку прибыль отсчитывается от цены Bid, а для позиций на продажу - от цены Ask:
- Код: выделить все
int orderscnt = 0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
orderscnt++;
ArrayResize(ArTickets, orderscnt);
ArrayResize(ArPips, orderscnt);
ArTickets[orderscnt-1] = OrderTicket();
RefreshRates();
if (OrderType()==OP_BUY)
ArPips[orderscnt-1] = int((Bid-OrderOpenPrice())/Point);
else if (OrderType()==OP_SELL)
ArPips[orderscnt-1] = int((OrderOpenPrice()-Ask)/Point);
}
}
В результате мы получим два массива, в которых элементы с такими же порядковыми номерами будут определять однозначно тикет позиции и её прибыль (убыток) в пунктах.
Для сортировки значений массива используется самая обычная пузырьковая сортировка - о ней написан не один том в литературе по программированию, это Вы сами найдете. Замечу, что при необходимости перестановки элементов массива должны переставляться как элементы массива, хранящего пункты, так и соответствующие им элементы массива тикетов:
- Код: выделить все
// сортировка по пипсам
int t;
int i, j;
for (i=orderscnt-1; i>0; i--) {
for (j=0; j<i; j++) {
if (ArPips[j]>ArPips[j+1]) {
t=ArPips[j];
ArPips[j]=ArPips[j+1];
ArPips[j+1]=t;
t=ArTickets[j];
ArTickets[j]=ArTickets[j+1];
ArTickets[j+1]=t;
}
}
}
Kalkin писал(а):... если был какой-то вопрос, то его в предыдущем посте нет - только цитата моего сообщения ...
piter писал(а):Премного благодарен за ответ, но тут, как я понял не учитываются комиссия, свопы, лоты, пузырьковая сортировка мне трохи знакома...
piter писал(а):Может проще сортировать одномерный строковый массив, строки которого уже отсортированы в терминале, по умолчанию время открытия ордера, но его можно там отсортировать по цене открытия, а потом как то скопировать в одномерный строковый массив и потом не будет страха,что какие то данные перепутаны...
Короче мыль есть, а как её реализовать попроще и с точностью до "мулиметра" пока не знаю....
Вобще это реально сделать?
Благодарю за ответ.
piter писал(а):писать сюда решился после подсказки Рэндома, об активном участии на форуме, в других форумах это бы сочли за флуд...
Я не давно решился изучать MQL4, пишу (почти написал)
Kalkin писал(а):piter писал(а):
Терминал занимается тем же самым - берет все позиции от сервера, сортирует их как требует пользователь и выводит на экран. Брать значения с подокна терминала - задача на уровне API и для данной задачи совершенно избыточна.
piter писал(а):Kalkin писал(а):piter писал(а):
Терминал занимается тем же самым - берет все позиции от сервера, сортирует их как требует пользователь и выводит на экран. Брать значения с подокна терминала - задача на уровне API и для данной задачи совершенно избыточна.
Вот это уже очень интересно, "...задача на уровне API и для данной задачи совершенно избыточна.", т.е. намного сложнее? Но вот интересно, с помощью пузырьковой сортировки, которую я хотел бы внедрить в свой индюк, стрелка указывающая уровень перекрытия будет статична или будет динамична...
Мож правда переведём общение в раздел где будет больше пользы обоим?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 173
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения