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_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)],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)],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());
  }
//+------------------------------------------------------------------+

avatar

verta81

  • 12 ноября 2021, 02:49
0
самое точное креативное Техническое задание))
youtu.be/UoKlKx-3FcA
avatar

verta81

  • 31 октября 2021, 16:59
0
Ultimate Arrows перерисовывает, из-за чего будет много лосей.
avatar

verta81

  • 19 октября 2021, 16:11
0
EA Skynet.ex 4 (0 Kb)
0 kb -??????
avatar

verta81

  • 18 октября 2021, 11:38
0
Огромный масштаб, чтобы было видно точки натяжки фибы.
Вебинар смотрел и написал Вам, что при входе в каждый сигнал SAR будет слив.
Поэтому нужно учитывать еще несколько факторов, например: направление тренда; время открытия, закрытия и пребывание в сделке и пр.
На видео демонстрация работы входа в сделку по сигналу от SAR, как у Сэнсэя Т.
но без определения глобального тренда.
avatar

verta81

  • 17 октября 2021, 20:12
0
На автомате входя во все сигналы SAR, никак не изменится результат.
Вот Вам одноцвет по хаям/лоям:
youtu.be/1Wqlq9e87DQ
avatar

verta81

  • 17 октября 2021, 19:01
0
Обратите внимание, то товарищ Тулеген натягивает сетку от лоя/хая при смене SAR, до предыдущего хая/лоя текущего дня.
Также можно натягивать фибу по одной последней сече, по двум свечам и от лоя/хая до фрактала.
Результат будет примерно одинаковый:

youtu.be/kw3JOekNSfg
В стратегии нужно учитывать еще несколько факторов, например: направление тренда; время открытия, закрытия и пребывание в сделке.
avatar

verta81

  • 17 октября 2021, 15:02
0
там одну строку закомментировать надо, или удалить.
Выше пример.
//PutFibo("Fibo",Time[0],Close[0],Time[13],Close[13]);

27-я строка
avatar

verta81

  • 16 октября 2021, 15:42
+1
Должно быть так:
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
   //PutFibo("Fibo",Time[0],Close[0],Time[13],Close[13]);
//---
   return(INIT_SUCCEEDED);
  }
avatar

verta81

  • 16 октября 2021, 15:25
0
youtu.be/hreIzUgzelE
все работает.
Или что-то не так не видео?
avatar

verta81

  • 16 октября 2021, 15:15
0
Огромное всем спасибо за помощь.
Нашел решение своей проблемы по примеру кода Андрея.
Благодарочка!!!
avatar

verta81

  • 5 октября 2021, 14:35
0
как на данный момент советник устанавливает размер лота:
sell 0.1
sell 0.1
sell 0.2
sell 0.4
buy 0.8
sell 0.16
сбой пошел же на buy, лот которого должен быть начальный 0.1
Вот ищу где ощибка
avatar

verta81

  • 4 октября 2021, 18:49
0
Спасибо, но это не то.
В вашем примере функция находит тикет последнего ордера, последнего закрытого и тип последней открытой.
Мне нужно найти лот последнего Buy или Sell
//+------------------------------------------------------------------+
//|                послекдний ордер по типу                          |
//+------------------------------------------------------------------+
double FindLastOrderLot(int type)
  {
   double OLot=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)
              {
               if(OLot<OrderLots())
                 OLot=OrderLots();
              }
           }
        }
     }
   return(OLot);
  }

и потом же умножить его на кеф для следующего ордера Buy или Sell
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(Risk>0)
      lot=AccountBalance()/(Risk*100);
//-----------------------------------
   if(CountOrders(1)>=2 && CountOrders(1)<6)
     lot=NormalizeDouble(KLot*FindLastOrderLot(1),2);
   if(CountOrders(1)>=6)  
     lot=NormalizeDouble((KLot*0.75)*FindLastOrderLot(1),2); 
   if(CountOrders(0)>=2 && CountOrders(0)<6)
     lot=NormalizeDouble(KLot*FindLastOrderLot(0),2);
   if(CountOrders(0)>=6)  
     lot=NormalizeDouble((KLot*0.75)*FindLastOrderLot(0),2);     
//--------------------------------
  
   if (lot>MAXLOT) lot = MAXLOT;
   if (lot<MINLOT) lot = MINLOT;
   return(lot);
  }
avatar

verta81

  • 4 октября 2021, 18:45
0
Так же буду благодарен за любую рекомендацию по оптимизации кода советника.
avatar

verta81

  • 4 октября 2021, 18:09
0
Ваш советник торгует сразу 24-ю парами?
Или стоит на 24-х парах?
avatar

verta81

  • 28 сентября 2021, 20:52
0
В вашем коде функция CloseAll() закрывает ордера именно по магику
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
avatar

verta81

  • 28 сентября 2021, 20:46
0
Спасибо большое.
avatar

verta81

  • 21 сентября 2021, 21:55
0
Спасибо.
avatar

verta81

  • 21 сентября 2021, 18:49