А кто может подсказать почему в этом куске выставляются отложенные ордера без остановки?
Мне надо чтобы после выставления обычного ордера выставлялся отложенный в другую сторону.
И как это исправить?
for(i=0; i<actTotal;i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
if(OrderType()==OP_BUYSTOP) BuyStop++;
if(OrderType()==OP_SELLSTOP) SellStop++;
}
}
if(BuyOrders > 0 || SellOrders > 0 && OT() == 1 && SellStop < 1)
{
double pBid=oop1-(Pips*Point);
OrderSend(Symbol(),OP_SELLSTOP,2*Lots,pBid,Slippage,NULL,NULL,"",0,0,Red);
}
if(SellOrders > 0 || BuyOrders > 0 && OT() == 2 && BuyStop < 1)
{
double pAsk=oop2+Pips*Point;
OrderSend(Symbol(),OP_BUYSTOP,2*Lots,pAsk,Slippage,NULL,NULL,"",0,0,Blue);
}
}
Наверно потому что установка ордеров находится внутри цикла. Желательно было бы вынести за цикл. Тогда сперва был бы расчет количества ордеров по типам, а потом принятие решения.
// Расчет количества ордеров по типам for(i=0; i<actTotal;i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if( OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();} if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();} if(OrderType()==OP_BUYSTOP) BuyStop++; if(OrderType()==OP_SELLSTOP) SellStop++; } } } // Принятие решения if(BuyOrders > 0 && SellStop ==0) { double pBid=oop1-(Pips*Point); OrderSend(Symbol(),OP_SELLSTOP,2*Lots,pBid,Slippage,NULL,NULL,"",0,0,Red); } if(SellOrders > 0 && BuyStop ==0) { double pAsk=oop2+Pips*Point; OrderSend(Symbol(),OP_BUYSTOP,2*Lots,pAsk,Slippage,NULL,NULL,"",0,0,Blue); }Проверь этот вариант
Огромное спасибо!!!
Работает
Не могли бы Вы еще одну функцию посмотреть?
Я ее написала для того чтобы считать сумму прибыли всех ордеров одного инструмента в зависимоти он размера лота.
double countpr()
{
double pr = 0, oop1 = 0, oop2 = 0;
int actTotal, BuyOrders, SellOrders;
for(int i=0; i<actTotal;i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = (Bid - OrderOpenPrice())/Point*OrderLots();}
if(OrderType()==OP_SELL) {SellOrders++; oop1 = (OrderOpenPrice() - Ask)/Point*OrderLots();
pr+= oop1;
}
}
}
}
Не могли бы Вы еще одну функцию посмотреть?
Я ее написала для того чтобы считать сумму прибыли всех ордеров одного инструмента в зависимоти он размера лота.
double countpr()
{
double pr = 0, oop1 = 0, oop2 = 0;
int actTotal, BuyOrders, SellOrders;
for(int i=0; i<actTotal;i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = (Bid - OrderOpenPrice())/Point*OrderLots();}
if(OrderType()==OP_SELL) {SellOrders++; oop1 = (OrderOpenPrice() - Ask)/Point*OrderLots();
pr+= oop1;
}
}
}
}
В данном случае считается профит в пунктах. Только надо добавить возвращаемое значение return(pr);
Добавила.
А почему тогда не работает это
for(i=0; i<actTotal;i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
if(OrderType()==OP_BUYSTOP) BuyStop++;
if(OrderType()==OP_SELLSTOP) SellStop++;
if(OrderType()==OP_BUY){
if(countpr() > 0) oc();//OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
}
if(OrderType()==OP_SELL){
if(countpr() > 0) oc();// OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
if(BuyStop > 0 || SellStop > 0 && (BuyOrders < 1 && SellOrders < 1))
{
OrderDelete(OrderTicket());
}}}}
oc() -- закрывает все открытые ордера
Добавила.
А почему тогда не работает это
.....................
oc() -- закрывает все открытые ордера
Есть несколько замечаний. Цикл по закрытию нужно делать наоборот (если конечно тикеты ордеров не хранятся в массиве).
При вызове твоих функций меняется выбранный ордер, да и другие функции по работе с выбранным ордером. Они работают с последним выбранным. А твои функции тоже делают перебор ордеров. И потому закрывается вернее всего последний. Возможно нужно при обращении к функциям сохранять тикет выбранного ордера, а потом его восстанавливать. Или же менять логику работы или создавать массив для хранения тикетов закрываемых ордеров, а потом отдельной функцией закрывать.
Постараюсь воспользоваться готовыми функциями (хотя я не знаю функцию oc())
int start() { double profit=countpr(); if (provit > 0) oc(); // хотя прибыль должна быть бульше 0, желательно задавать какое-то значение, например 25 пунктов. return(0); }примерно так.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Мне надо чтобы после выставления обычного ордера выставлялся отложенный в другую сторону.
И как это исправить?
for(i=0; i<actTotal;i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
if(OrderType()==OP_BUYSTOP) BuyStop++;
if(OrderType()==OP_SELLSTOP) SellStop++;
}
}
if(BuyOrders > 0 || SellOrders > 0 && OT() == 1 && SellStop < 1)
{
double pBid=oop1-(Pips*Point);
OrderSend(Symbol(),OP_SELLSTOP,2*Lots,pBid,Slippage,NULL,NULL,"",0,0,Red);
}
if(SellOrders > 0 || BuyOrders > 0 && OT() == 2 && BuyStop < 1)
{
double pAsk=oop2+Pips*Point;
OrderSend(Symbol(),OP_BUYSTOP,2*Lots,pAsk,Slippage,NULL,NULL,"",0,0,Blue);
}
}