Помогите с тралом

 

Вот у меня такой простенький трал

//+================================= TrailingStop ==================================+
for ( int z = OrdersTotal() - 1; z >= 0; z -- )                  
   {       
   if (OrderSelect(z, SELECT_BY_POS, MODE_TRADES))                
      {           
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     
         { 
         if(OrderType() == OP_BUY)
            {
            if(Bid-OrderOpenPrice()>Point*TrailingStop) 
               {
               if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
                  }
               }
            }
         }  // Symbol()  
      } // select
   } //total 

//+================================= TrailingStop ==================================+
Все отлично работает, но проблема в том что он тралит только при открытии новой свечи,а не в реальном времени. Как сделать чтоб он тралил влюбой момент временни?
 
berezhnuy:

Вот у меня такой простенький трал

Все отлично работает, но проблема в том что он тралит только при открытии новой свечи,а не в реальном времени. Как сделать чтоб он тралил влюбой момент временни?


Функцию трала надо запускать до контроля формирования нового бара
 
Как это в коде выглядит, подскажите пожалуйста
 
berezhnuy:
Как это в коде выглядит, подскажите пожалуйста
Дак тут нет телепатов, выкладывайте весь код, тогда подскажут как это в коде выглядит.
 
berezhnuy:
Как это в коде выглядит, подскажите пожалуйста


Простейший вариант

int start()
{  
    Tral();
    if (!NevBar()) return(0);
   // Дальнейшая обработка
   return(0);
}
 
vitali_yv:
Дак тут нет телепатов, выкладывайте весь код, тогда подскажут как это в коде выглядит.


extern int     Magic=5675;
extern int     Orders =1;
extern int     StopLoss=0;
extern int     TakeProfit=0;
extern string     ______= "Параметры блока MoneyManagement";
extern double    Lots = 0.1;
extern bool      MoneyManagement=false;
extern int       MarginPercent=3;
extern int       TrailingStop=50;

//----------------------------------
double SL,TP;
int ticket;
double lots;
static int prevtime = 0;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>
//+=================================================================================+
//| expert initialization function                                                  |
//+=================================================================================+
int init()
  {
//----
   
//----
   return(0);
  }
//+=================================================================================+
//| expert deinitialization function                                                |
//+=================================================================================+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+=================================================================================+
//| expert start function                                                           |
//+=================================================================================+
int start()
  { 
if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим
   prevtime = Time[0]; // Свежий бар, запоминаем время
//+=================================================================================+
// Объявляем переменные
int total, cnt;
int err;
// Вычисляем начальные параметры индикаторов для поиска условий входа
  
  total=OrdersTotal();
Comment( LotsCounting() );
//+=================================================================================+
  // Проверка средств
  if(AccountFreeMargin()<(1000*Lots))
     {
       Print("We have no money. Free Margin = ", AccountFreeMargin());   
       return(0);  
     }
//===========================  Открытие позиций  ===================================+  
//+=================================================================================+
  // Проверка условий для совершения сделки бай
if( Сигнал )
       {
      SL=0;TP=0;
      if(StopLoss>0)   SL=Bid - StopLoss*  Point;       // StopLoss   (цена)
      if(TakeProfit>0) TP=Bid + TakeProfit*Point;      // TakeProfit (цена)
      lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,pp,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Magenta);
      if(ticket > 0);
   if(ticket < 0) 
   {
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0);
         } 
       }
     }
//======================== конец блока открытия позиций ============================+
//+================================= TrailingStop ==================================+
for ( int z = OrdersTotal() - 1; z >= 0; z -- )                  
   {       
   if (OrderSelect(z, SELECT_BY_POS, MODE_TRADES))                
      {           
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     
         { 
         if(OrderType() == OP_BUY)
            {
            if(Bid-OrderOpenPrice()>Point*TrailingStop) 
               {
               if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
                  }
               }
            }
         }  // Symbol()  
      } // select
   } //total 

//+================================= TrailingStop ==================================+
  return(0);
  }
//ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ Конец функции int start() ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
 

//+=================================================================================+
//==================================== Блок ММ =====================================+ 
double LotsCounting() 
{ 
double lots=Lots;
   if (MoneyManagement)      
   {
      double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE);
      double freemargin=AccountFreeMargin();
      lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),2);
      Comment(NormalizeDouble((MarginPercent*freemargin/lotsize),2));    
      }
   if (lots>5) lots=4.9; if (lots<0.1) lots=0.1;return (lots);   
   }
 
Вот весь код
 
if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим
 

Перенесите блок трайлингстопа выше строк:


// вот сюда 
if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим
   prevtime = Time[0]; // Свежий бар, запоминаем время
 
А как теперь сделать чтоб он тралил с шагом? к примеру 50 пнуктов
 

Нужно задействовать другой трал, - такой, где предусмотрен шаг .

Например. Старый трал удалить.

Во внешних параметрах задать (вместо extern int TrailingStop=50;) :

extern string    _____= "Параметры функции ТРЕЙЛИНГ СТОП";
extern bool   UseTrailing = true;//Выключатель трейлинг стопа
extern int    MinProfit = 150;    //порог включения трейлин стопа
extern int    TrailingStop = 75;// величина трейлинг стопа
extern int    TrailingStep = 5; // шаг трейлинг стопа

В самом конце кода советника (вне функции СТАРТ) поставить функцию такого трала:

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
 
 void TrailPositions() // функция трейлинг стоп
{
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
     if (OrderMagicNumber() == Magic ){    
     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);
        }   }   }    }   }  }

А в самом начале функции СТАРТ задать:

if (UseTrailing) TrailPositions(); // выключатель трейлинг стопа