Aleh7999

 
Уровень 15

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2081



РЕКОМЕНДУЮ



Помощь в исправлении кода советника

Всем доброго дня.
Можно изменить в коде условие: «Советник открывает позицию в зависимости от закрытия прошлой позиции. Если позиции не было то в зависимости от направления прошлой свечи» на возможность выставления 2-х отложенных ордеров на определенной дистанции от текущей цены и при срабатывании одного из ордеров 2-й удалялся. Весь остальной алгоритм остается без изменения. Сам подправлял, но рабочей версии не смог добиться.

#property description "Советник открывает позицию в зависимости от закрытия прошлой позиции. Если позиции не было то в зависимости от направления прошлой свечи"

#property description "При достижение Т/P следующий ордер открывается в эту же сторону"

#property description "При достижение S/L следующий открывается в противоположную сторону"

//+------------------------------------------------------------------

#property show_inputs

//+------------------------------------------------------------------

enum TT {BUY, SELL, BUYLIMIT, SELLLIMIT, BUYSTOP, SELLSTOP};

enum YN {No,Yes};

//+------------------------------------------------------------------

extern TT     Type         = BUY;

extern double Price        = 0; 

extern int    Distance     = 0;

extern int    stoploss     = 300,

              takeprofit   = 300;

extern double risk         = 0.01; //процент от депозита для рассчета объема первой позиции

extern double KoeffMartin  = 2.0;

extern int    OkrLOT       = 2;//округление лота

extern int    slippage     = 3;//Максимально допустимое отклонение цены для рыночных ордеров

extern int    MagicNumb    = 77;//Magic



double MINLOT,MAXLOT;                                  

//+------------------------------------------------------------------+

int OnInit()

{

   MAXLOT = MarketInfo(Symbol(),MODE_MAXLOT);

   MINLOT = MarketInfo(Symbol(),MODE_MINLOT);

   return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

void OnTick()

{

   double OSL,OTP,OOP,SL,TP;

   int tip;

   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);

   for (int i=0; i
   {

      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

      {

         if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumb)

         {

            tip = OrderType(); 

            OSL = NormalizeDouble(OrderStopLoss(),Digits);

            OTP = NormalizeDouble(OrderTakeProfit(),Digits);

            OOP = NormalizeDouble(OrderOpenPrice(),Digits);

            SL=OSL;TP=OTP;

            if (tip==OP_BUY)             

            {  

               if (OSL==0 && stoploss>=STOPLEVEL && stoploss!=0)

               {

                  SL = NormalizeDouble(OOP - stoploss   * Point,Digits);

               } 

               if (OTP==0 && takeprofit>=STOPLEVEL && takeprofit!=0)

               {

                  TP = NormalizeDouble(OOP + takeprofit * Point,Digits);

               } 

               if (SL != OSL || TP != OTP)

               {  

                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify <<",GetLastError(),">> ");

               }

            }                                         

            if (tip==OP_SELL)        

            {

               if (OSL==0 && stoploss>=STOPLEVEL && stoploss!=0)

               {

                  SL = NormalizeDouble(OOP + stoploss   * Point,Digits);

               }

               if (OTP==0 && takeprofit>=STOPLEVEL && takeprofit!=0)

               {

                  TP = NormalizeDouble(OOP - takeprofit * Point,Digits);

               }

               if (SL != OSL || TP != OTP)

               {  

                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify <<",GetLastError(),">> ");

               }

            } 

            return;

         }

      }

   }

   tip=-1;

   double Lot=0;

   

   for (i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

      {

         if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumb)

         {

            if (OrderProfit()<0) 

            {

               Lot=lot(OrderLots(),KoeffMartin);

               tip=OrderType();

            }

            else 

            {

               Lot=lot(0,1);

               if (OrderType()==OP_BUY)  tip=OP_SELL;

               if (OrderType()==OP_SELL) tip=OP_BUY;

            }

            break;

         }

      }

   }



   if (tip==-1)

   {

      Lot=lot(0,1);

      if (Open[1]>Close[1]) tip=OP_BUY;

      else tip=OP_SELL;

   }

   

   if (tip==OP_BUY) if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bi  d,Digits),slippage,0,0,NULL,MagicNumb,Blue)!=-1) Comment("Open Sell");

   if (tip==OP_SELL) if (OrderSend(Symbol(),OP_BUY ,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL  ,MagicNumb,Blue)!=-1) Comment("Open Buy");

                                    

}

//--------------------------------------------------------------------

double lot(double l,double k)

{

   double ML = AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);

   if (k==1) l = ML*risk/100;

   else l = NormalizeDouble(l*k,OkrLOT);

   if (l>ML) l = ML;

   if (l>MAXLOT) l = MAXLOT;

   if (l
   return(l);

}

//-----------------------------------------------------------------

            {

               Lot=lot(0,1);

               if (OrderType()==OP_BUY)  tip=OP_SELL;

               if (OrderType()==OP_SELL) tip=OP_BUY;

            }

            break;

         }

      }

   }



   if (tip==-1)

   {

      Lot=lot(0,1);

      if (Open[1]>Close[1]) tip=OP_BUY;

      else tip=OP_SELL;

   }

   

   if (tip==OP_BUY) if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bi  d,Digits),slippage,0,0,NULL,MagicNumb,Blue)!=-1) Comment("Open Sell");

   if (tip==OP_SELL) if (OrderSend(Symbol(),OP_BUY ,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL  ,MagicNumb,Blue)!=-1) Comment("Open Buy");

                                    

}

//--------------------------------------------------------------------

double lot(double l,double k)

{

   double ML = AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);

   if (k==1) l = ML*risk/100;

   else l = NormalizeDouble(l*k,OkrLOT);

   if (l>ML) l = ML;

   if (l>MAXLOT) l = MAXLOT;

   if (l
   return(l);

}

//-----------------------------------------------------------------

  • 0
  • Просмотров: 1099
  • 17 декабря 2019, 11:26
  • Aleh7999
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
16 декабря 2019
17 декабря 2019

Комментарии (5)

+
0
напишу с нуля и с поручителем
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 17 декабря 2019, 17:40
+
0
Спасибо. Я могу сюда закинуть MQL файл для удобства. И подскажите "поручительство" мне необходимо что либо дополнительно предпринять?
Редактирован: 17 декабря 2019, 19:03
avatar

  15  Aleh7999 Автор Сообщений: 80

  • 17 декабря 2019, 19:00
+
+1
пишите тз и в топике — ищу поручителя
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 17 декабря 2019, 19:36
+
0
Тогда удалите эту ветку. Я по новому напишу заказ.
avatar

  15  Aleh7999 Автор Сообщений: 80

  • 17 декабря 2019, 19:58
+
0
Согласно алгоритма советник открывает позицию в зависимости от закрытия прошлой позиции.
Если позиции не было то в зависимости от направления прошлой свечи.

Данный алгоритм нужно заменить на:

Покупка:

Выставляем 2-а отложенных ордера BuyStop по цене указанной в настройках и SellStop по цене указанной в настройках.
Как только цена достигает одного из стоп ордеров, он переходит в рыночную позицию с выставлением ТР и SL. Ордер который не сработал удаляется.

Весь остальной алгоритм остается без изменения т.е.: «При достижение Т/P следующий ордер открывается в эту же сторону»
«При достижение S/L следующий открывается в противоположную сторону»
avatar

  15  Aleh7999 Автор Сообщений: 80

  • 18 декабря 2019, 21:09

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари