int GetMagic(Order &order)
{
int magic = 0;
if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)for(int i = OrdersTotal(); i > 0 ; i --)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
{
if(magic == OrderMagicNumber()) magic+=1;
else magic=0;
}
}
}
return (magic);
}
Это справил, у меня было if(order.cmd == OP_SELLSTOP || OP_BUYSTOP) только проблема не решилась. Но мне нужно чтобы проход был по всем ордерам. Сам же маджик задается в момент создания исключительно стопордерам. Понять что создается стопордер по OrderType() невозможно, потому что его ещё нет, для этого предусмотрено предварительная запись типа ордера в order.cmd. И тут нужно два цикла: один вложен в другой, чтобы одна итерация переменной magic проверялась с маджиками всех ордеров из OrdersTotal(). У меня это все реализовано, только происходит бесконечное зацикливание, я хз почему ...
Nerd Trader #: Это справил, у меня было if(order.cmd == OP_SELLSTOP || OP_BUYSTOP) Но мне нужно чтобы проход был по всем ордерам. Сам же маджик задается в момент создания исключительно стопордерам. Понять что создается стопордер по OrderType() невозможно, потому что его ещё нет, для этого предусмотрено предварительная запись типа ордера в order.cmd. И тут нужно два цикла: один вложен в другой, чтобы одна итерация переменной magic проверялась с маджиками всех ордеров из OrdersTotal()
void OpenOrder(int db = -1){
if(db == -1){
Print("'db' должен иметь корректное значение");
return;
}
Order order;
//Если бид в границах ДБ (его хай/лоу) то инициализируем ордер для селстопа или байстопаif(Bid > db_last.low && Bid < db_last.hight){
if(db == BEAR) order.InitForSell(SELLSTOP);
if(db == BULL) order.InitForBuy(BUYSTOP);
}
...
if(order.is_init == true)
{
int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 10,
order.sl_price, order.tp_price, "", GetMagic(order), 0, order.arrow_color);
if(order_send == -1){
Print(order.error_text," | ",GetLastError()," db_last.third ",db_last.third,
" | db_last.size_open_to_low ",db_last.size_open_to_low," | order.sl_price: ",
order.sl_price," | order.cmd ",order.cmd);
ResetLastError();
return;
}
}
}
...
int GetMagic(Order &order)
{
int magic = 0;
//Если должен быть открыт стопордер и если есть уже открытые или отложенные //ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать //для нашего ордера уникальный маджик и отправить его на запись в массивif(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
if(OrdersTotal() >= 1)
for(;;){
magic++;
for(int i = OrdersTotal(); i > 0 ; i --)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) != false)
if(magic != OrderMagicNumber())
return magic;
}
//Если нет открытых или отложенных ордеров то увеличиваем значение //маджика, чтобы он равнялся единице и отправляем на запись в массивelseif (OrdersTotal() == 0)
return (magic + 1);
return magic;
}
Там в комментировании написано что отправляется маджик в массив на запись, пусть это не вводит в заблуждение, пока маджик вовзращается обратно по реторну.
это шутка такая ?
у вас чёрным по белому for(;;)
Ну да, только из него предусмотрен выход: когда magic не будет равнятся маджику ордера.
Попробуй так
Доброго времени суток.
Подскажите пожалуйста есть функция OrderSwap() которая возвращает значение свопа текущего выбранного ордера.
А если сетка ордеров???
У кого ни будь не завалялась функция для расчета суммы всех свопов сетки ордеров по магическому ордеру и финансовому инструменту.
Спасибо за помощь!!!
Тебе зачем?
При закрытии большой сетки ордеров с длинным периодом жизни сетки свопы ордеров съедают прибыль и очень сильно искажают результат.
Хочу этой функцией компенсировать потерю на свопах.
При закрытии большой сетки ордеров с длинным периодом жизни сетки свопы ордеров съедают прибыль и очень сильно искажают результат.
Хочу этой функцией компенсировать потерю на свопах.
Попробуй так
Но мне нужно чтобы проход был по всем ордерам. Сам же маджик задается в момент создания исключительно стопордерам. Понять что создается стопордер по OrderType() невозможно, потому что его ещё нет, для этого предусмотрено предварительная запись типа ордера в order.cmd. И тут нужно два цикла: один вложен в другой, чтобы одна итерация переменной magic проверялась с маджиками всех ордеров из OrdersTotal(). У меня это все реализовано, только происходит бесконечное зацикливание, я хз почему ...
Сетка закрывается по профиту или цене безубытка?
Да при определенном уровне просадки происходит сброс профита в ноль и к без убытку происходит некрасивый убыток из-за свопов
Это справил, у меня было if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
Но мне нужно чтобы проход был по всем ордерам. Сам же маджик задается в момент создания исключительно стопордерам. Понять что создается стопордер по OrderType() невозможно, потому что его ещё нет, для этого предусмотрено предварительная запись типа ордера в order.cmd. И тут нужно два цикла: один вложен в другой, чтобы одна итерация переменной magic проверялась с маджиками всех ордеров из OrdersTotal()
Да при определенном уровне просадки происходит сброс профита в ноль и к без убытку происходит некрасивый убыток из-за свопов