Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сделал скриншот в MetaTrader? Поделись им с друзьями!
Sasha
15
Sasha 2012.03.18 22:25 

Доброго времени суток Форумчани. Вопрос конечно для профи но я надеюсь и начинающие такие как я, что то почерпнут, ну конечно же с Ваших ответов профи. Суть проста есть индикатор (автор ViDan, vi_dancom@mail.ru данный индикатор скачен с сайта http:// mql4.com). Данный индикатор рисует (отмечает) образование дивергенций на основании данных индикатора Stochastic. В принципе довольно точно. Но у меня нет возможности всё время сидеть возле машины и ждать сигнала, да и психологический фактор (это я про то что эксперту проще войти в рынок). Начну взял код эксперта с книги https://book.mql4.com и частично код с выше описанного индикатора ViDan и с толкнулся с такой проблемой : что эксперт найдя дивергенцию дает один правильный сигнал и продолжает его давать так как выполняется в цикле for(int i = 35; i >= 0; i--) ну, а цикл в функций int start() которая вызывается при каждом тике, при этом открываются очень много ложных ордеров, потом следующая дивергенция и опять один верный сигнал и куча левых. Как сделать что б сигнал давало один раз при нахождение дивергенций?

Заранее всем спасибо.

С кода для экономия место выкинуты не которые функций и перемененные
#define arrowsDisplacement 0.0001
...
extern color  ColorBull = Blue;
extern double Lots       =1;     // Жестко заданное колич. лотов
……
double bullishDivergence[];
//--------------------------------------------------------------- 2 --
….
int start()
  {
   int
   …….
   Ans  =false;                     // Ответ сервера после закрытия
//--------------------------------------------------------------- 3 --
      …..
    
// Торговые критерии

     for(int i = 35; i >= 0; i--)
     {
     CatchBullishDivergence(i);
       if (Sig==4)
       {  ParamB=Sig; 
           continue;
       } 
     }  
  ....
   ……
 int CatchBullishDivergence(int shift)
  {
   if(IsIndicatorTrough(shift) == false)
       return;  
   int currentTrough = shift;
   int lastTrough = GetIndicatorLastTrough(shift);
   
   if(iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,currentTrough) > iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,lastTrough) && 
      Low[currentTrough] < Low[lastTrough])
     {
     //Классическая бычья дивергенция  
          Sig=4;  
 
        DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], 
                              Low[currentTrough], 
                             Low[lastTrough], ColorBull, STYLE_SOLID);
             }
   
   if(iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,currentTrough) < iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,lastTrough) && 
      Low[currentTrough] > Low[lastTrough])
     {
  //Обратная бычья дивергенция
                  Sig=4;  
        
      DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], 
                              Low[currentTrough], 
                              Low[lastTrough], ColorBull, STYLE_DOT);      
       } 
   return (0);       
  }

  // Находим впадину на стахастики                                                                |
//+------------------------------------------------------------------+
bool IsIndicatorTrough(int shift)
  {
   if(iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,shift) <= iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,shift+1) && 
      iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,shift) <  iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,shift+2) && 
      iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,shift) <  iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,shift-1))
       return(true);
   else 
       return(false);
  }
//+------------------------------------------------------------------+

// Находим впадину на стахастики
int GetIndicatorLastTrough(int shift)
  {
   
             for (int j = shift + 5; j < 24; j++)
              {
                if(iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j) <= iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j+1) && 
                   iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j) <  iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j+2) &&
                   iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j) <= iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j-1) && 
                   iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j) <  iStochastic(NULL, 0,5,3,3,MODE_SMA,0,MODE_MAIN,j-2))
                    
                    return(j);
              } 
   
   
    return(-1);
  } 
  
  void DrawPriceTrendLine(datetime x1, datetime x2, double y1, 
                        double y2, color lineColor, double style)
  {
   string label = "Stoch_DivergenceLine.0# " + DoubleToStr(x1, 0);
   labell=label;
   ObjectDelete(label);
   ObjectCreate(label, OBJ_TREND, 0, x1, y1, x2, y2, 0, 0);
   ObjectSet(label, OBJPROP_RAY, 0);
   ObjectSet(label, OBJPROP_COLOR, lineColor);
   ObjectSet(label, OBJPROP_STYLE, style);
   labell2=label;
  }
//+------------------------------------------------------------------+
                

                          
Vadim Zhunko
5221
Vadim Zhunko 2012.03.18 23:44  
Ордеру меджик со временем открытия и проверять его.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий