Помогите советник простой, но .....

 
Здраствуйте помогите пожалуста.
Условия советника просты до безобразия - он должен переносить в бу через 20пл,через 30 пл должен ставить трелинг 30 .Вот и все.Я накропал но.....что-то он не так работает.В бу ставит через 5 пунктов.гляньте спецы что неправильно:

//---- input parameters
extern int ticket = 0;
extern int nolossLevel = 24; // когда ставить безубыток
extern int trailLevel = 34; // когда начинать трейл
extern int trailValue = 30; // размер трейла
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if ( OrderSelect (ticket, SELECT_BY_TICKET) // Успешно выбран
&& 0 == OrderCloseTime() // и еще не закрыт
&& OrderSymbol () == Symbol () // и нужный символ
) {
double newStop = OrderStopLoss ();
switch (OrderType ()) {
case OP_BUY:
// Открыт - BUY
if (Ask >= OrderOpenPrice () + trailLevel * Point) {
// прошли trailLevel пунктов - трейл
newStop = Ask - trailValue * Point;

} else if (Ask >= OrderOpenPrice () + nolossLevel * Point) {
// прошли nolossLevel пунктов - безубыток
newStop = OrderOpenPrice ();
}
if (newStop > OrderStopLoss ()) {
OrderModify(ticket,OrderOpenPrice(),newStop,OrderTakeProfit(),OrderExpiration());
}
break;
case OP_SELL:
// Открыт - SELL
if (Bid <= OrderOpenPrice () - trailLevel * Point) {
// прошли trailLevel пунктов - трейл
newStop = Bid - trailValue * Point;

} else if (Bid >= OrderOpenPrice () - nolossLevel * Point) {
// прошли nolossLevel пунктов - безубыток
newStop = OrderOpenPrice ();
}
if (newStop < OrderStopLoss ()) {
OrderModify(ticket,OrderOpenPrice(),newStop,OrderTakeProfit(),OrderExpiration());
}
break;
}
}
return(0);
}
//+------------------------------------------------------------------+
 
Ключевая ошибка в строке:
else if (Bid >= OrderOpenPrice () - nolossLevel * Point)
но, по правде говоря, Ваш эксперт надо заносить в учебники по программированию на MQL4 в главу: "Как нельзя писать экспертов". Для своей задачи возьмите лучше готовый эксперт Игоря Кима, у него он очень толково написан, и разберите по косточкам.
 
Так может быть просто напишите мне готовый эксперт,как надо и правильно.У меня очень большая беда с точными науками и все это програмирование я вообще не понимаю,ну не дано мне .... :-(.Я с этим-то колупался месяц наверное .Ну не мое это,не мое.
 
Зачем писать, если все уже давно написано. Еще раз говорю зайди к Игорю Киму на сайт http://www.kimiv.ru/dev_mq4.htm, скачай советник Трейлинг Стоп и разбери его. Там есть все функции, которые тебе нужны.
 
2 nalex2000

А то обращайтесь - напишем и запустим в космос.
info [at] e2e-fx [dot] net
ICQ 169791434

PS. Приветствую, Roger!
 
Ответил с примером:
http://forum.alpari-idc.ru/showpost.php?p=722619&postcount=176

// --- Параметры бу ---
extern bool CheckBreakeven = true;
extern int Level1 = 20;

// --- Параметры трейлинг-стопа ---
extern bool UseTrailing = true;
extern int MinProfit = 30;
extern int TrailingStop = 30;
extern int TrailingStep = 5;

void start() 
{

  if (CheckBreakeven) CheckLevel1();

  if (UseTrailing) TrailingPositions();  
 
  //...
}

void CheckLevel1() 
{
  int cnt = OrdersTotal();
  
  for (int i=0; i<cnt; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;        
    if (OrderMagicNumber() != Magic) continue;

    int type = OrderType();
    if (type == OP_BUY) {
      if (Bid-OrderOpenPrice() > Level1*Point) { 
        if (OrderStopLoss() < OrderOpenPrice()) {
          OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
        }
      }
    }
    
    if (type == OP_SELL) {
      if (OrderOpenPrice()-Ask > Level1*Point) { 
        if (OrderStopLoss() > OrderOpenPrice() || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
        }
      }
    }
    
  }
}

void TrailingPositions() 
{
  int cnt = OrdersTotal();
  
  for (int i=0; i<cnt; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;        
    if (OrderMagicNumber() != Magic) continue;

    if (OrderType() == OP_BUY) {
      if (Bid-OrderOpenPrice() > MinProfit*Point) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
      }
    }

    if (OrderType() == OP_SELL) {
      if (OrderOpenPrice()-Ask > MinProfit*Point) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
      }
    }
  }
}