Помогите с трейлингом.

 
Пытаюсь написать код трейлинга профитных ордеров,но ничего не выходит.
Сделать простой трал проблем нет.
Мне надо вот что:ордер с профитом в два пункта,эксперт подтягивает стоплосс на безубыток,профит 4 пункта-стоплосс 2 и т.д.,
но так у многих ДЦ это невозможно,то надо чтобы эти данные эксперт писал допустим в массив,то есть трал без
фактического изменения стоплосса с шагом минимум в 2 пункта.
Если не не трудно то напишите пожалуйста этот код.
Заранее благодарен.
 
Навскидку:
double max_bid = 0.0;
 
int start()
{
   if ( Bid - max_bid > 0.0 ) { max_bid = Bid; }
   if ( max_bid - Bid >= 2*Point ) { OrderClose(....); }
...
   if (...)
   {
      OrderSend(OP_BUY);
      max_bid = Ask;
   }
}

И тоже самое для селл, только бид и аск поменять местами ;)
 
Мдя...
Вставте пожалуйста код трала в этого эксперта.
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
 
double a, b;  
extern int Shift = 2;  
extern double Lot=0.1;
bool x;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 
//---------------------------------------------------------------------------- 
int start(){ 
  
  if(Bid-iOpen(Symbol(),PERIOD_H1,0)>0)x=true;
  else x=false; 
  
  if (Ask-a>=Shift*Point && x==false) 
    {OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+18*Point,0,"eurusd",0,0,CLR_NONE);max_ask=Ask;} 
  if (b-Bid>=Shift*Point && x==true) 
    {OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-18*Point,0,"eurusd",0,0,CLR_NONE);max_bid=Bid;} 
 
  a=Ask;  
  b=Bid; 
 
   
return(0);}
 
extern int Shift = 2;  
extern double Lot=0.1;
 
bool x;
double a, b, max_bid = 0.0, min_ask = 0.0;
int buy = 0, sell = 0;
 
int start()
{ 
  if ( Bid - max_bid > 0.0 ) { max_bid = Bid; }
  if ( min_ask - Ask > 0.0 ) { min_ask = Ask; }
 
  if(Bid-iOpen(Symbol(),PERIOD_H1,0)>0)x=true;
  else x=false; 
  
  if (Ask-a>=Shift*Point && x==false) 
    {OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+18*Point,0,"eurusd",123,0,CLR_NONE);min_ask=Bid;} 
  if (b-Bid>=Shift*Point && x==true) 
    {OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-18*Point,0,"eurusd",123,0,CLR_NONE);max_bid=Ask;} 
 
  a=Ask;  
  b=Bid; 
 
 
  int _GetLastError, _OrdersTotal = OrdersTotal();
 
  for ( int z = _OrdersTotal - 1; z >= 0; z -- )
  {
    if ( !OrderSelect( z, SELECT_BY_POS, MODE_TRADES ) )
    {
      _GetLastError = GetLastError();
      Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_TRADES ) - Error #", _GetLastError );
      continue;
    }
    if ( OrderMagicNumber() != 123 || OrderSymbol() != _Symbol ) { continue; }
    if ( OrderType() == OP_BUY )
    {
      if ( Bid - OrderOpenPrice() >= 0 && max_bid - Bid >= 2*Point )
      {
        OrderClose( OrderTicket(), OrderLots(), Bid, 3, CLR_NONE );
        continue;
      }
    }
    if ( OrderType() == OP_SELL )
    {
      if ( OrderOpenPrice() - Ask >= 0 && Ask - min_ask >= 2*Point )
      {
        OrderClose( OrderTicket(), OrderLots(), Ask, 3, CLR_NONE );
        continue;
      }
    }
  }
 
  
return(0);}
 
Спасибо.
 
Когда-то и меня посещала подобная идея, закрывать прибыльные ордера при откате на некоторое значение, я брал процент от максимума. Слил весь демо-счет. Прибыль, в вашем случае, 1-2 пункта, а убыток по соп-лосу пунктов 18.
 
Почему 1-2 пункта?
В тестере максимальная прибыльная сделка была 190 пунктов,при этом максимальная убыточная 18 пунктов.
При этом средняя прибыльная 27 пунктов.
 
А вы когда-нибудь видели в реальности скачек цены в 190 пунктов?!! Тестер, это такая жутко тупая вещь, если у него появляется бар, у которого цена выхода – цена входа = 190 пунктов, то он вам и сгенерит тик в 190 пунктов. И еще, таких экспертов тестить надо на периоде M1 (все тики) и то результат будет грубый.
 
Согласен что тестер вещь тупая и 190 он может и загнул конечно, но 50-100 пунктов,а то и больше,во время новостей обычное явление.
 
Это в лучшем случае раз в неделю и то не больше 20 пунктов, они не смогут окупить убыток. Поставь на демо-счет хотя бы на сутки и посмотри результат, 1-3 пункта с ордера и таких ордеров будет много и несколько ордеров со стоп-лосами, убыток от которых перекроет все. Хочешь своего эксперта дам?
 
А еще лучше изначально смотреть не в сторону стандартного трейлинга (читай тупое таскание стопа за текущей ценой), а подумать о трейлинге основанном на информации новых СФОРМИРОВАННЫХ баров (т.е. срабатывает на открытии нового бара на основании уже сформированных баров). Способы возможны различные: уровни последних фракталов, уровни параболика (Parabolic SAR), трейлинг работающий от собственного первоначального стоп-лосса по принципу параболика, уровень среднего истинного диапазона (ATR) с коэффициентом ну и прочее. В общем идея надеюсь понятна, сделать дискретный трейлинг адекватный (адаптирующийся) к графику цены.
Причина обращения: