Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 987

 
mario_SC--:

 

 

 

Я не понимаю что ты хочешь доказать этим кодом. но точно знаю, что в разряд экзаменуемых я не влезу... Так-что если хочешь помощи становись сам в разряд отвечающих на вопросы. Такой цикл влёгкую, при определённых условиях, зацикливается и только случай может уберечь от этого.
 

Почему при отладке индикатора отладчик "падает" (т.к. идет доступ за границы массива), но в то же время на графике все рисуется нормально?

МТ4 билд 950, Альпари демка.

Индикатор во вложении. 

 

//+------------------------------------------------------------------+
//|                                     FX5_MACD_Divergence_V1.1.mq4 |
//|                                                              FX5 |
//|                                                    hazem@uk2.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, FX5"
#property link      "hazem@uk2.net"
//----
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Magenta
#property indicator_color4 Blue
//----
#define arrowsDisplacement 0.0001
//---- input parameters
extern string separator1 = "*** MACD Settings ***";
extern int    fastEMA = 12;
extern int    slowEMA = 26;
extern int    signalSMA = 9;
extern string separator2 = "*** Indicator Settings ***";
extern bool   drawIndicatorTrendLines = true;
extern bool   drawPriceTrendLines = true;
extern bool   displayAlert = true;
//---- buffers
double bullishDivergence[];
double bearishDivergence[];
double macd[];
double signal[];
//----
static datetime lastAlertTime;
static string   indicatorName;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexStyle(2, DRAW_LINE);
   SetIndexStyle(3, DRAW_LINE);
//----   
   SetIndexBuffer(0, bullishDivergence);
   SetIndexBuffer(1, bearishDivergence);
   SetIndexBuffer(2, macd);
   SetIndexBuffer(3, signal);   
//----   
   SetIndexArrow(0, 233);
   SetIndexArrow(1, 234);
//----
   indicatorName = "FX5_MACD_Divergence_v1.1(" + fastEMA + ", " + 
                                 slowEMA + ", " + signalSMA + ")";
   SetIndexDrawBegin(3, signalSMA);
   IndicatorDigits(Digits + 2);
   IndicatorShortName(indicatorName);

   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   for(int i = ObjectsTotal() - 1; i >= 0; i--)
     {
       string label = ObjectName(i);
       if(StringSubstr(label, 0, 19) != "MACD_DivergenceLine")
           continue;
       ObjectDelete(label);   
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int countedBars = IndicatorCounted();
   if(countedBars < 0)
       countedBars = 0;
   CalculateIndicator(countedBars);
//---- 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateIndicator(int countedBars)
  {
   for(int i = Bars - countedBars; i >= 0; i--)
     {
       CalculateMACD(i);
       CatchBullishDivergence(i + 2);
       CatchBearishDivergence(i + 2);
     }              
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateMACD(int i)
  {
   macd[i] = iMACD(NULL, 0, fastEMA, slowEMA, signalSMA, 
                   PRICE_CLOSE, MODE_MAIN, i);
   
   signal[i] = iMACD(NULL, 0, fastEMA, slowEMA, signalSMA, 
                     PRICE_CLOSE, MODE_SIGNAL, i);         
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBullishDivergence(int shift)
  {
   if(IsIndicatorTrough(shift) == false)
       return;  
   int currentTrough = shift;
   int lastTrough = GetIndicatorLastTrough(shift);
//----   
   if(macd[currentTrough] > macd[lastTrough] && 
      Low[currentTrough] < Low[lastTrough])
     {
       bullishDivergence[currentTrough] = macd[currentTrough] - 
                                          arrowsDisplacement;
       //----
       if(drawPriceTrendLines == true)
           DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], 
                              Low[currentTrough], 
                             Low[lastTrough], Green, STYLE_SOLID);
       //----
       if(drawIndicatorTrendLines == true)
          DrawIndicatorTrendLine(Time[currentTrough], 
                                 Time[lastTrough], 
                                 macd[currentTrough],
                                 macd[lastTrough], 
                                 Green, STYLE_SOLID);
       //----
       if(displayAlert == true)
          DisplayAlert("Classical bullish divergence on: ", 
                        currentTrough);  
     }
//----   
   if(macd[currentTrough] < macd[lastTrough] && 
      Low[currentTrough] > Low[lastTrough])
     {
       bullishDivergence[currentTrough] = macd[currentTrough] - 
                                          arrowsDisplacement;
       //----
       if(drawPriceTrendLines == true)
           DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], 
                              Low[currentTrough], 
                              Low[lastTrough], Green, STYLE_DOT);
       //----
       if(drawIndicatorTrendLines == true)                            
           DrawIndicatorTrendLine(Time[currentTrough], 
                                  Time[lastTrough], 
                                  macd[currentTrough],
                                  macd[lastTrough], 
                                  Green, STYLE_DOT);
       //----
       if(displayAlert == true)
           DisplayAlert("Reverse bullish divergence on: ", 
                        currentTrough);   
     }      
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBearishDivergence(int shift)
  {
   if(IsIndicatorPeak(shift) == false)
       return;
   int currentPeak = shift;
   int lastPeak = GetIndicatorLastPeak(shift);
//----   
   if(macd[currentPeak] < macd[lastPeak] && 
      High[currentPeak] > High[lastPeak])
     {
       bearishDivergence[currentPeak] = macd[currentPeak] + 
                                        arrowsDisplacement;
      
       if(drawPriceTrendLines == true)
           DrawPriceTrendLine(Time[currentPeak], Time[lastPeak], 
                              High[currentPeak], 
                              High[lastPeak], Red, STYLE_SOLID);
                            
       if(drawIndicatorTrendLines == true)
           DrawIndicatorTrendLine(Time[currentPeak], Time[lastPeak], 
                                  macd[currentPeak],
                                  macd[lastPeak], Red, STYLE_SOLID);

       if(displayAlert == true)
           DisplayAlert("Classical bearish divergence on: ", 
                        currentPeak);  
     }
   if(macd[currentPeak] > macd[lastPeak] && 
      High[currentPeak] < High[lastPeak])
     {
       bearishDivergence[currentPeak] = macd[currentPeak] + 
                                        arrowsDisplacement;
       //----
       if(drawPriceTrendLines == true)
           DrawPriceTrendLine(Time[currentPeak], Time[lastPeak], 
                              High[currentPeak], 
                              High[lastPeak], Red, STYLE_DOT);
       //----
       if(drawIndicatorTrendLines == true)
           DrawIndicatorTrendLine(Time[currentPeak], Time[lastPeak], 
                                  macd[currentPeak],
                                  macd[lastPeak], Red, STYLE_DOT);
       //----
       if(displayAlert == true)
           DisplayAlert("Reverse bearish divergence on: ", 
                        currentPeak);   
     }   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorPeak(int shift)
  {
   if(macd[shift] >= macd[shift+1] && macd[shift] > macd[shift+2] && 
      macd[shift] > macd[shift-1])
       return(true);
   else 
       return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorTrough(int shift)
  {
   if(macd[shift] <= macd[shift+1] && macd[shift] < macd[shift+2] && 
      macd[shift] < macd[shift-1])
       return(true);
   else 
       return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastPeak(int shift)
  {
   for(int i = shift + 5; i < Bars; i++)
     {
       if(signal[i] >= signal[i+1] && signal[i] >= signal[i+2] &&
          signal[i] >= signal[i-1] && signal[i] >= signal[i-2])
         {
           for(int j = i; j < Bars; j++)
             {
               if(macd[j] >= macd[j+1] && macd[j] > macd[j+2] &&
                  macd[j] >= macd[j-1] && macd[j] > macd[j-2])
                   return(j);
             }
         }
     }
   return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastTrough(int shift)
  {
    for(int i = shift + 5; i < Bars; i++)
      {
        if(signal[i] <= signal[i+1] && signal[i] <= signal[i+2] &&
           signal[i] <= signal[i-1] && signal[i] <= signal[i-2])
          {
            for (int j = i; j < Bars; j++)
              {
                if(macd[j] <= macd[j+1] && macd[j] < macd[j+2] &&
                   macd[j] <= macd[j-1] && macd[j] < macd[j-2])
                    return(j);
              }
          }
      }
    return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DisplayAlert(string message, int shift)
  {
   if(shift <= 2 && Time[shift] != lastAlertTime)
     {
       lastAlertTime = Time[shift];
       Alert(message, Symbol(), " , ", Period(), " minutes chart");
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawPriceTrendLine(datetime x1, datetime x2, double y1, 
                        double y2, color lineColor, double style)
  {
   string label = "MACD_DivergenceLine_v1.0# " + DoubleToStr(x1, 0);
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawIndicatorTrendLine(datetime x1, datetime x2, double y1, 
                            double y2, color lineColor, double style)
  {
   int indicatorWindow = WindowFind(indicatorName);
   if(indicatorWindow < 0)
       return;
   string label = "MACD_DivergenceLine_v1.0$# " + DoubleToStr(x1, 0);
   ObjectDelete(label);
   ObjectCreate(label, OBJ_TREND, indicatorWindow, x1, y1, x2, y2, 
                0, 0);
   ObjectSet(label, OBJPROP_RAY, 0);
   ObjectSet(label, OBJPROP_COLOR, lineColor);
   ObjectSet(label, OBJPROP_STYLE, style);
  }
//+------------------------------------------------------------------+
 
r772ra:
 
В вашем вопросе о поиске наибольшего курса в остатке дня после бычьей свечи почему-то не прозвучала часть, связанная с часовым поясом серверного времени. Задача жестко привязана к границе суток, а в разных компаниях эти границы отличаются.  Принадлежность свечей дням разная. В зависимости от часового пояса сервера найденные наивысшие значения будут относиться к разным дням, причем непериодически. Это для Вашего случая нормально?
 
Всем привет!

Не новичок, но есть "глупый" вопрос, т.к. практически не сталкивался с такой ситуацией.

Допустим, есть уже установленный отложенный ордер.
По индикатору двигаем его цену.
В один прекрасный момент ордер не может быть модифицирован, т.к. новая расчетная цена для него попала в запретный диапазон из-за стоплевелов, типа Ask/Bid +/- MarketInfo(Symbol(), MODE_STOPLEVEL / MODE_FREEZELEVEL) .

Но ордер непременно нужно открыть, уже "по рынку".

Что в этом случае можно сделать?

Удалить отложенный и открыть по рынку новый?

Или можно как-то отложенник превратить в открытый?
 
mt4trade:
Всем привет!

Не новичок, но есть "глупый" вопрос, т.к. практически не сталкивался с такой ситуацией.

Допустим, есть уже установленный отложенный ордер.
По индикатору двигаем его цену.
В один прекрасный момент ордер не может быть модифицирован, т.к. новая расчетная цена для него попала в запретный диапазон из-за стоплевелов, типа Ask/Bid +/- MarketInfo(Symbol(), MODE_STOPLEVEL / MODE_FREEZELEVEL) .

Но ордер непременно нужно открыть, уже "по рынку".

Что в этом случае можно сделать?

Удалить отложенный и открыть по рынку новый?

Или можно как-то отложенник превратить в открытый?
Если в такой близости от цены, то цена сама найдёт его, а нет, то может, к лучшему, если стоповый! А лимитный, то терпение. Пробуйте экспериментировать в тестере, и оптимизация определит оптимальный вариант! Удачи!
 

Прошу помощи.

При установке советника на автономный график,советник не работает,так как в не не запускается функция start().

Как можно реализовать обновление графика из того эксперта который его строит,либо из эксперта который вешается на этот график? 

 
borilunad:
Если в такой близости от цены, то цена сама найдёт его, а нет, то может, к лучшему, если стоповый! А лимитный, то терпение. Пробуйте экспериментировать в тестере, и оптимизация определит оптимальный вариант! Удачи!
Спасибо! Это все так и понятно. Но мне нужен ответ на вопрос - если обязательно нужно чтобы ордер сработал, вне зависимости, куда теперь пойдет цена, то что делать? Удалять отложенник и открывать обычный или есть еще какие-то варианты?
 
mt4trade:
Спасибо! Это все так и понятно.Но мне нужен ответ на вопрос - если обязательно нужно чтобы ордер сработал, вне зависимости, куда теперь пойдет цена, то что делать? Удалять отложенник и открывать обычный или есть еще какие-то варианты?
По мне, если Вы следуете своей стратегии, то и следуйте! Менять её на пол-пути не рекомендую, иначе без определённых результатов (позитивных или отрицательных), не сможете быть уверенным в рациональности Вашей стратегии. Вот так!
 
borilunad:
По мне, если Вы следуете своей стратегии, то и следуйте! Менять её на пол-пути не рекомендую, иначе без определённых результатов (позитивных или отрицательных), не сможете быть уверенным в рациональности Вашей стратегии. Вот так!
И вновь спасибо! Вы говорите правильные, но не относящиеся к вопросу вещи. :) Еще раз повторю: Если расчетная цена отложенника попала в запретный диапазон и он не может быть модифицирован, но обязательно должен (согласно стратегии) сработать на расчетной цене - как "превратить" его в сработавший? Удалить и открыть как обычный? Или есть другие варианты? Просьба ответить именно на этот вопрос.
 
mt4trade:
И вновь спасибо! Вы говорите правильные, но не относящиеся к вопросу вещи. :) Еще раз повторю: Если расчетная цена отложенника попала в запретный диапазон и он не может быть модифицирован, но обязательно должен (согласно стратегии) сработать на расчетной цене - как "превратить" его в сработавший? Удалить и открыть как обычный? Или есть другие варианты? Просьба ответить именно на этот вопрос.
Есть непоследовательность в данном подходе. Если ожидается открытие позиции уже в зоне заморозки (невозможности модифицикации) от отложенного ордера, то следовало бы изначально откладывать ордер при другой цене, на границе данной заморозки. Именно по этой причине ваш подход всё-таки многими тут неприемлен.

Если конкретно по вашему вопросу. Сначала удалите отложенник, а потом сразу открывайте позицию по текущей цене. Проблема в том, что во время этих действий цена может выйти из зоны заморозки (в худшую сторону) и позиция откроется не по той цене, что надо. Другой вариант - не делать отложенник, а в програме в переменной записать значение для открытия позиции. Сравнивать её с текущей ценой и если условие сработало (с учётом зоны заморозки) открываете позицию.