Модификация трала

 

Здравствуйте. Есть прекрасный пример от Кима. Но там идет трал сразу после достижения плюса. Правильно ли я модифицировал для того что бы трал начинал работу с достижения позиции профита к примеру в 20 пунктов.

 

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Автоматический Trailing Stop всех открытых позиций    |
//|            Вешать только на один график                          |
//| 21.01.2006 Параметр AllPositions                                 |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Внешние параметры ------------------------------------------
extern bool   AllPositions   = False; // Управлять всеми позициями
extern bool   ProfitTrailing = True;  // Тралить только профит
extern int    TrailingStop   = 15;    // Фиксированный размер трала
extern int    TrailingStep   = 2;     // Шаг трала
extern bool   UseSound       = True;  // Использовать звуковой сигнал
extern string NameFileSound  = "expert.wav";  // Наименование звукового файла

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (AllPositions || OrderSymbol()==Symbol()) {
        TrailingPositions();
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-((TrailingStop+TrailingStep-1)+20)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+((TrailingStop+TrailingStep-1)+20)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}


void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  
}

Спасибо.

 

 
tradetrade777:

Здравствуйте. Есть прекрасный пример от Кима. Но там идет трал сразу после достижения плюса. Правильно ли я модифицировал для того что бы трал начинал работу с достижения позиции профита к примеру в 20 пунктов.

 

Спасибо.

 

Можно было просто использовать TrailingStep с нужным значением
 
Victor Nikolaev:
Можно было просто использовать TrailingStep с нужным значением
нужно не через каждые 20 пунктов... а когда будет +20 то подтягивать даже по пункту с расстоянием в 40 пунктов...
 
tradetrade777:
нужно не через каждые 20 пунктов... а когда будет +20 то подтягивать даже по пункту с расстоянием в 40 пунктов...
Судя по формулам Вы просто увеличили  TrailingStep на 20 пунктов. Стоило ли оно тех мучений - Вам виднее
 
Victor Nikolaev:
Судя по формулам Вы просто увеличили  TrailingStep на 20 пунктов. Стоило ли оно тех мучений - Вам виднее
Прошу помочь чтобы тралил когда будет +20 то подтягивать даже по пункту с расстоянием в 40 пунктов... а то что то все делаю не правильно и уже сбился с счета попыток... спасибо... думал так будет работать...
 

Тогда, если сам не сможешь написать функцию полностью, оставь эту в первозданном виде и вызывай её если бид выше или равен OrderOpenPrice() на 20 пунктов. Ну или ниже для селов.

Правда я не смотрел не будет-ли ошибки 1. Это когда модифай с прежними параметрами.

 

написал вот так... но ошибка 4051... может кто нибуть увидит ошибку...

 

void F_TrailingPositions() {
  double pBid, pAsk;
  pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
  if (OrderType() == OP_BUY && (pAsk - OrderOpenPrice())/Point > PROF && OrderStopLoss() < NormalizeDouble(pAsk - TS*Point,Digits)){
      
      bool res_5 = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(pAsk - TS*Point,Digits),OrderTakeProfit(),0,Blue);
        return;
    }
  
  pBid = MarketInfo(OrderSymbol(), MODE_BID);  
  if (OrderType() == OP_SELL && (OrderOpenPrice() - pBid)/Point > PROF && OrderStopLoss() > NormalizeDouble(pBid + TS*Point,Digits)){
      
      bool res_6 = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(pBid + TS*Point,Digits),OrderTakeProfit(),0,Red);  
        return;
    } 
}
 
tradetrade777:

написал вот так... но ошибка 4051... может кто нибуть увидит ошибку...

 

Так попробуйте:

//+------------------------------------------------------------------+
void start() {
  for(int i=OrdersTotal()-1; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         string order_symbol=OrderSymbol();
         if (AllPositions || order_symbol==Symbol()) {
            int order_type=OrderType();
            if(order_type>1) continue;
            double pa=SymbolInfoDouble(order_symbol,SYMBOL_ASK); 
            double pb=SymbolInfoDouble(order_symbol,SYMBOL_BID);
            double pt=SymbolInfoDouble(order_symbol,SYMBOL_POINT);
            double p1=(order_type==OP_BUY)?pb:OrderOpenPrice();
            double p2=(order_type==OP_BUY)?OrderOpenPrice():pa;
            if(p1-p2>=20*pt) TrailingPositions();
            }
         }
      }
}
//+------------------------------------------------------------------+

Остальное оставьте как у Игоря. Хотя ... костыль конечно...

В строке

if(p1-p2>=20*pt) TrailingPositions();

20 - это и есть то количество пунктов прибыли, при достижении которых нужно тралить. Хотя нужно ещё проверить наличие прибыли как таковой:

if(OrderProfit()+OrderCommission()+OrderSwap()>0) {// ... профит есть}