тестируем мой второй советник(пока в разроботке)

 

Вообщем идея такая, есть так называемые психологические уровни цены, они практически ни как не связаны с тех или каким либо другим анализом, это круглые числа, так уж устроен человек, что нравятся они ему. Многие даже ставят стоп на них или где то рядом. Мы же будем предполагать, что если уровень пробит мы можем надеяться на какую нибудь прибыль в сторону пробоя.

//+------------------------------------------------------------------+
//|                                                          100.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                          http://wolf002.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://wolf002.narod.ru"
extern double TakeProfit = 20;
extern double TakeLost = 50;
extern double Lots = 0.1;
int k;
double plus, ost;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
              ost=MathMod(Ask,0.01);//получаем остаток от аск 
                                    //последние 0,00_ _
              ost=Ask-ost;//находим нижную границу
              plus=ost+ 0.01;//находим вверхнюю границу 
           
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
int ticket,total;
 
   total=OrdersTotal();
   if(total<1) 
   {
 
       if(OrderSelect(k,SELECT_BY_TICKET,MODE_HISTORY)==true)
//для посленего закрытого тикета находим цену его закрытия
            {
              ost=MathMod(OrderClosePrice( ),0.01);
//все тоже что и в int init()
              ost=OrderClosePrice( )-ost;
              plus=ost+ 0.01;
            
            } 
       if (Ask == plus  )//если аск = верхней границе то покупаем
         {
        
          ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,
                           Ask-TakeLost*Point,Ask+TakeProfit*Point,
                           "My order #1",16384,0,Blue);
         if(ticket>0)
            {
            k=ticket;
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
         }
      if  (Bid ==  ost )//если бид равен нижней границе то продаем
      { 
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TakeLost*Point,
                       Bid-TakeProfit*Point,"My order #1",16384,0,Red);
         if(ticket>0)
           {
                 k=ticket;
                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                  Print("SELL order opened : ",OrderOpenPrice());
           }
            else Print("Error opening SELL order : ",GetLastError()); 
            return(0); 
        }
     return(0);
    }
     
//----
   return(0);
  }
  
//+------------------------------------------------------------------+

В принципе все должно работать, но вот беда у меня почему то , тестирование происходит местами, в определенных интервалах цен.
Т.е как я понимаю бывает лажа , что вот эта бодяга не хочет работать как положено.
ost=MathMod(OrderClosePrice( ),0.01);//все тоже что и в int init()
ost=OrderClosePrice( )-ost;
plus=ost+ 0.01;

Прошу помочь мне с этим разобраться.

 
Непонятно зачем изпользуете 0.01 - кажется это должно быть Point. И все таки это не работает - вам не MathMod нужен, а NormalizeDouble - посмотрите в справку.

Так как вы програмист (сразу видно ;-) ) поясню - в МТ ползуют библиотеку, котороя плохо справляется с округлением. Поэтому рекомендуют везде при торговле использовать NormalizeDouble.

Психологические границы работают более-менее хорошо на петрол и золото (хотя говорю это по слухам). Там действительно есть круглые числа. А по тему порекомендовал бы посмотреть https://www.metatrader5.com/ru/terminal/help/objects/fibo

Успех!
 
Itso:
Так как вы програмист (сразу видно ;-) ) поясню - в МТ ползуют библиотеку, котороя плохо справляется с округлением. Поэтому рекомендуют везде при торговле использовать NormalizeDouble.
Нормализация чисел с плавающей запятой никакого отношения к языкам программирования не имеет. Ни к MQL4, ни к C/C++, ни к Яве и ни к кому другому.

Необходимость нормализации из-за того, что есть жесткие требования по абсолютной точности заявляемых цен и способу представления вещественных чисел. Так как этот вопрос уже неоднократно поднимался, то позволю себе привести ссылку из архива: https://www.mql5.com/ru/forum/48755
Причина обращения: