Напишу советник бесплатно - страница 18

 

Нужна помощь.

http://forum.mql4.com/ru/67309#1011467 

Помогите добавить к текущему советник пирамидинг. - MQL4 форум
  • www.mql5.com
Помогите добавить к текущему советник пирамидинг. - MQL4 форум
 

Подскажите: ордера открываются не каждый день траллинг не работает и закрываются открытые ордера не по ТП. В чем я ошибся ?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
   static bool IsFirstTick = false;
   static int ticket = 0;
  
   double lot=Lot_Normalize(Symbol(),Lots,1);
   double sl= Dist_Normalize(Symbol(),Trals);
   double step= Dist_Normalize(Symbol(),_Step);
  
   int h= TimeHour(TimeCurrent());
   if(h == StartHour)
   {
    Alert("TimeHor: ", h);
    if (IsFirstTick == true)
      IsFirstTick = false;
     
      bool res;
      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      {
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
           
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }  
      }
       if(Open[0] < Open[StartHour])
      {
         ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! BUY_LIMIT");
       }
       else
       {
         ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! SEL_LLIMIT");
    }  
}
 
}  

double Dist_Normalize(string Smv, int _Distancia)
{
 int Dig= int(MarketInfo(Smv,MODE_DIGITS));
 double Pip=MarketInfo(Smv,MODE_POINT);
 if(Dig==3 || Dig==5)
   return NormalizeDouble(_Distancia*10*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
 } 


double Lot_Normalize(string Smv, double _lot, double _mult)
{
 double minlot=MarketInfo(Smv,MODE_MINLOT);
 double maxlot=MarketInfo(Smv,MODE_MAXLOT);
 double steplot=MarketInfo(Smv,MODE_LOTSTEP);
 double lot= _lot*_mult;
 if(lot<=minlot) lot+minlot;
 else if(lot>=maxlot) lot=minlot;
 else if(lot>minlot && lot<maxlot)
  {
    int k=int((lot-minlot)/steplot);
    lot=NormalizeDouble(minlot+k*steplot,2);
  }
  return(lot);




void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
  int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
  for(int pos=OrdersTotal()-1; pos>=0;pos--)
    {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
      OrderMagicNumber()==_Magic && OrderType()<2)
        {
          double SLPrice;
          if(OrderType()==OP_BUY)
            {
              if(_Step_Use)
              {
                RefreshRates();
                if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
                {
                  SLPrice=NormalizeDouble(Ask-_Tral,Dig);
                  if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                   Alert("Error modifi Order!: ",GetLastError());
                  }
                 }
               else
                 {
                  RefreshRates();
                  if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
                    {
                     SLPrice=NormalizeDouble(Bid+_Tral,Dig);
                     if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                     Alert("Error modifi Order!: ",GetLastError());
                 }
             }
          }
       }
    }
 }            

 
MIR_KAZAN:

Подскажите: ордера открываются не каждый день траллинг не работает и закрываются открытые ордера не по ТП. В чем я ошибся ?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
 ......
 

    if (IsFirstTick == true)

      IsFirstTick = false;   

Это кусок я бы заменил на

if (TM!=Time[0])
{
   TM = Time[0];
......
}

 где переменная ТМ объявлена как DateTime вне функции OnTick(), то есть она глобальная для данного модуля.  

Не понятен вот это код : if(Open[0] < Open[StartHour])

 StartHour у вас равен 23  и получается вы сравниваете цену открытия нулевого бара с ценой открытия 23-го бара назад. Ну да ладно возможно это такая фишка у советника.

Но вот эта конструкция вообще не годная

      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      { 
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
            
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }   
      }

 А если у вас переменная ticket равна нулю, или была переинициализация советника и переменная эта была сброшена по умолчанию?

 
StartHour это время когда советник должен работать. Там должно быть час ночи. А почему траллинг не работает ?
 
MIR_KAZAN:
StartHour это время когда советник должен работать. Там должно быть час ночи. А почему траллинг не работает ?

Надо анализировать код, что бы понять почему он не работает.

Попробуйте вставить в  функцию Tralling_Stop() функцию Print("Tralling_Stop"), и смотрите в журнале будет ли там это сообщение (Tralling_Stop), если нет, то значит эта функция не вызывается. Если есть то анализируйте саму функцию  Tralling_Stop() может в ней какие то  логические ошибки. 

Вообщем везде где есть логические условия if вставьте Print(" сработало условие 1" ), Print(" сработало условие 2" )  и т.д.  Запустите советника в тестере и в журнале сможете отследить логику работы вашего эксперта.  

 
vitales:

Надо анализировать код, что бы понять почему он не работает.

Попробуйте вставить в  функцию Tralling_Stop() функцию Print("Tralling_Stop"), и смотрите в журнале будет ли там это сообщение (Tralling_Stop), если нет, то значит эта функция не вызывается. Если есть то анализируйте саму функцию  Tralling_Stop() может в ней какие то  логические ошибки. 

Вообщем везде где есть логические условия if вставьте Print(" сработало условие 1" ), Print(" сработало условие 2" )  и т.д.  Запустите советника в тестере и в журнале сможете отследить логику работы вашего эксперта. 


Пробовал переписать но все равно работает не так как мне надо. То ордера не открываются когда надо, то не траллит. По идеи советник должен работать так: По закрытии последней свечи за сутки ( это в 00:00 часов ) должен открыть две отложки по High (на бай) и по Low (на сел) после чего просто их траллить. через сутки все повторяется.

input int     StartHour    = 1;     // Начало торговли
input int     TakeProfit   = 40;    // TakeProfit
input int     StopLoss     = 10;    // StopLoss
extern double Lots         = 0.1;   // Лот для торговли
input int     Magic        = 22;    // Магическое число
input int     Trals        = 5;     // Дистанция тралинга в пунктах
input int     _Step        = 1;     // Шаг
input bool    _StepUse     = false; // Использовать шаг или неT

void OnTick()
{
   static bool IsFirstTick = false;
  
   Trailing();
  
   if (StartHour != Hour()) { return;}
   if (OrdersTotal()>0)
   {
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);                    
   }
}           

//+------------------------------------------------------------------+ 
void Trailing()
{
  if (_StepUse)
{
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;      
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
}
//+------------------------------------------------------------------+

 
MIR_KAZAN:

Попробуйте 

if (StartHour != Hour()) { return;} 

Заменить на:

if (StartHour != TimeHour(Time[0])) { return;}//Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп. 
 if (OrdersTotal()>0)
{
....
}

 заменить на: 

if (OrdersTotal()==0) 
{
    bool rezult = false;
    rezult=OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера BUY LIMIT");
    rezult = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера SELL LIMIT"); 
//для работы в реале надо сделать более детальную проверку ошибок 

} else Trailing();

 Кроме этого цены должны быть нормализованы с помощью функции NormalizeDouble(). То есть вместо Low[1]-StopLoss*Point надо писать NormalizeDouble(Low[1]-StopLoss*Point,Digits()).

Также судя по вашему коду если переменная _StepUse равна false то трейлинг стоп у вас работать не будет. Смотрите внимательно код функции Trailing()

void Trailing()
{
  if (_StepUse)//если false то код внутри скобок выполнятся не будет.
  {
   ......

  }
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
 
vitales:

Попробуйте 

Заменить на:

 заменить на: 

 Кроме этого цены должны быть нормализованы с помощью функции NormalizeDouble(). То есть вместо Low[1]-StopLoss*Point надо писать NormalizeDouble(Low[1]-StopLoss*Point,Digits()).

Также судя по вашему коду если переменная _StepUse равна false то трейлинг стоп у вас работать не будет. Смотрите внимательно код функции Trailing()

Ты в контакте есть ? Напиши мне http://vk.com/computerwizard116. Я уже не знаю как решит проблему советника. На демо счете неделю работал по этой стратегии

и он работает. А при тестировании этот гаденыш даже ордера то тейку не закрывает(((((( На фото видно как цена вышла за тейк и вернулась обратно а он закрыл в убыток зараза!(((

Почему он так делает ?

Файлы:
 
MIR_KAZAN:

Ты в контакте есть ? Напиши мне http://vk.com/computerwizard116. Я уже не знаю как решит проблему советника. На демо счете неделю работал по этой стратегии

и он работает. А при тестировании этот гаденыш даже ордера то тейку не закрывает(((((( На фото видно как цена вышла за тейк и вернулась обратно а он закрыл в убыток зараза!(((

Почему он так делает ?

Меня нет в контакте.

Исполнение ордеров тейк профит и стоп лосс не зависит от советника, они исполняются  на сервере брокера. Советник, только устанавливает тейк и стоп, а не исполняет их. Проверьте может тейк профит был установлен уже после того как цена достигла этого значения. То есть сначала был открыт ордер потом цена гуляла туда сюда после чего был установлен тейк профит. 

 
vitales:

Меня нет в контакте.

Исполнение ордеров тейк профит и стоп лосс не зависит от советника, они исполняются  на сервере брокера. Советник, только устанавливает тейк и стоп, а не исполняет их. Проверьте может тейк профит был установлен уже после того как цена достигла этого значения. То есть сначала был открыт ордер потом цена гуляла туда сюда после чего был установлен тейк профит. 

Как правильно вставить в OrderSend TP, Sl чтоб в SL был High предыдущей свечи и TP от Low предыдущей + TakeProfit ?