Вопрос к специалистам - страница 2

 
как это можно вставить в этот советник.
Файлы:
 

Опоздал но всё равно предложу свой вариант...

extern double Lots = 0.1;
extern double TrailingStop = 25;// расстояние после которого будем устанавливать безубыток
extern double X=5;//установка в + 5 пунктов! 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;

   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 

   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1 && ao2 > ao1 && ac2 > ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                  
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop && OrderStopLoss()!=OrderOpenPrice()+X*Point)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+X*Point,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {               
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if(NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(OrderOpenPrice()-X*Point,Digits))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-X*Point,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
 
Kostay:
как это можно вставить в этот советник.

Думаю не стоит это вставлять...

 
почему? Код не подходит?
 

Подходит. Вам что нужно? Чтобы по достижению определённого уровня прибыли один раз выставлялся стоп в +Х пунктов? Если да, то эксперт это уже делает. так зачем заморачиваться лишними функциями?

 
Kostay:

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

Компиляцией занимается в основном компилятор))

CheckNeedSetMinProfit() - это отдельная функция и должна находиться "снаружи" функции start

Для того, чтобы она выполнялась нужно вызвать ее из ф-ии start в нужных местах.

         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
               
               CheckNeedSetMinProfit(); //это вызов функции 
               //все что было раньше убрать              
               //if(Bid-OrderOpenPrice()>Point*13)
               //  {
               //   if(OrderStopLoss()<Bid-Point*13)
               //     {
               //      OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green);
               //      return(0);
               //     }
               //  }
              
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
               
               CheckNeedSetMinProfit(); //аналогично для короткой позиции
               //if((OrderOpenPrice()-Ask)>(Point*13))
               //  {
               //   if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0))
               //     {
               //      OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red);
               //      return(0);
               //     }
               //  }
              
           }        

Вообще в таком виде советник нельзя использовать даже на демо-счете (на тестере гонять можно:-)

Нужны проверки ошибок для всех рыночных функций.

 
StatBars:

зачем заморачиваться лишними функциями?

Улучшается читаемость кода и исключаются повторяющиеся элементы.

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

Например, если мы захотим получать MinProfit не в пунктах, а в %-ах от максимально достигнутой прибыли по открытой позиции или в ATR'ах, достаточно будет переписать функцию CheckNeedSetMinProfit() или сделать опцию из нескольких функций похожего назначения.

 

Я начинающий программист на MQL4/

Прошу по силе и возможности помочь мне разобраться в нюансах синтаксиса MQL4 или увидеть ошибку в написании определенного эксперта. Дело в том, что приклепленный к данному сообщению разрабатываемый мною эксперт точно по алгоритау выполнят действия 1, 2 и 3, а вот действия 4 и 5 не выполняет. Уже целую неделю потратил на проработку различного рода комбинации с кодом, прочитал уйму литературы, а так и не смог добиться, чтобы функции и операторы в пп. 4 и 5 заработали. Прошу пожа-а-а-луйста помочь не потерять надежду на успех, а то "чайник" уже "кипит", а результата нет, просто руки опускаются от безисходности. Заранее премного благодарен!!!!

//+------------------------------------------------------------------+
//|                                                        Robot.mq4 |
//+------------------------------------------------------------------+

//-------------------------------------------------------------------+
extern double StopLoss   =17;     //SL ордера
extern double TakeProfit =15;     //TP ордера
extern double Lots        =0.01;     //стоимость ордера
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()                                                                                                                   //Открытие функции int start() 
  {
  int total=OrdersTotal();                                                                                                    //Определение переменной количества открытых ордеров
  if(total<1)                                                                                                                 //Условие: отсутствуют отложенные и открытые ордера
  {
   int order1=OrderSend(Symbol(), OP_SELLLIMIT, Lots, Ask+10*Point,3, Ask+(StopLoss+10)*Point, Ask-(TakeProfit-10)*Point);    //Открытие ордера order1: SELLLIMIT

   int order2=OrderSend(Symbol(), OP_BUYLIMIT, Lots, Ask-10*Point,3, Ask-(StopLoss+10)*Point, Ask+(TakeProfit-10)*Point);     //Открытие ордера order2: BUYLIMIT


//-------------------------------------------------------------------  1
  
   OrderSelect(order1, SELECT_BY_TICKET, MODE_TRADES);                                                                        //вызывается ордер1
   double cena1=OrderOpenPrice();                                                                                             //Определяется цена открытия ордера1
   int order3=OrderSend(Symbol(), OP_BUYSTOP, Lots, cena1+5*Point,3, cena1+(5-StopLoss)*Point, cena1+(5+TakeProfit)*Point);   //Открытие ордера order3: BUYSTOP

  
//-------------------------------------------------------------------  2
  
   OrderSelect(order2, SELECT_BY_TICKET, MODE_TRADES);                                                                         //Вызывается ордер2
   double cena2=OrderOpenPrice();                                                                                              //Определяется цена открытия ордера2
   int order4=OrderSend(Symbol(), OP_SELLSTOP, Lots, cena2-5*Point,3, cena2+(StopLoss-5)*Point, cena2-(TakeProfit+5)*Point);   //Открытие ордера order4: SELLSTOP


  return(0);                                                                                                                   //Прекращение исполнения 1-ой функции
  }
//-------------------------------------------------------------------  3
  
  OrderSelect(order2, SELECT_BY_TICKET, MODE_TRADES);                                                                          //Вызывается ордер2
  double cena3=OrderOpenPrice();                                                                                               //Определяется цена открытия ордера2
  if(Ask<cena3+5*Point)                                                                                                        //Условие: Ask меньше чем цена открытия ордера2 плюс 5 пунктов
  {
   OrderModify(order1, cena3+TakeProfit*Point, cena3+(TakeProfit+StopLoss)*Point, cena3, 0);                                   //Модификация ордера1 относительно цены открытия ордера2
  
  return(0);                                                                                                                   //Прекращение исполнения 2-ой функции
  }
//-------------------------------------------------------------------  4
  
   OrderSelect(order1, SELECT_BY_TICKET, MODE_TRADES);                                                                         //Вызывается ордер1
   double cena4=OrderOpenPrice();                                                                                              //Определяется цена открытия ордера1
   if(Ask>cena4-5*Point)                                                                                                       //Условие: Ask ,больше чем цена открытия ордера1 минус 5 пунктов
  {
   OrderModify(order2, cena4-TakeProfit*Point, cena4-(TakeProfit+StopLoss)*Point, cena4, 0);                                   //Модификация ордера2 относительно цены открытия ордера1

  return(0);                                                                                                                   //Прекращение исполнения 3-ей функции
  }
//-------------------------------------------------------------------  5
  return(0);                                                                                                                   //Закрытие функции int start()
  }
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  { return(0); }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  { return(0); }
Причина обращения: