Помогите с дистанцией от последнего закрытого ордера

forextime

Активный участник
Суть такова, есть цена последнего закрытого ордера PriceCloseLastPos, есть условие закрытия серии ордеров.
Я не могу заставить слушаться моё условие (Bid-PriceCloseLastPos())<=distPp*Point или Bid+
Добиваюсь того, чтобы если текущая цена для закрытия по сигналу была меньше distPp=50 от цены последнего закрытия ордера(ов) то закрываем,
если больше то пропускаем и не закрываем (для разгрузки серии во флэте).

При сигнале бай, закрывает серию ордеров селл
____________________________________________________________
if(signal_buy==0 && sell_profit>0 && MathAbs(Bid-PriceCloseLastPos())<=distPp*Point) {
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) {
if(OrderType()==1) CloseOrder(OrderTicket()); }
}



Описание : Возвращает цену закрытия последней закрытой позиций.
____________________________________________________________
double PriceCloseLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
r=OrderClosePrice();
}
}
}
}
}
}
}
return(r);
}
 
Последнее редактирование:

Abi

Элитный участник
Первое: для поиска цены последнего ордера только селл и только по текущей паре попробуйте изменить на... MathAbs(Bid-PriceCloseLastPos(NULL,1,magic))<=distPp*Point)
а то сова будет искать последнюю цену закрытия любого ордера по любой паре и в реальной работе вернет цену которая вам не подходит вообще.
для поиска последнего бая: MathAbs(Bid-PriceCloseLastPos(NULL,0,magic))<=distPp*Point)

Второе: меня удивило ваше условие "При сигнале бай" if(signal_buy==0 обычно я при поступлении сигнала бай присваиваю так... signal_buy==1 , тут у вас нет ошибки?
Или вы такой оригинал, что любите обратную логику? :)
 
Последнее редактирование:

forextime

Активный участник
Первое: для поиска цены последнего селл ордера по текущей паре попробуйте изменить на... MathAbs(Bid-PriceCloseLastPos(NULL,1,magic))<=distPp*Point)
а то сова будет искать последнюю цену закрытия ордера по любой паре и вернет цену которая вам не подходит вообще.
для поиска последнего бая MathAbs(Bid-PriceCloseLastPos(NULL,0,magic))<=distPp*Point)

Ок, спасибо, поправлю))

Второе: меня удивило ваше условие: if(signal_buy==0 обычно я при поступлении сигнала бай присваиваю так... signal_buy==1 , тут у вас нет ошибки? Или вы такой оригинал, что любите обратную логику? :)
При новом сигнале бай ордера селл ордера будут закрываться
Всегда придерживался Signal_buy==0, Signal_sell==1

Функция преобразования типа ордера
Описание:
Преобразование числа, содержащего числовое представление типа ордера в строку
Параметры:
int Type - тип ордера (0-BUY, 1-SELL, 2-BUYLIMIT, 3-SELLLIMIT, 4-BUYSTOP, 5-SELLSTOP

>>> Возвращаемые значения:
В случае успешного исполнения функции возвращает строку с типом переменной. В обратном случае возвращает "NONE".

string TypeToStr(int Type) {
switch(Type) {
case 0: return("BUY");
case 1: return("SELL");
case 2: return("BUYLIMIT");
case 3: return("SELLLIMIT");
case 4: return("BUYSTOP");
case 5: return("SELLSTOP");
}
return("NONE");
}

 
Последнее редактирование:

Abi

Элитный участник
Всегда придерживался Signal_buy==0, Signal_sell==1
в таком случае надо писать: Signal==0, Signall==1
прибавки buy и sell здесь не несут никакого смысла, а только путают, по цифровому значению понятно какой ордер открывать.
Учитесь сразу писать логически правильно, потом другим читать легче будет...
 

forextime

Активный участник
в таком случае надо писать: Signal==0, Signall==1
прибавки buy и sell здесь не несут никакого смысла, а только путают, по цифровому значению понятно какой ордер открывать.
Учитесь сразу писать логически правильно, потом другим читать легче будет...

Приму к сведению.
Я знаю, что прибавки buy и sell не несут никакого смысла.
Это я для себя помечаю, чтобы не запутаться, т.к. в советнике использую так же Signal_close, Signal_dop, Signal_lok...
 

Abi

Элитный участник
так и не написали - помогло али нет?
 

forextime

Активный участник
так и не написали - помогло али нет?

Signal== это вряд ли делу поможет))
Тут надо разбираться в дистанции.
Попробовал написать по хитрому для закрытия серии и работает только если >=, а мне надо <=, т.е. до дистанции 50
MathAbs((PriceCloseLastPos()-distPp*Point)>=(Bid+distPp*Point))

Причём для бай уже не работает условие
MathAbs((PriceCloseLastPos()+distPp*Point)>=(Ask-distPp*Point))
 

bondv

Программист
Signal== это вряд ли делу поможет))
Тут надо разбираться в дистанции.
Попробовал написать по хитрому для закрытия серии и работает только если >=, а мне надо <=, т.е. до дистанции 50
MathAbs((PriceCloseLastPos()-distPp*Point)>=(Bid+distPp*Point))

Причём для бай уже не работает условие
MathAbs((PriceCloseLastPos()+distPp*Point)>=(Ask-distPp*Point))
Здесь все в корне не правильно.
В первом посте было правильно для buy: MathAbs(Bid-PriceCloseLastPos())<=distPp*Point)
А для sell будет MathAbs(Ask-PriceCloseLastPos())<=distPp*Point)
Только это будет правильно работать, если Вы торгуете только на одном символе. Корректнее было бы, все-таки задавать аргументы в функции PriceCloseLastPos().
 

forextime

Активный участник
Здесь все в корне не правильно.
В первом посте было правильно для buy: MathAbs(Bid-PriceCloseLastPos())<=distPp*Point)
А для sell будет MathAbs(Ask-PriceCloseLastPos())<=distPp*Point)
Спасибо, с этим я уже разобрался))
Только это будет правильно работать, если Вы торгуете только на одном символе. Корректнее было бы, все-таки задавать аргументы в функции PriceCloseLastPos().
Здесь я тоже поправил: PriceCloseLastPos(Symbol(),-1,magic)
 
Верх