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

От xbms, 13 апреля, 2013 в Уголок Программиста

#5701
24 минуты назад, Александр 1939 сказал:

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

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

#5702

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

Вот написал небольшой простенький советник-сеточник. Скомпилировал, ошибок не выдает. Но при тестировании обратил внимание, что новые дополнительные сделки открываются без изменения коэффициента лота, шага и ТР, как это предусмотрено прописанной логикой. Да и ограничение максимального количества дополнительных сделок не срабатывает. То есть например после открытия стартовой сделки лотом 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);
}
//+------------------------------------------------------------------+

 


 

Изменено 15 сентября, 2019 пользователем Oleg Petrov

#5703

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

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

#5704
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); 

#5705
10 минут назад, Oleg Petrov сказал:

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

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

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

#5706
21 минуту назад, 0ll сказал:

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

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

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

#5707
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 и будут видеть (считать) только по одному ордеру.

 

#5708
34 минуты назад, MikR0ReR сказал:

Ответ:

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

 

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

Изменено 16 сентября, 2019 пользователем Oleg Petrov

#5709

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

 

Tral_ForexGrail_v2.3.mq413 скач. 15AO.mq45 скач.

#5710

Хочу сделать чтобы советник выдавал алерты и отправлял сообщения на телефон, но при соблюдении условий начинает постоянно отправлять сообщения и выдавать алерты, подскажите как сделать чтобы это происходило 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);
           }
       }
}

 

 

Изменено 19 сентября, 2019 пользователем 0ll

#5711

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

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

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

 

#5712
Спойлер

 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;

 

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

#5713
4 часа назад, Partorius сказал:

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

bool one = true;

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

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

#5714
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;

 

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

#5715

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

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

#5716
5 минут назад, 0ll сказал:

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

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

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

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

#5717
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;
     }
  }
//+------------------------------------------------------------------+

 

#5718

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

Я не то чтобы умею в 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 функция в теле советника работает так как-будто видит только 

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

 

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

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

Изменено 20 сентября, 2019 пользователем 0ll

#5719
2 часа назад, 0ll сказал:

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

Сигнал60.png

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

#5720
8 часов назад, Владимир Стариков сказал:

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

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

Изменено 20 сентября, 2019 пользователем usver73

#5721
2 часа назад, 0ll сказал:

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

Сигнал60.png

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

#5722
13 минут назад, usver73 сказал:

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

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

 

 

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

#5723
13 минут назад, Владимир Стариков сказал:

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

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

 

#5724
1 минуту назад, usver73 сказал:

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

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

#5725

ну тогда дебагер- Print ^)

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

Перейти к списку тем
Форум · 2.0.20260627.0025