tal2000

 
Уровень 21

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


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

Рейтинг 2151



РЕКОМЕНДУЮ



советник на индикаторе FL23 Multi TF H1 H4

Прошу создать советник по индикатору FL23 Multi TF H1 H4

Покупки по сигналу индикатора «only buy» выход по сигналу «only sell»
лот
тейк профит
стоп лос
трейлинг стоп

Продажи по сигналу «only sell» выход по сигналу «only buy»
лот
тейк профит
стоп лос
трейлинг стоп

FL23 Multi TF H1 H4.ex4 (11 Kb)

  • 0
  • Просмотров: 3443
  • 25 июля 2021, 13:02
  • tal2000
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

Брокер для ваших роботов, 15 лет на рынке

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

+
0
советник только совсем немного отличается от других на индикаторах серии FL:



www.opentraders.ru/downloads/3066/
avatar

  35  AM2 Сообщений: 16419 - Андрей

  • 25 июля 2021, 19:47
+
0
еще не тестил но судя по скриншоту… как-то много сделок, должно быть 2(1 на продажу 1 на покупку) а там 8? и можно сделать вход только при смене направления
avatar

  21  tal2000 Автор Сообщений: 59

  • 25 июля 2021, 21:29
+
0
как-то много сделок, должно быть 2(1 на продажу 1 на покупку) а там 8?


есть сигнал от индикатора, есть сделка. чтобы уменьшить число сделок можно поставить уровень
avatar

  35  AM2 Сообщений: 16419 - Андрей

  • 26 июля 2021, 07:45
+
0
можно сделать чтобы сделка открывалась только по пересечению нулевого уровня индикатора(в начале сигнала) а не на всем продолжении сигнала, один сигнал одна сделка, если советник включается выше или ниже нулевого уровня то он входит в сделку только когда индикатор пересечет нулевой уровень(новый сигнал)
avatar

  21  tal2000 Автор Сообщений: 59

  • 26 июля 2021, 09:29
+
0
сделки должны происходить только по сигналам H1 а не на всех таймфреймах
avatar

  21  tal2000 Автор Сообщений: 59

  • 26 июля 2021, 10:52
+
0
сделал на пересечении нулевого уровня:


//+------------------------------------------------------------------+
//|                                                    FLMultiTF.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://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      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь

extern int TrailingStop  = 250;      // трал
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // бар индикатора
extern int CloseSig      = 1;        // 1-закрытие по сигналу
extern int Magic         = 123;      // магик

extern string IndName    = "FL23 Multi TF H1 H4";
//+------------------------------------------------------------------+
//| 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;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderProfit()>0)
               break;
            if(OrderProfit()<0)
              {
               lot=OrderLots()*KLot;
               break;
              }
           }
        }
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()<sl)
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Ask+TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()>sl || (OrderStopLoss()==0))
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ind1 = iCustom(NULL,0,IndName,0,Shift);
   double ind2 = iCustom(NULL,0,IndName,0,Shift+1);
   
   bool buy = ind1>0 && ind2<0;
   bool sell = ind1<0 && ind2>0;

   if(CountTrades()<1)
     {
      if(buy)
        {
         PutOrder(0,Ask);
        }

      if(sell)
        {
         PutOrder(1,Bid);
        }
     }

   if(CloseSig>0)
     {
      if(sell)
        {
         CloseAll(0);
        }

      if(buy)
        {
         CloseAll(1);
        }
     }

   if(TrailingStop>0)
      Trailing();

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



но когда происходит дребезг вокруг нуля, множественных переоткрытий не избежать:



также подглючивает зависимый индикатор фл23, выскакивает ошибка деление на ноль
avatar

  35  AM2 Сообщений: 16419 - Андрей

  • 26 июля 2021, 12:11
+
0
нельзя как-то привязать сделки к этой надписи(в тот момент когда меняется sell на buy и buy на sell на закрытии свечи ?)
avatar

  21  tal2000 Автор Сообщений: 59

  • 26 июля 2021, 17:20
+
0
пока много лишних не соответствующих индикатору, передерживание сделок(там где нужно закрывать забывает про них и они висят до следующего сигнала с большим убытком)
Редактирован: 26 июля 2021, 17:25
avatar

  21  tal2000 Автор Сообщений: 59

  • 26 июля 2021, 17:25
+
0
используйте стандартные индикаторы, там не будет пропусков сигнала
avatar

  35  AM2 Сообщений: 16419 - Андрей

  • 26 июля 2021, 17:36
+
0
может исходник поможет улучшить качество сигналов?
avatar

  21  tal2000 Автор Сообщений: 59

  • 26 июля 2021, 18:32
+
+1
#property copyright "Copyright © 2012, forex4live.com"
#property link      "http://www.forex4live.com/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Black
#property indicator_color2 DodgerBlue
#property indicator_color3 White

extern string Notealerts     = "-----Alert Settings-----";
extern bool   MsgAlerts      = TRUE;
extern bool   SoundAlerts    = TRUE;
extern string SoundAlertFile = "alert.wave";
extern bool   eMailAlerts    = FALSE;
       int    G_bars_104;
extern int    BarsCount      = 17;
       
       double G_ibuf_112[];
       double G_ibuf_116[];
       double G_ibuf_120[];

// E37F0136AA3FFAF149B351F6A4C948E9
int init()
 {
  string Lsa_0[256];
  
  for (int index_4 = 0; index_4 < 256; index_4++)
   Lsa_0[index_4] = CharToStr(index_4);
  
  int str2int_8 = StrToInteger(Lsa_0[67] + Lsa_0[111] + Lsa_0[112] + Lsa_0[121] + Lsa_0[32] + Lsa_0[82]  + Lsa_0[105] + Lsa_0[103] + Lsa_0[104] + Lsa_0[116] +
                               Lsa_0[32] + Lsa_0[169] + Lsa_0[32]  + Lsa_0[75]  + Lsa_0[97] + Lsa_0[122] + Lsa_0[97]  + Lsa_0[111] + Lsa_0[111] + Lsa_0[32]  +
                               Lsa_0[50] + Lsa_0[48]  + Lsa_0[49]  + Lsa_0[49]  + Lsa_0[32]);
  
  SetIndexStyle     (0, DRAW_LINE);
  SetIndexStyle     (1, DRAW_LINE);
  SetIndexStyle     (2, DRAW_LINE);
  IndicatorDigits   (Digits + 0);
  SetIndexBuffer    (0, G_ibuf_112);
  SetIndexBuffer    (1, G_ibuf_116);
  SetIndexBuffer    (2, G_ibuf_120);
  IndicatorShortName("FL23");
  SetIndexLabel     (1, NULL);
  SetIndexLabel     (2, NULL);
  
  return(0);
 }

// EA2B2676C28C0DB26D39331A336C6B92
int start()
 {
  double Ld_0;
  double Ld_8;
  double Ld_16;
  
  string Ls_104;
  string Ls_112;
  string Ls_120;
  
  int Li_24 = IndicatorCounted();
  
  double Ld_28        = 0;
  double Ld_36        = 0;
  double Ld_unused_44 = 0;
  double Ld_unused_52 = 0;
  double Ld_60        = 0;
  double Ld_unused_68 = 0;
  double low_76       = 0;
  double high_84      = 0;
  
  if (Li_24 > 0)
   Li_24--;
  
  int Li_92 = Bars - Li_24;
  
  for (int Li_96 = 0; Li_96 < Li_92; Li_96++)
   {
    high_84 = High[iHighest(NULL, 0, MODE_HIGH, BarsCount, Li_96)];
    low_76  = Low [iLowest (NULL, 0, MODE_LOW,  BarsCount, Li_96)];
    
    Ld_16 = (High[Li_96] + Low[Li_96]) / 2.0;
    Ld_28 = 0.66 * ((Ld_16 - low_76) / (high_84 - low_76) - 0.5) + 0.67 * Ld_36;
    Ld_28 = MathMin(MathMax(Ld_28, -0.999), 0.999);
    
    G_ibuf_112[Li_96] = MathLog((Ld_28 + 1.0) / (1 - Ld_28)) / 2.0 + Ld_60 / 2.0;
    
    Ld_36 = Ld_28;
    Ld_60 = G_ibuf_112[Li_96];
   }
  
  bool Li_100 = TRUE;
  
  for (Li_96 = Li_92 - 2; Li_96 >= 0; Li_96--)
   {
    Ld_8 = G_ibuf_112[Li_96 + 1];
    Ld_0 = G_ibuf_112[Li_96 + 2];
    
    if ((Ld_8 < 0.0 && Ld_0 > 0.0) ||
         Ld_8 < 0.0)
     {
      Li_100 = FALSE;
      
      if (Ld_8 < 0.0 && Ld_0 > 0.0)
       {
        Ls_104 = Symbol() + ", TF:" + f0_1(Period());
        Ls_112 = Ls_104 + ", Trend Is Now Down, value: " + Ld_8;
        Ls_120 = Ls_112 + " @ " + TimeToStr(TimeLocal(), TIME_SECONDS);
        
        if (Bars > G_bars_104)
         {
          G_bars_104 = Bars;
          f0_0(Ls_120, Ls_112);
         }
       }
     }
    
    if ((Ld_8 > 0.0 && Ld_0 < 0.0) ||
         Ld_8 > 0.0)
     {
      Li_100 = TRUE;
      
      if (Ld_8 > 0.0 && Ld_0 < 0.0)
       {
        Ls_104 = Symbol() + ", TF:" + f0_1(Period());
        Ls_112 = Ls_104 + ", Trend Is Now Up, value: " + Ld_8;
        Ls_120 = Ls_112 + " @ " + TimeToStr(TimeLocal(), TIME_SECONDS);
        
        if (Bars > G_bars_104)
         {
          G_bars_104 = Bars;
          f0_0(Ls_120, Ls_112);
         }
       }
     }
    
    if (!Li_100)
     {
      G_ibuf_120[Li_96] = Ld_8;
      G_ibuf_116[Li_96] = 0.0;
     }
    else
     {
      G_ibuf_116[Li_96] = Ld_8;
      G_ibuf_120[Li_96] = 0.0;
     }
   }
  
  return(0);
 }

// 3BEBDBF39866D2F719D187268C69411D
void f0_0(string As_0, string As_8)
 {
  if (MsgAlerts)
   Alert(As_0);
  
  if (SoundAlerts)
   PlaySound(SoundAlertFile);
  
  if (eMailAlerts)
   SendMail(As_8, As_0);
 }

// 3F2ED24E00B8A9842F127B337A156D20
string f0_1(int Ai_0)
 {
  switch (Ai_0)
   {
    case 1     : return("M1");
    case 5     : return("M5");
    case 15    : return("M15");
    case 30    : return("M30");
    case 60    : return("H1");
    case 240   : return("H4");
    case 1440  : return("D1");
    case 10080 : return("W1");
    case 43200 : return("MN1");
   }
  
  return(Period());
 }
avatar

  21  tal2000 Автор Сообщений: 59

  • 26 июля 2021, 18:31
+
0
декомпил
avatar

  35  AM2 Сообщений: 16419 - Андрей

  • 26 июля 2021, 20:07
+
0
спасибо за проделанную работу! видимо очень сложный индикатор…
avatar

  21  tal2000 Автор Сообщений: 59

  • 27 июля 2021, 10:20

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