0
С алертами разобрался, а вот с отрисовкой уровней туговато, не могу понять как это лучше сделать, не нашел подходящего примера в десятках индикаторах, или я еще не готов для таких манипуляций!?...*pardon* *help* 
avatar

Andrju81

  • 4 мая 2015, 18:48
0
Спасибо! Я уже просмотрел данную статью и взял на заметку…
avatar

Andrju81

  • 4 мая 2015, 14:30
0
Благодарю за содержательную и полезную статью. Функция хорошая и довольно простая, для новичков самое то!!!
avatar

Andrju81

  • 4 мая 2015, 14:25
0
Я тут немного поправил и исправил кое-какие ошибки кода, но не могу разделить отображение гистограммы и линий(уровней) на разное количество баров, и перерисовку уровней при изменении этого количества, т.е. если уровни нарисованы допустим на 500 барах, то при изменении на 100 остаются лишние от 400!?..

#property copyright ""
#property link      ""
#property strict

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Gold
#property indicator_color4 Lime
#property indicator_color5 Green
#property indicator_color6 Magenta
#property indicator_color7 Brown

#property indicator_width1 3
#property indicator_width2 2
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 3
#property indicator_width6 2


extern int     NumberOfBars      = 500;
extern string  Note              = "0 means Display all bars";
extern int     MAPeriod          = 100;
extern int     LookBack          = 20;
extern string  _1_LineLevels     = "Настройки отображения уровней";
extern int     MaxOfBars         = 100;        // Максимум баров для отрисовки
extern int     MinCandleBody     = 21;         // Минимальная величина тела свечи
extern color   BullLineColore    = Blue;       // Цвет линий красного столбика
extern color   BearLineColore    = Red;        // Цвет линий зеленого столбика


double red[],blue[],yellow[],green[],white[],magenta[],v4[];
bool mail,push;
int send=0;
double mincandle=MinCandleBody*MarketInfo(Symbol(),MODE_POINT);
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) 
{
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
} 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexBuffer(0,red);
      SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexLabel(0,"Climax High ");
      
      SetIndexBuffer(1,blue);
      SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexLabel(1,"Neutral");
      
      SetIndexBuffer(2,yellow);
      SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexLabel(2,"Low ");
      
      SetIndexBuffer(3,green);
      SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexLabel(3,"HighChurn ");
      
      SetIndexBuffer(4,white);
      SetIndexStyle(4,DRAW_HISTOGRAM);
      SetIndexLabel(4,"Climax Low ");
      
      SetIndexBuffer(5,magenta);
      SetIndexStyle(5,DRAW_HISTOGRAM);
      SetIndexLabel(5,"ClimaxChurn ");
      
      SetIndexBuffer(6,v4);
      SetIndexStyle(6,DRAW_LINE,0,2);
      SetIndexLabel(6,"Average("+IntegerToString(MAPeriod)+")");
      
      IndicatorShortName("Better Volume 1.4" );
      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  
   double VolLowest,Range,Value2,Value3,HiValue2,HiValue3,LoValue3,tempv2,tempv3,tempv;
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   if ( NumberOfBars == 0 ) 
      NumberOfBars = Bars-counted_bars;
   limit=NumberOfBars; //Bars-counted_bars;
   
      
   for(int i=0; i<limit; i++)   
      {
         red[i] = 0; blue[i] =(double) Volume[i]; yellow[i] = 0; green[i] = 0; white[i] = 0; magenta[i] = 0;
         Value2=0;Value3=0;HiValue2=0;HiValue3=0;LoValue3=99999999;tempv2=0;tempv3=0;tempv=0;
         
         // -- определяем самый низкий объем за 20 свечек и рисуем столбик
         VolLowest =(double) Volume[iLowest(NULL,0,MODE_VOLUME,20,i)];
         if (Volume[i] == VolLowest)
            {
               yellow[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
            }
         // -- определяем волатильность      
         Range = (High[i]-Low[i]);
         Value2 = Volume[i]*Range;
         
         if (  Range != 0 )
            Value3 = Volume[i]/Range;
            
         
         for ( int n=i;n<i+MAPeriod;n++ )
            {
               tempv= Volume[n] + tempv; 
            } 
          v4[i] = NormalizeDouble(tempv/MAPeriod,0);
         
          
          for (int n=i;n<i+LookBack;n++)
            {
               tempv2 = Volume[n]*((High[n]-Low[n])); 
               if ( tempv2 >= HiValue2 )
                  HiValue2 = tempv2;
                    
               if ( Volume[n]*((High[n]-Low[n])) != 0 )
                  {           
                     tempv3 = Volume[n] / ((High[n]-Low[n]));
                     if ( tempv3 > HiValue3 ) 
                        HiValue3 = tempv3; 
                     if ( tempv3 < LoValue3 )
                        LoValue3 = tempv3;
                  } 
            }
                                      
          if ( Value2 == HiValue2  && Close[i] > (High[i] + Low[i]) / 2 )
            {
               red[i] = NormalizeDouble(Volume[i],0);
               
             //  Alert("Столбик красный!");
             //  push=SendNotification("Столбик красный!");
             //  mail=SendMail("Сообщение из терминала MetaTrader 4 ", "Столбик красный!");
             //  Sleep(1000);
             //  send++; 
                                              
               blue[i]=0;
               yellow[i]=0;
            }   
            
          if ( Value3 == HiValue3 )
            {
               green[i] = NormalizeDouble(Volume[i],0);
               blue[i] =0;
               yellow[i]=0;
               red[i]=0;
            }
          if ( Value2 == HiValue2 && Value3 == HiValue3 )
            {
               magenta[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
         if ( Value2 == HiValue2  && Close[i] <= (High[i] + Low[i]) / 2 )
            {
               white[i] = NormalizeDouble(Volume[i],0);
               
             //  Alert("Столбик зеленый!");
             //  push=SendNotification("Столбик зеленый!");
             //  mail=SendMail("Сообщение из терминала MetaTrader 4 ", "Столбик зеленый!");
             //  Sleep(1000);
             //  send++; 
                                           
               magenta[i]=0;
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
//------------------------------Отрисовка уровней-----------------------------//

         if(red[i]!=0 && Open[i]<Close[i] && (Close[i]-Open[i])>mincandle)
          {
           //ObjectsDeleteAll(); 
           SetHLine(BullLineColore,"RedOpen "+TimeToString(Time[i],TIME_DATE),Open[i],0,1);
           SetHLine(BullLineColore,"RedClose "+TimeToString(Time[i],TIME_DATE),Close[i],0,1);            
          }  
          
         if(white[i]!=0 && Open[i]>Close[i] && (Open[i]-Close[i])>mincandle)
          {
           //ObjectsDeleteAll(); 
           SetHLine(BearLineColore,"GreenOpen "+TimeToString(Time[i],TIME_DATE),Open[i],0,1);
           SetHLine(BearLineColore,"GreenClose "+TimeToString(Time[i],TIME_DATE),Close[i],0,1);            
          }            
      }         


   return(0);
  }
//+------------------------------------------------------------------+
         
avatar

Andrju81

  • 3 мая 2015, 21:01
0
Что касается написания простых советников, так это для меня особых трудностей не составляет, т.к. просто добавляю условие на открытие позиций в шаблон(заготовку), но с алертами и графическими объектами у меня не получается работать, еще на понял по какому принципу их вставлять в код индикатора или советника, и как это сделать, чтобы сигналы(алерты) не выдавались бесконечно. Я же самоучка, компьютер освоил только года три четыре назад, каждый раз нахожу что-то новое для себя.
Буду пробовать своими силами, тем более пример Вы мне уже показали!?.. Но еще вопрос — как ограничить число повторений сигналов(сообщений) и сделать так, чтобы они выдавались только при закрытии бара(свечи), а не из истории…
avatar

Andrju81

  • 3 мая 2015, 17:04
0
Проверил модификацию индикатора::
1. Для отрисовки линии по зеленому столбику нужно брать данные из массива white[i] — там изначально стоял белый цвет столбика, но я для себя изменил на зеленый, т.к. на светлой теме этого столбика не было видно.
2. С сообщениями пока не все гладко — как только присоединяешь индикатор к графику, он отправляет сразу 40 сообщений на email, а потом продолжает отправлять с энной периодичностью. Тоже и с алертами — выдает сообщения из истории, а надо только при появлении этих столбиков и на закрытом баре(свече).
3. На некоторых сигнальных барах(свечах) не рисует линии!!!
А в общем — Вы меня правильно поняли, только желательно вынести настройки алертов и отрисовки уровней отдельно от настроек индикатора.
Что-нибудь типа такого:
<code>extern string _1_LineLevels    = "Настройки отображения уровней"
extern int    MaxOfBars        = 100;        // Максимум баров для отрисовки
extern int    MinCandleBody    = 21;         // Минимальная величина тела свечи
extern color BullLineColore    = Blue;       // Цвет линий красного столбика
extern color BearLineColore    = Red;        // Цвет линий зеленого столбика
extern string _P_WhereOutput   = "---------- Куда выводить";
extern bool   UseAlert         = True;       // Использовать диалоговое окно
extern bool   UseComment       = False;      // Выводить комментарий
extern bool   UsePrint         = False;      // Записывать в журнал
extern bool   UseSendMail      = False;      // Посылать электронное письмо
extern bool   UseSendPush      = False;      // Посылать Push-уведомление на                  мобильные терминалы
extern bool   UseSound         = True;       // Использовать звук
extern string sotFileName      = "news.wav"; // Наименование звукового файла
extern int    AlertInterval    = 60;         // Интервал подачи сигнала</code>

Все алерты(сигналы) должны быть только после сформировавшегося бара(свечи).
Надеюсь, я не слишком напрягаю, сам пока только начинаю изучать язык программирования mql4, но как-то сложновато дается, хотя в коде, если что-то надо подстроить под себя, дабы каждый раз не настраивать индикатор или советник, могу поправить. Есть свои заготовки для проверки той или иной стратегии с помощью советника.
avatar

Andrju81

  • 3 мая 2015, 15:32
0
Можно уточнить, что именно начнете — алерты или модификацию с отрисовкой уровней?!.. Хотя, на Ваше усмотрение, если сложно с уровнями, то буду продолжать вручную устанавливать, только для семи пар не всегда успеваю, на малых таймфреймах, уловить сигналы, а соответственно — потеря енного количества пунктов, приходиться пропускать основное движение и снимать остатки на откатах, т.к. торгую внутри дня, это(Forex) сейчас для меня основная работа…
avatar

Andrju81

  • 2 мая 2015, 22:10
0
Всем огромное СПАСИБО за помощь и беспокойство! Разобрался с индикатором GUBreakout, оказалось то что нужно!
avatar

Andrju81

  • 23 февраля 2015, 15:49
0
Найти сложновато!?.. Предложенный выше индикатор не совсем то, но похожий, в нем бы убрать уровни открытия(выставления отложек), а на максимумы и минимумы сделать тоже самое как для уровней открытия(выставления отложек), надеюсь Вы меня поняли, было бы самое то!?..
avatar

Andrju81

  • 23 февраля 2015, 15:31
0
Спасибо, но не совсем то!?.. Мне нужно только две линии(максимум и минимум), чтобы не нагромождать график лишним. А с открытым кодом этот индикатор есть?
avatar

Andrju81

  • 23 февраля 2015, 13:15
0
А поточнее можно, куда именно коммент прописывать в индикаторе, к примеру в этом:
#property link "http://www.forex-instruments.info"
//+------------------------------------------------------------------+
//|                                                     ASCtrend.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DeepSkyBlue

extern int RISK = 3;
extern int AllBars = 250;
int up = 0, dn = 0;
double val1buffer[];
double val2buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexStyle(0,DRAW_ARROW,EMPTY,2,clrYellow);
      SetIndexArrow(0,108);
      SetIndexBuffer(0, val1buffer);

      SetIndexStyle(1,DRAW_ARROW,EMPTY,2,clrDeepSkyBlue);
      SetIndexArrow(1,108);
      SetIndexBuffer(1, val2buffer);
      return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
// int    counted_bars=IndicatorCounted();

int start()
{   
   
   double value2;
   double value3;
   double value10 = 10;
   double value11;
   double x1 = 70;
   double x2 = 30;
   int TrueCount;
   int counter;
   int MRO1;
   int MRO2;
   int i1;
   double Range;
   double AvgRange;
   double val1;
   double val2;
   double Table_value2[500][2];
   int counted_bars = IndicatorCounted();
   
   value10 = 3 + RISK * 2;
   x1 = 67 + RISK;
   x2 = 33 - RISK;
   value11 = value10;
  //---------------------------- 
    
   if(counted_bars < 0) return (-1);
   if(counted_bars > 0) counted_bars--;       //last bar recounted
   int i;
   int shift = Bars - counted_bars -1;
   if (shift > AllBars) shift = AllBars;
         
   if (shift < AllBars) shift = AllBars;
         
  for(i = shift; i > 0; i--)
   {
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i; counter <= i + 9; counter++)
         {
          AvgRange = AvgRange + MathAbs( High[counter] - Low[counter] );
         }
      Range = AvgRange /10;
      
      
      counter = i;
      TrueCount = 0;
      while ( counter < i+9 && TrueCount < 1 )
         {
          if (MathAbs(Open[counter] - Close[counter + 1]) >= Range*2.0 )
          TrueCount++;
          counter++;
         }

      if (TrueCount >= 1) 
            MRO1 = counter ; 
      else 
            MRO1 = -1;
            
      counter = i;
      TrueCount = 0;
      while (counter<i+6 && TrueCount<1)
         {
          if (MathAbs(Close[counter + 3] - Close[counter]) >= Range*4.6)
             {
              TrueCount++;
             }
             counter++;
         }
      
      if(TrueCount >= 1) 
            MRO2 = counter; 
      else 
            MRO2 = -1;
            
      if (MRO1 > -1) 
            value11 = 3; 
      else 
            value11 = value10;
            
      if (MRO2 > -1) 
            value11 = 4; 
      else 
           value11 = value10;
          
            
      value2 = 100 - MathAbs(iWPR(NULL,0,value11,i));
      Table_value2[i][0] = i;
      Table_value2[i][1] = value2;
      val1 = 0;
      val2 = 0;
      value3 = 0;
      //-------------------     val1  
      if (value2<x2 )  //  x2 = 30
         {
          i1=1;
          while (Table_value2[i+i1][1]>=x2 && Table_value2[i+i1][1]<=x1)
            {
             i1++;
            }

          if (Table_value2[i+i1][1]>x1)
            {
             value3=High[i]+Range*0.5;
             val1=value3;
            }
         }
      
      //-------------------     val2  
      if ( value2 > x1) // x1 = 70 
         {  
          i1 = 1;
          while ( Table_value2[i+i1][1] >= x2 && Table_value2[i+i1][1] <= x1)
            {
             i1++;
            }
            
          if (Table_value2[i+i1][1] < x2)
            {
             value3 = Low[i] - Range * 0.5;
             val2 = value3;
            } 
         }
      
      
       
     
      if (val2!= 0 && up == 0 )
         {     
          val1buffer[i] = val2 - 1 * Point;
          up=1;
          dn=0;
          if(shift <= 2)
            {
             Alert ( Symbol(), " ", Period(), "M  Asctrend BUY ",Ask);
            }
         }  
         
      if (val1 !=0 && dn == 0)
         {
          val2buffer [i] = val1 + 1 * Point;
          dn = 1;
          up = 0;
          if(shift <= 2)
            {
             Alert (Symbol(), " ", Period(), "M   Asctrend SELL ",Bid);
            }
         }
   
    }
return (0);

}
avatar

Andrju81

  • 21 января 2015, 23:01
0
AM2, можно узнать, как Вы вывели значения индикатора до и во время сигнала в окно терминала?!..
avatar

Andrju81

  • 21 января 2015, 16:25
0
Индикатор вылечили, при этом скорость тестирования в разы уменьшилась, но это не столь важно!?.. Есть еще один вопрос!?.. Как лучше сделать возвращаемый TakeProfit (безубыток) после того, как время отложенного ордера истекло?!.. В моем советнике, то срабатывает, то не срабатывает!?.. Вот часть кода который я ставлю в самом конце анализа:
<code>//--------------------------------------------------- Обработка изменения баланса
   if(CurrentAccountBalance!=AccountBalance())
      {
       CurrentAccountBalance=AccountBalance();

       if((BuyOrdersTotal()!=0 && BuyStopOrdersTotal()!=1) || (BuyOrdersTotal()!=1 && BuyStopOrdersTotal()!=0))
         {
          tp=BuyOrderLossLess()+TPLossLess*MarketInfo(EASymbol,MODE_POINT);//TakeProfit равен безубыток плюс желаемое количество пунктов
          SetBuyOrderTakeProfit(tp);
         }

       if((SellOrdersTotal()!=0 && SellStopOrdersTotal()!=1) || (SellOrdersTotal()!=1 && SellStopOrdersTotal()!=0))
         {
          tp=SellOrderLossLess()-TPLossLess*MarketInfo(EASymbol,MODE_POINT);//TakeProfit равен безубыток плюс желаемое количество пунктов
          SetSellOrderTakeProfit(tp);
         }
      }</code>

Поправьте, если я где-то или как-то ошибаюсь!?..
avatar

Andrju81

  • 20 января 2015, 15:25
0
С этим я согласен! Но с таким риском, много ложных сигналов, самый оптимальный RISK 3. В ручную замечательно получается, но приходиться обновлять свойства индикатора самому, чтобы не пропустить сигналы!?..
avatar

Andrju81

  • 19 января 2015, 22:09
0
Спасибо, но этот не подходит, так как перерисовывается!?.. А мой никак полечить нельзя?!..
avatar

Andrju81

  • 19 января 2015, 21:36
0
Спасибо за функцию! Все подходит! Но тут возникла другая проблема, а именно с самим индикатором ASCtrend, в журнале алерты выдаются чаще, чем на графике, и советник получается обрабатывает только половину сигналов, а то и меньше!?.. За 2014 на 15 минутном графике EURUSD, только 15 сделок (хотя сигналов на вход значительно больше было), просадка 30%, прибыль 200%!?.. Можете глянуть сам индикатор?!.. Может что-то там подправить нужно, чтобы все сигналы отображались?!.. В терминале обновляю настройки вручную, появляются недостающие сигналы!?..
avatar

Andrju81

  • 19 января 2015, 20:11
0
Спасибо за совет, но фракталы на мой взгляд подходят лучше, тем более основой стратегии являются фракталы, а индикатор ASCtrend выступает как фильтр.
avatar

Andrju81

  • 17 января 2015, 22:54
0
Дело в том, что значение price надо сделать равным значению ближайшего Fractal UP!?.. Я пробовал искать, но почему-то условие не выполняется!?..
Вот часть кода советника, отвечающая за открытие и модификацию ордеров на покупку с комментариями:

//--------------------------------------------------------------------- Для покупки
       double ASCBuy=iCustom(Symbol(),0,"ASCtrend",1,1);
       f_up=iFractals(EASymbol,EATimeFrame,MODE_UPPER,3);
       if(f_up>0 && ASCBuy<2)                                                          //---Если открылся фрактал
         {
          if(BuyOrdersTotal()>0 || BuyStopOrdersTotal()>0)                 //---Если есть открытые/отложенные орера на покупку
            {
             for(i=0;i<OrdersTotal();i++)                                  //---Обрабатываем все открытые/отложенные ордера на покупку
               {
                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic)               //---Выбираем ордер
                  {
                   if(OrderType()==OP_BUY && BuyStopOrdersTotal()==0 && BuyOrdersTotal()<=MaxOpenOrders-1)      //---Если ордер открыт и нет отложек
                     {
                      if(LastBuyOrderOpenPrice()>(f_up+OrderDistance*MarketInfo(EASymbol,MODE_POINT)))  //---Проверяем расстояние от цены последнего ордера до фрактала
                        {
                         if(MarketInfo(EASymbol,MODE_ASK)<(f_up-PriceDistance*MarketInfo(EASymbol,MODE_POINT)))                   //---Проверяем расстояние от цены до фрактала
                           {
                            if(Martin) lot=NormalizeDouble(LastBuyOrderLot()*MP,2); 
                            else if(MM>0) lot=MMLot(); else lot=Lot;          //---Рассчитываем lot
                            if(SetBuyStop(f_up,lot,0)) 
                              {
                               tp=BuyOrderLossLess();
                               if(tp==f_up) tp=NormalizeDouble(f_up+TPb*MarketInfo(EASymbol,MODE_POINT),MarketInfo(EASymbol,MODE_DIGITS)); else tp=tp+TPLossLess*MarketInfo(EASymbol,MODE_POINT);
                               SetBuyOrderTakeProfit(tp);
                               break;                 
                              }
                           }
                        }
                     }
                   if(OrderType()==OP_BUYSTOP)                             //---Если отложка не открылась
                     {
                      if(f_up>(MarketInfo(EASymbol,MODE_ASK)+PriceDistance*MarketInfo(EASymbol,MODE_POINT)) && f_up<(OrderOpenPrice()+OrderDistance*MarketInfo(EASymbol,MODE_POINT)))   //---Проверка расстояния от цены до фрактала и между ордерами
                        {
                         if(OrderModify(OrderTicket(),f_up,OrderStopLoss(),0,0))
                           {
                            tp=BuyOrderLossLess();
                            if(tp==f_up) tp=NormalizeDouble(f_up+TPb*MarketInfo(EASymbol,MODE_POINT),MarketInfo(EASymbol,MODE_DIGITS)); else tp=tp+TPLossLess*MarketInfo(EASymbol,MODE_POINT);
                            SetBuyOrderTakeProfit(tp);
                           }
                         else Print("BUYSTOP OrderModify error #",GetLastError());
                        }
                     }
                  }                  
               }
            }
          if(BuyOrdersTotal()==0 && BuyStopOrdersTotal()==0)         //---Если нет открытых/отложенных ордеров
            {
             if(MarketInfo(EASymbol,MODE_ASK)<(f_up-PriceDistance*MarketInfo(EASymbol,MODE_POINT)))
               {
                if(MM>0) lot=MMLot(); else lot=Lot;
                tp=NormalizeDouble(f_up+TPb*MarketInfo(EASymbol,MODE_POINT),MarketInfo(EASymbol,MODE_DIGITS));
                if(SetBuyStop(f_up,lot,0))
                  {
                   SetBuyOrderTakeProfit(tp);
                  }
               }
            }
         }

в этом случае ордера будут выставляться только если появляются сигналы от индикатора ASCtrend и фрактал на третьем баре от текущей цены, а мне надо, чтобы поиск ближайшего фрактала начинался с первого или второго бара, пока не найдется подходящий!?.. Как это лучше сделать?!..
avatar

Andrju81

  • 17 января 2015, 15:25
0
А вот с этим как раз и возникла головная боль, все перепробовал в чем смог разобраться!?.. Новичок-самоучка!!! Поэтому и обращаюсь за помощью, так как не хватает опыта!?..
avatar

Andrju81

  • 17 января 2015, 15:11
0
Уважаемый, АМ2, в моем советнике условие if(f_up>0) это появление нового фрактала MODE_UPPER, т.е. если появился новый фрактал (Fractal UP), то советник, если нет выставленных отложенных ордеров на покупку, выставляет отложенный ордер BuyStop на уровень Fractal UP, если есть выставленный BuyStop, то он просто переставляет его на новое значение Fractal UP.
avatar

Andrju81

  • 17 января 2015, 14:42