M-mason
Михаил

 
Уровень 16

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


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

Рейтинг 2092



РЕКОМЕНДУЮ




Лучшее от M-mason



Индикатор Наипростейший. Комментариев 9
2015-03-04 18:34:57Рейтинг 0

Коробок Комментариев 15
2021-11-07 22:13:07Рейтинг 0

ProBoy /OtBoy/

Уважаемые программисты!
На днях по моей просьбе был написан советник: zakaz.opentraders.ru/62861.html. Работа выполнена идеально, но к сожалению стратегия не так прекрасна, как хотелось бы. В связи с чем прошу внести небольшие корректировки /сам не смог, вроде бы не сложно, как не пытался ничего не получается/. Вместо SellStop и BuyStop устанавливать BuyLimit и SellLimit, И вместо StopLoss тралить ордера по TakeProfit.
Вдвоём, я думаю, советникам будет работать веселее.
В счет следующего месяца, если есть такая возможность*pardon* ⟨Внимание! Одно из основных условий — заказы принимаются в бесплатную работу только с 3-го уровня и не более 1 заказа в месяц.⟩
Спасибо!
  • 0
  • Просмотров: 2455
  • 14 ноября 2021, 19:21
  • M-mason
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
<code>//+------------------------------------------------------------------+
//| ProBoy.mq4 |
//| Copyright 2021, AM2 |
//| <a href="https://www.forexsystems.biz">www.forexsystems.biz</a> |
//+------------------------------------------------------------------+
#property copyright «Copyright 2021, AM2»
#property link «<a href="https://www.forexsystems.biz">www.forexsystems.biz</a>»
#property version «1.00»
#property strict

//--- Inputs
extern double Lots = 0.1; // лот
extern double KLot = 2; // умножение лота
extern double MaxLot = 5; // лот для вирта

extern int StopLoss = 0; // лось
extern int TakeProfit = 1000; // язь

extern int Candles = 20; // свечей в коробке
extern int CandleTrail = 10; // свечей для трала

extern int Delta = 0; // расстояние от цены
extern int Slip = 30; // реквот
extern int Magic = 123; // магик

extern bool BuyStop = true; // BuyStop
extern bool SellStop = true; // SellStop

datetime t=0;
double hi=0,lo=0;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double sl=0,tp=0;

if(type==1 || type==3 || type==5)
{
clr=Red;

if(StopLoss>0)
{
sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
}
if(TakeProfit>0)
{
tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
}
}

if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0)
{
sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
}
if(TakeProfit>0)
{
tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
}
}

r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()>0)
break;
if(OrderProfit()<0)
{
lot=OrderLots()*KLot;
break;
}
}
}
if(lot>MaxLot)
lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу |
//+------------------------------------------------------------------+
int CountOrders(int type)
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==type)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ModeOOP()
{
bool m=1;
double sl=0,tp=0;
lo=Low[iLowest(NULL,0,1,Candles,0)];
hi=High[iHighest(NULL,0,2,Candles,0)];
double opb=NormalizeDouble(hi+Delta*_Point,_Digits);
double slb=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)]-Delta*_Point,_Digits);
double ops=NormalizeDouble(lo-Delta*_Point,_Digits);
double sls=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)]+Delta*_Point,_Digits);

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUYSTOP)//4
{
if(OrderOpenPrice()!=opb)
{
if(TakeProfit>0)
{
tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
}
if(StopLoss>0)
{
slb=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
}
m=OrderModify(OrderTicket(),opb,slb,tp,0,Blue);
return;
}
}

if(OrderType()==OP_SELLSTOP)//5
{
if(OrderOpenPrice()!=ops)
{
if(TakeProfit>0)
{
tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
}
if(StopLoss>0)
{
sls=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
}
m=OrderModify(OrderTicket(),ops,sls,tp,0,Blue);
return;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CandleTrailing()
{
bool mod=1;
double sl=0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
sl=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)]-Delta*_Point,_Digits);

if(Bid>sl)
{
if(OrderStopLoss()<sl || OrderStopLoss()==0)
{
if(OrderStopLoss()!=sl)
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
return;
}
}
}

if(OrderType()==OP_SELL)
{
sl=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)]+Delta*_Point,_Digits);

if(Ask<sl)
{
if(OrderStopLoss()>sl || OrderStopLoss()==0)
{
if(OrderStopLoss()!=sl)
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
return;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(t!=Time[0])
{
lo=Low[iLowest(NULL,0,1,Candles,0)];
hi=High[iHighest(NULL,0,2,Candles,0)];

ModeOOP();

if(CandleTrail>0)
CandleTrailing();

if(CountTrades()<1)
{
if(BuyStop && CountOrders(4)<1)
{
PutOrder(4,hi+Delta*_Point);
}
if(SellStop && CountOrders(5)<1)
{
PutOrder(5,lo-Delta*_Point);
}
}
t=Time[0];
}

Comment("\n Lot: ",Lot());
}
//+------------------------------------------------------------------+</code>

Редактирован: 14 ноября 2021, 20:13
avatar

  16  M-mason Автор Сообщений: 99 - Михаил

  • 14 ноября 2021, 19:22
+
0
И вместо StopLoss тралить ордера по TakeProfit. это как?
avatar

  13  verta81 Сообщений: 357

  • 14 ноября 2021, 20:16
+
0
extern int CandleTrail = 10; // свечей для трала
нужно чтобы эта функция работала не для StopLoss, а для TakeProfit.
avatar

  16  M-mason Автор Сообщений: 99 - Михаил

  • 14 ноября 2021, 20:57
+
0
Take на High/Low 10 свечей? и ждать бешенного импульса для срабатывания тэйка?
StopLoss не тралится, или фиксированный — это длительная просадка в ожидании лося или профита.
Может для лимитников лучше входить на экстремумах за 10 свечей и тралить стоп по экстремумам за 20 свечей, к примеру.
avatar

  13  verta81 Сообщений: 357

  • 14 ноября 2021, 21:03
+
0
Может для лимитников лучше входить на экстремумах за 10 свечей и тралить стоп по экстремумам за 20 свечей, к примеру.
может быть. Но хотелось бы запустить зеркальную копию имеющегося советника, чтобы работали в паре. А имея оба советника с различными алгоритмами работы, я, возможно, со своими познаниями смогу собрать советник и по предложенному Вами варианту.
avatar

  16  M-mason Автор Сообщений: 99 - Михаил

  • 14 ноября 2021, 21:46
+
0

//+------------------------------------------------------------------+
//|                                                       ProBoy.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 2;        // умножение лота
extern double MaxLot     = 5;        // лот для вирта

extern int StopLoss      = 0;      // лось
extern int TakeProfit    = 0;     // язь

extern int Candles       = 20;       // свечей в коробке
extern int CandleTrail   = 10;       // свечей для трала

extern int Delta         = 100;      // расстояние от цены
extern int Slip          = 30;        // реквот
extern int Magic         = 123;        // магик

extern bool BuyStop      = true;        // BuyStop
extern bool SellStop     = true;        // SellStop

datetime t=0;
double hi=0,lo=0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;

      if(StopLoss>0)
        {
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
        }
      if(TakeProfit>0)
        {
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
        }
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
        {
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
        }
      if(TakeProfit>0)
        {
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
        }
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderProfit()>0)
            break;
         if(OrderProfit()<0)
           {
            lot=OrderLots()*KLot;
            break;
           }
        }
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeOOP()
  {
   bool m=1;
   double sl=0,tp=0;
   lo=Low[iLowest(NULL,0,1,Candles,0)];
   hi=High[iHighest(NULL,0,2,Candles,0)];
   double opb=NormalizeDouble(hi+Delta*_Point,_Digits);
   double slb=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)],Digits);
   double ops=NormalizeDouble(lo-Delta*_Point,_Digits);
   double sls=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)],_Digits); 

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_SELLLIMIT)//4
              {
               if(OrderOpenPrice()!=opb)
                 {
                  if(TakeProfit>0)
                   {
                    tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
                   }
                  if(StopLoss>0)
                   {
                    sl=NormalizeDouble(OrderOpenPrice()+StopLoss*_Point,_Digits);
                   }
                  m=OrderModify(OrderTicket(),opb,sl,tp,0,Blue);
                  return;
                 }
              }

            if(OrderType()==OP_BUYLIMIT)//5
              {
               if(OrderOpenPrice()!=ops)
                 {
                  if(TakeProfit>0)
                   {
                    tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
                   }
                  if(StopLoss>0)
                   {
                    sl=NormalizeDouble(OrderOpenPrice()-StopLoss*_Point,_Digits);
                   }
                  m=OrderModify(OrderTicket(),ops,sl,tp,0,Blue);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CandleTrailing()
  {
   bool mod=1;
   double tp=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               tp=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)],Digits);

               if(Bid<tp)
                 {
                  if(OrderTakeProfit()<tp || OrderTakeProfit()==0)
                    {
                     if(OrderTakeProfit()!=tp)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==1)
              {
               tp=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)],Digits);

               if(Ask>tp)
                 {
                  if(OrderTakeProfit()>tp || OrderTakeProfit()==0)
                    {
                     if(OrderTakeProfit()!=tp)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(t!=Time[0])
     {
      lo=Low[iLowest(NULL,0,1,Candles,0)];
      hi=High[iHighest(NULL,0,2,Candles,0)];

      ModeOOP();

      if(CandleTrail>0)
         CandleTrailing();

      if(CountTrades()<1)
        {
         if(BuyStop && CountOrders(3)<1)
           {
            PutOrder(3,hi+Delta*_Point);
           }
         if(SellStop && CountOrders(2)<1)
           {
            PutOrder(2,lo-Delta*_Point);
           }
        }
      t=Time[0];
     }

   Comment("\n Lot: ",Lot());
  }
//+------------------------------------------------------------------+

avatar

  13  verta81 Сообщений: 357

  • 15 ноября 2021, 00:30
+
0
Спасибо*good* Мастер!
avatar

  16  M-mason Автор Сообщений: 99 - Михаил

  • 15 ноября 2021, 08:17
+
0
2 в одном :)  ненужные ордера можно отключить: www.opentraders.ru/downloads/3176/



avatar

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

  • 15 ноября 2021, 18:11
+
0
Спасибо, Андрей, Вы творите добро на этом форуме*bravo* 
avatar

  16  M-mason Автор Сообщений: 99 - Михаил

  • 15 ноября 2021, 23:11

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