[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 395

 
KostelloArtua:

Спасибо огромное за советы!!! Разобрался со своим вопросом. Оказалось, что у нужного мне брокера при выставлении рыночного ордера, т.е. по условиям, нет возможности выставить одновременно стоп-уровни. Теперь выставляются ордера без стоп-уровней, а стоп-уровни я задаю выставить сразу после каждого ордера. Возникла проблема: модифицируется самая маленькая часть ордеров, а по большинству выдается в разделе "эксперты" следующее:

2011.05.19 09:46:55 Spacenewcomer-Svecha CLM1,M15: open #30906670 sell 0.01 CLM1 at 99.79 ok
2011.05.19 09:46:55 Spacenewcomer-Svecha CLM1,M15: invalid ticket for OrderModify function
2011.05.19 09:55:40 Spacenewcomer-Svecha ESM1,M5: open #30906787 buy 0.01 ESM1 at 1337.50 ok

2011.05.19 10:00:03 Spacenewcomer-Svecha EURUSD,M15: invalid ticket for OrderModify function

Привожу текст кода:

{
res=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,0,0,"основной",_MagicNumber,0,Red);


OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopLoss*Point,Ask-TakeProfit*Point,0,Red);
return(0);

}

И при чем модифицируются именно те, которые открываются первыми после запуска советника!

Естественно, что в коде неправильно задана мной модификация ордеров... Подскажите!

res=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,0,0,"основной",_MagicNumber,0,Red);

OrderSelect(res, SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+StopLoss*Point, Digits),NormalizeDouble(Ask-TakeProfit*Point, Digits),0,Red);
 
ilunga:
res=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,0,0,"основной",_MagicNumber,0,Red);

OrderSelect(res, SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+StopLoss*Point, Digits),NormalizeDouble(Ask-TakeProfit*Point, Digits),0,Red);
Спасибо за подсказку!!!
 
Sancho77:
Уважаемые программисты, обращаюсь за посдсказкой по доработке советника: есть открытая позиция, через некоторое время поступает повторный сигнал на открытие в том же направлении. Я хочу, чтобы доливка по повторному сигналу происходила только в том случае если первый ордер уже находится в плюсе. Я сейчас реализовал это путем сравнения размера баланса и эквити (если эквити больше баланса, значит открытый ордер в плюсе), но такой вариант не подойдет, если на одном счете работают несколько советников.
Подскажите код для определения прибыли/убытка по имеющемуся открытому последнему ордеру .

Если сохранен его номер ticket, то просто

OrderSelect(ticket, SELECT_BY_TICKET);

if (OrderProfit() > )

{

          // доливаем ордер

}
 
ilunga:

Если сохранен его номер ticket, то просто


Спасибо! Не подскажете как сохранить тикет последнего ордера?
 
Sancho77:
Спасибо! Не подскажете как сохранить тикет последнего ордера?

ну как простейший вариант объявить глобальную переменную int ticket

и везде где OrderSend(...) заменить на ticket = OrderSend(...)

соответственно он всегда будет хранить номер последнего открытого ордера

либо смотртите тему Только "Полезные функции от KimIV"

 
ilunga:

ну как простейший вариант объявить глобальную переменную int ticket

и везде где OrderSend(...) заменить на ticket = OrderSend(...)

соответственно он всегда будет хранить номер последнего открытого ордера

либо смотртите тему Только "Полезные функции от KimIV"

Спасибо за помощь!
 
rustein:

Помогите найти ошибку,

Спасибо


BuySL*Point // зачем умножать на Point ? Тоже самое для SelSL*Point
 
khorosh:

Спасибо,

Не знаю... думал будет работать, без тоже не работает, сделал так и работает....

//-----
  double Spread = (NormalizeDouble(Ask,Digits) - NormalizeDouble(Bid,Digits)) / Point;
  double BuySL = NormalizeDouble(iCustom(NULL,0,"NRTR",AveragePeriod,0,1),Digits);
  double SelSL = NormalizeDouble(iCustom(NULL,0,"NRTR",AveragePeriod,1,1),Digits);
//-----
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++)
  {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
    {
      if(OrderType() == OP_BUY && OrderMagicNumber()==Magic && OrderStopLoss() != BuySL-Spread*Point
      && BuySL-Spread*Point > OrderStopLoss() && BuySL-Spread*Point > OrderOpenPrice())
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),BuySL-Spread*Point,OrderTakeProfit(),0,CLR_NONE);
      }
      if(OrderType() == OP_SELL && OrderMagicNumber()==Magic && OrderStopLoss() != SelSL+Spread*Point
      && SelSL+Spread*Point < OrderStopLoss() && SelSL+Spread*Point < OrderOpenPrice())
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),SelSL+Spread*Point,OrderTakeProfit(),0,CLR_NONE);
      }
    }
  }
}

 
Roger:
PRICE_OPEN !!!! - так использовать эту цену нельзя! Она работает только для индикаторов. Используйте Бид или Аск.

Спасибо!!! Да, сто пудов в этом дело.
 

Парни вопрос по сложнее......

Как заставить советника закрыть все ордера при достижении заданной прибыли .... Закрыть только ордера на одном символе..

пример : Советник работает на 3х парах сумма для закрытия всех ордеров по одному символу 100р ...

на евро долларе больше 100 р он закрывает ордера только на евро долларе при этом на других может быть - 200р ..

Если брать accountbalanse() то советник закрывает только когда сумма по трем парам больше 100р. этот вариант мне не подходит !!!!

Помогите плиз.........

Причина обращения: