Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
24 минуты назад, Александр 1939 сказал:

(Курс молодого бойца)не могу получить не приходит письмо для скачивания-как быть??

Получите ссылочку http://tlap.com/wppage/videokurs-mql4-programmirovanie/

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток!

Вот написал небольшой простенький советник-сеточник. Скомпилировал, ошибок не выдает. Но при тестировании обратил внимание, что новые дополнительные сделки открываются без изменения коэффициента лота, шага и ТР, как это предусмотрено прописанной логикой. Да и ограничение максимального количества дополнительных сделок не срабатывает. То есть например после открытия стартовой сделки лотом 0,1 советник должен открыть 3 дополнительные сделки лотом 0,05, потом еще 5 дополнительных сделок лотом 0,02 и тд. А он после стартовой сделки начинает открывать все дополнительные сделки лотом 0,05 и не контролирует их общее количество. Странно. Все проверил, думал функция CountTrades() неправильно считает открытые ордера, но тоже вроде правильно написано.

Подскажите плиз в чем ошибка, Заранее благодарен.

 

Спойлер

 

//+------------------------------------------------------------------+
//|                                                  PRIM v 1.00.mq4 |
//|                                       Copyright 2019, PRIM Corp. |
//|                                             https://www.prim.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, PRIM Corp."
#property link      "https://www.prim.com"
#property version   "1.00"
#property strict

extern double Lot           = 0.1;
extern double K_Lot1        = 0.5;
extern double K_Lot2        = 0.2;
extern double K_Lot3        = 0.1;
extern int    TakeProfit_1  = 3;
extern int    TakeProfit_2  = 4;
extern int    TakeProfit_3  = 5;
extern int    TakeProfit_4  = 7;
extern int    Step1         = 2;
extern int    Step2         = 4;
extern int    Step3         = 6;
extern int    Step4         = 8;
extern int    MaxDopKolen1  = 3;
extern int    MaxDopKolen2  = 5;
extern int    MaxDopKolen3  = 7;
extern int    Magic         = 1111111;
extern int    MAPeriod      = 20;

int ticket;
double lot, tp, price, lastlot; 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
 if (Digits == 3 || Digits == 5)
   {
     TakeProfit_1 *= 10;
     TakeProfit_2 *= 10;
     TakeProfit_3 *= 10;
     TakeProfit_4 *= 10;
     Step1        *= 10;
     Step2        *= 10;
     Step3        *= 10;
     Step4        *= 10;
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

 double ic = iClose(Symbol(), PERIOD_CURRENT, 1);
 double io = iOpen(Symbol(), PERIOD_CURRENT, 1);
 double ih = iHigh(Symbol(), PERIOD_CURRENT, 1);
 double il = iLow(Symbol(), PERIOD_CURRENT, 1);
 double iM = iMA(Symbol(),PERIOD_CURRENT, MAPeriod,0, MODE_SMA, PRICE_CLOSE, 1);

 if(CountTrades()==0)
 {
  if(Ask<=iM) 
     {
       tp = NormalizeDouble(Ask + TakeProfit_1*Point, Digits);
       ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, 5, 0, tp, "", Magic, 0, Blue);
       SendNotification("Милорд, мы открыли сделку на покупку: " + Symbol()); 
     }
 if(Bid>=iM)
     {
       tp = NormalizeDouble(Bid - TakeProfit_1*Point, Digits);
       ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, 5, 0, tp, "", Magic, 0, Red);
       SendNotification("Милорд, мы открыли сделку на продажу: " + Symbol()); 
     }
 }
 if (CountTrades()>0) 
 {
  if(CountTrades()<= MaxDopKolen1)
  {
   if(BuyCount()>0 && SellCount()==0 && BuyCount()<=MaxDopKolen1)
     {
      price = FindLastOrderPrice(OP_BUY);
       if (Ask <= NormalizeDouble(price - Step1*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot1, Digits);
         tp = NormalizeDouble(Ask + TakeProfit_1*Point, Digits);
         ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue);
         SendNotification("Мы увеличили сделку на покупку: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на покупку");
        }            
     }       
 if (BuyCount()==0 && SellCount()>0 && SellCount()<=MaxDopKolen1) 
     {
      price = FindLastOrderPrice(OP_SELL);
       if (Bid >= NormalizeDouble(price + Step1*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot1, Digits);
         tp = NormalizeDouble(Bid - TakeProfit_1*Point, Digits);
         ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red);
         SendNotification("Мы увеличили сделку на продажу: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на продажу");
        }            
     }
 }         
 if (CountTrades()>MaxDopKolen1 && CountTrades()<= MaxDopKolen2) 
 {
  if(SellCount()==0 && BuyCount()>MaxDopKolen1 && BuyCount()<=MaxDopKolen2)
     {
      price = FindLastOrderPrice(OP_BUY);
       if (Ask <= NormalizeDouble(price - Step2*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot2, Digits);
         tp = NormalizeDouble(Ask + TakeProfit_2*Point, Digits);
         ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue);
         SendNotification("Мы увеличили сделку на покупку: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на покупку");
        }            
     }       
 if (BuyCount()==0 && SellCount()>MaxDopKolen1 && SellCount()<=MaxDopKolen2) 
     {
      price = FindLastOrderPrice(OP_SELL);
       if (Bid >= NormalizeDouble(price + Step2*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot2, Digits);
         tp = NormalizeDouble(Bid - TakeProfit_2*Point, Digits);
         ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red);
         SendNotification("Мы увеличили сделку на продажу: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на продажу");
        }            
     }
 }  
 if (CountTrades()>MaxDopKolen2 && CountTrades()<= MaxDopKolen3) 
 {
  if(SellCount()==0 && BuyCount()>MaxDopKolen2 && BuyCount()<=MaxDopKolen3)
    {
      price = FindLastOrderPrice(OP_BUY);
       if (Ask <= NormalizeDouble(price - Step3*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot3, Digits);
         tp = NormalizeDouble(Ask + TakeProfit_3*Point, Digits);
         ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue);
         SendNotification("Мы увеличили сделку на покупку: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на покупку");
        }            
     }       
 if (BuyCount()==0 && SellCount()>MaxDopKolen2 && SellCount()<=MaxDopKolen3) 
     {
      price = FindLastOrderPrice(OP_SELL);
       if (Bid >= NormalizeDouble(price + Step3*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot3, Digits);
         tp = NormalizeDouble(Bid - TakeProfit_3*Point, Digits);
         ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red);
         SendNotification("Мы увеличили сделку на продажу: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на продажу");
        }            
     }
 }  
 if (CountTrades()>MaxDopKolen3) 
 {
  if(SellCount()==0 && BuyCount()>MaxDopKolen3)
      {
      price = FindLastOrderPrice(OP_BUY);
       if (Ask <= NormalizeDouble(price - Step4*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot3, Digits);
         tp = NormalizeDouble(Ask + TakeProfit_4*Point, Digits);
         ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue);
         SendNotification("Мы увеличили сделку на покупку: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на покупку");
        }            
     }       
 if (BuyCount()==0 && SellCount()>MaxDopKolen3) 
     {
      price = FindLastOrderPrice(OP_SELL);
       if (Bid >= NormalizeDouble(price + Step4*Point, Digits))
        {
         lastlot = NormalizeDouble(Lot*K_Lot3, Digits);
         tp = NormalizeDouble(Bid - TakeProfit_4*Point, Digits);
         ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red);
         SendNotification("Мы увеличили сделку на продажу: " + Symbol());
          if (ticket<1)
             Print("Ошибка открытия ордера на продажу");
        }            
     }
  }
 }      

}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count=0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
      }
   }
   return(count); 
}
//+------------------------------------------------------------------+
int BuyCount()
{
  int count = 0;
  for(int i=OrdersTotal()-1; i>=0; i--)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true &&
       OrderSymbol() == Symbol() &&
       OrderMagicNumber()==Magic &&
       OrderType()==OP_BUY)
    {      
        count++;     
    }
  }
  return(count);
}
//+------------------------------------------------------------------+
int SellCount()
{
  int count = 0;
  for(int i=OrdersTotal()-1; i>=0; i--)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true &&
       OrderSymbol() == Symbol() &&
       OrderMagicNumber()==Magic &&
       OrderType()==OP_SELL)
    {      
        count++;     
    }
  }
 return(count);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   int oldticket;
   double oldopenprice=0;
   ticket=0;
   for (int cnt=OrdersTotal()-1; cnt >=0; cnt--)
   {
       if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
       {
          if (OrderSymbol() == Symbol() && OrderType() == otype)
          {
              oldticket = OrderTicket();
              if (oldticket > ticket)
              {
                  ticket=oldticket;
                  oldopenprice=OrderOpenPrice();
              }
          }
       }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+

 


 

Изменено пользователем Oleg Petrov
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Oleg Petrov После открытия сделки где у Вас SendNotification , вставьте Print("Buy=",BuyCount(),",  Sell=",SellCount() );

После сделаете короткий прогон на пару сеток и смотрите в журнале как логика отработала. Этот приём основной при поиске ошибок.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, 0ll сказал:

@Oleg Petrov После открытия сделки где у Вас SendNotification , вставьте Print("Buy=",BuyCount(),",  Sell=",SellCount() );

После сделаете короткий прогон на пару сеток и смотрите в журнале как логика отработала. Этот приём основной при поиске ошибок.

Oll спасибо за подсказку. Добавил Print по вашей рекомендации. В журнале после каждой дополнительно открытой сделки появляются следующие строки: 

2019.09.16 14:37:20.013    2019.08.05 09:14:26  prim EURUSD,M1: Buy=0,  Sell=1, Count=1
2019.09.16 14:37:15.514    2019.08.05 09:12:14  prim EURUSD,M1: Buy=0,  Sell=1, Count=1
То есть получается все мои функции Count() работают некорректно, не суммируют открытые сделки.

Подскажите плиз что не так в моем коде Count. Цикл вроде стандартный, перебирает все открытые ордера от начала до 0. Почему не суммирует их?

 

int CountTrades()
{
   int count=0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
      }
   }
   return(count); 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
10 минут назад, Oleg Petrov сказал:

Подскажите плиз что не так в моем коде Count. Цикл вроде стандартный, перебирает все открытые ордера от начала до 0.

Получается не только Count но и SellCount() у Вас не считает... 

Думаю для Вас будет полезно самому найти ошибку, Print в руки и вперёд, вставляйте везде, только не в основной цикл, а то заспамите журнал.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
21 минуту назад, 0ll сказал:

Получается не только Count но и SellCount() у Вас не считает... 

Думаю для Вас будет полезно самому найти ошибку, Print в руки и вперёд, вставляйте везде, только не в основной цикл, а то заспамите журнал.

Вы имеете ввиду использовать функцию Print во всех строках функции Count ? Так там же смысловая строка только цикл и есть. А выводимый результат явно не корректен судя по журналу. Не совсем понял какие выходные параметры в советнике мне нужно проверить с помощью Print для поиска ошибки.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
18 часов назад, Oleg Petrov сказал:

Подскажите плиз в чем ошибка

разобрался?

1 минуту назад, Oleg Petrov сказал:

Добрый день!

Нет. Понял что проблема в функциях Count, BuyCount, SellCount но не пойму в чем там ошибка. OrdersTotal добавил в Print. Он правильно тянется. Цикл вроде правильно написан, анализирует по убыванию все открытые ордера.

В общем запутался еще больше. 

1 минуту назад, Oleg Petrov сказал:

Понял что проблема в функциях Count, BuyCount, SellCount но не пойму в чем там ошибка.

Это как красивая девушка на сцене отвлекает от происходящего с иллюзионистом или фокусником.

1 минуту назад, Oleg Petrov сказал:

добавил в Print

Для этого существует отладка, не стоит пренебрегать её.

 

Ответ:

Все гораздо проще! Дело в MagicNumber в OrderSend(). В первом ордере ставите MagicNumber-1111111, а в последующих ордерах 0. Отсюда следует что Count, BuyCount, SellCount считают MagicNumber-1111111, вот поэтому Count, BuyCount, SellCount и будут видеть (считать) только по одному ордеру.

 

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
34 минуты назад, MikR0ReR сказал:

Ответ:

Все гораздо проще! Дело в MagicNumber в OrderSend(). В первом ордере ставите MagicNumber-1111111, а в последующих ордерах 0. Отсюда следует что Count, BuyCount, SellCount считают MagicNumber-1111111, вот поэтому Count, BuyCount, SellCount и будут видеть (считать) только по одному ордеру.

 

Вот спасибо. А то я уж и не знал что еще проверить в Count. Оказалось, что проблема в том, что часть кода скопировал из другого своего советника, где Magic не контролировался. И конечно раз этот нюанс на общую логику советника не влиял, я его и не проверил.

Изменено пользователем Oleg Petrov
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте!!! Нашёл интересный код трейлинг стоп. Помогите пожалуйста Tral_ForexGrail_v2.3 вписать в 15AO. Заранее спасибо !!!

 

Tral_ForexGrail_v2.3.mq4 15AO.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Хочу сделать чтобы советник выдавал алерты и отправлял сообщения на телефон, но при соблюдении условий начинает постоянно отправлять сообщения и выдавать алерты, подскажите как сделать чтобы это происходило 1 раз

Спойлер

if (StopBuy < 10000 && Stochastic < 20)
{
        if (AlertOn==True) 
        {
           Alert(Symbol()," сигнал на покупку");
           if (PushMessagesOn==True) 
           { 
              SendNotification(_Symbol + " сигнал на покупку ");
              Print ("Алерт на мобильник покупка", Stochastic);
           }            
       }
}
        
if (StopSell < 10000 && Stochastic > 80)
{     
       if (AlertOn==True) 
       {
           Alert(Symbol()," сигнал на продажу");
           if (PushMessagesOn==True) 
           {
              SendNotification(_Symbol + " сигнал на продажу");
              Print ("Алерт на мобильник продажа", Stochastic);
           }
       }
}

 

 

Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Partorius введите флаг напр: bool one = true;  , Затем в тексте добавьте проверки и сброс флага:

if (one && StopBuy < 10000 && Stochastic < 20)
{ one = false; и далее по тексту }
else one = true;  // когда нет сигнала - восстанавливаем флаг

Также и с другим условием. Надеюсь сигнал Stochastic не с 0-бара? Можно задать время таймаута, когда сигнал не отправляется.

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Спойлер

 bool one = true;
    
      if (one && StopBuy < 10000 && Stochastic < 20)
        {
         one = false;
         if (AlertOn==True) 
         {
            
            Alert(Symbol()," сигнал на покупку");
              if (PushMessagesOn==True) 
            { 
              SendNotification(_Symbol + " сигнал на покупку");
              Print ("Алерт на мобильник покупка", Stochastic);
            }
           
         }
        } else one = true;
        
      if (one && StopSell < 10000 && Stochastic > 80)
        {
         one = false;
         if (AlertOn==True) 
         {
            
            Alert(Symbol()," сигнал на продажу");
             if (PushMessagesOn==True) 
         {
           SendNotification(_Symbol + " сигнал на продажу");
           Print ("Алерт на мобильник продажа", Stochastic);
         }
            
         }
         
        } else one = true;

 

Почему то все равно постоянно шлет сообщения

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Partorius сказал:

Почему то все равно постоянно шлет сообщения

bool one = true;

нужно объявить на глобальном уровне перед void OnTick()

или добавить   static bool one = true;

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, 0ll сказал:

bool one = true;

нужно объявить на глобальном уровне перед void OnTick()

или добавить   static bool one = true;

Пробовал и на глобальном уровне

Спойлер

//+------------------------------------------------------------------+
//|                                                        Alert.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool  AlertOn         = True; //Алерт
extern bool  PushMessagesOn  = False;// Отправка сигнала на мобильник


bool one = true;

и добавлял

Спойлер

static bool one = true;

 

все равно постоянно шлет сообщения

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Partorius Стохастик с какого бара? и на каком ТФ всё это запускается? Никто весь Ваш код не видит, поэтому сказать не возможно.

Вам понятна суть моего предложения? или надо подробнее описать?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
5 минут назад, 0ll сказал:

@Partorius Стохастик с какого бара? и на каком ТФ всё это запускается? Никто весь Ваш код не видит, поэтому сказать не возможно.

Вам понятна суть моего предложения? или надо подробнее описать?

Стохастик с предыдущего бара, тайм фрейм 1 час, в коде в принципе больше ничего нет, кроме вытягивания данных с индикатора Stochastic и BuyStop и SellStop. 

Если можно то поподробнее распишите, мне кажется что в таком исполнении как сейчас на каждом тике будут обновляться данные в том числе и переменная one будет всегда true т.к мы ей в конце цикла присваиваем true 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
20 минут назад, 0ll сказал:

@Partorius Стохастик с какого бара? и на каком ТФ всё это запускается? Никто весь Ваш код не видит, поэтому сказать не возможно.

Вам понятна суть моего предложения? или надо подробнее описать?

Вот код целиком

 

Спойлер

//+------------------------------------------------------------------+
//|                                                        Alert.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool  AlertOn         = True; //Алерт
extern bool  PushMessagesOn  = False;// Отправка сигнала на мобильник

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
     
     
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    static bool one = true;
    double Stochastic = iCustom (Symbol(), 0, "Drake Delay Stochastic", 5, 3, 1, 0, 1);
    double StopBuy         = iCustom (Symbol(), 0, "BB_Stop_v1", 80, 2, 1, 1, 1, 1000, true, 4, 1);
    double StopSell        = iCustom (Symbol(), 0, "BB_Stop_v1", 80, 2, 1, 1, 1, 1000, true, 5, 1);
    
    
    {
      if (one && StopBuy < 10000 && Stochastic < 20)
        {
         one = false;
         if (AlertOn==True) 
         {
            
            Alert(Symbol()," сигнал на покупку ");
              if (PushMessagesOn==True) 
            { 
              SendNotification(_Symbol + " сигнал на покупку");
              Print ("Алерт на мобильник покупка", Stochastic);
            }
           
         }
        } else one = true;
        
      if (one && StopSell < 10000 && Stochastic > 80)
        {
         one = false;
         if (AlertOn==True) 
         {
            
            Alert(Symbol()," сигнал на продажу");
             if (PushMessagesOn==True) 
         {
           SendNotification(_Symbol + " сигнал на продажу");
           Print ("Алерт на мобильник продажа", Stochastic);
         }
            
         }
         
        } else one = true;
     }
  }
//+------------------------------------------------------------------+

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте!

Я не то чтобы умею в mql4, но 

копипастить могу.

Сделал функцию:

Спойлер

//+---------------------------------------------------------------------------------+
//|Функция для определения тренда (общая)                                         |
//+---------------------------------------------------------------------------------+
int Trend(Filtr filtr_, ENUM_TIMEFRAMES tf, int shift)
{
int res=0;
 if(filtr_==no)
{
 if(Ask<lowerEnv2())
     {
      res=1;
     }
 if(Bid>upperEnv2())
     {
      res=0;
     }
}
if(filtr_==Pik)
{
if(iLow(NULL,tf,shift)<=iLowest(NULL,tf,MODE_LOW,period_env2,shift))
     {
      res=1;
     }
   if(iHigh(NULL,tf,shift)>=iHighest(NULL,tf,MODE_HIGH,period_env2,shift))
     {
      res=0;
     } 
}
         
  if(filtr_==full_color)
     {
        if (iClose(NULL,tf,shift)>iOpen(NULL,tf,shift)&&ha(tf,3,shift)>=ha(tf,2,shift))//белая
     {
     res=1;
     
         }
   
     if (iClose(NULL,tf,shift)<=iOpen(NULL,tf,shift)&&ha(tf,3,shift)<ha(tf,2,shift))//черная
          {
     res=0;
    }
     }
    if(filtr_==HA)
     {
        if (ha(tf,3,shift)>=ha(tf,2,shift))//белая
     {
     res=1;
         }
   
     if (ha(tf,3,shift)<ha(tf,2,shift))//черная
          {
     res=0;
    }
      
     } 
      if(filtr_==JC)
     {
        if (iClose(NULL,tf,shift)>iOpen(NULL,tf,shift))//белая
     {
     res=1;
         }
   
     if (iClose(NULL,tf,shift)<=iOpen(NULL,tf,shift))//черная
          {
     res=0;
    }
     }
 
   return res;
}

 

 

Работает так как и задумывал, кроме участка:

  if(filtr_==full_color)
     {
        if (iClose(NULL,tf,shift)>iOpen(NULL,tf,shift)&&ha(tf,3,shift)>=ha(tf,2,shift))//белая
     {
     res=1;
     
         }
   
     if (iClose(NULL,tf,shift)<=iOpen(NULL,tf,shift)&&ha(tf,3,shift)<ha(tf,2,shift))//черная
          {
     res=0;
    }
     }

Поясню.

Функция возвращает 0 - тренд вниз, 1 - вверх на основании японской свечи или Heiken.

НО!!!! Когда пытаюсь "скрестить" и японскую свечу И Heiken функция в теле советника работает так как-будто видит только 

японскую свечу.

 

Прошу ПОМОЩИ, если кто может, подсказать в чем здесь секрет. Корректно ли написана функция?

Заранее, СПАСИБО!!!

Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, 0ll сказал:

Не знаю, Ваш код у меня работает нормально. Вы изменили название советника?

Сигнал60.png

Заработало, тупанул я надо было на минутный график бросить ))

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
8 часов назад, Владимир Стариков сказал:

Корректно ли написана функция?

код ha покажите....

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, 0ll сказал:

Не знаю, Ваш код у меня работает нормально. Вы изменили название советника?

Сигнал60.png

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
13 минут назад, usver73 сказал:

код ha покажите....

Пожалуйста!)

 

 

double ha(int HA_tf,int mode,int shift)
  {
   double buff=iCustom(NULL,HA_tf,"Heiken Ashi",mode,shift);
   return buff;
  }

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
13 минут назад, Владимир Стариков сказал:

Пожалуйста!)

х.з., может я неправ, но в параметрах индикатора в моем тереме четыре входных параметра, а в Вашем вызове их нет...
Возможно, дефолтные настройки в iCustom можно опускать... я не пробовал...

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 минуту назад, usver73 сказал:

Возможно, дефолтные настройки в iCustom можно опускать... я не пробовал...

Я пробовал - без проблем.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...