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

 

Здравствуйте! Прикрепленный индикатор рисует фракталы. Рисует он их прямо на хай/лоу баров и из-за этого не видно самих хай/лоу. Подскажите, как сделать, чтобы можно было регулировать расстояние между фракталом и баром? Нужно, чтобы фрактал был немного выше/ниже бара.

Если это не сложные действия, возможно не составит труда это сделать прямо в этом индикаторе...

Помогите, пожалуйста!

Файлы:
 
Serhios:

Здравствуйте! Прикрепленный индикатор рисует фракталы. Рисует он их прямо на хай/лоу баров и из-за этого не видно самих хай/лоу. Подскажите, как сделать, чтобы можно было регулировать расстояние между фракталом и баром? Нужно, чтобы фрактал был немного выше/ниже бара.

Если это не сложные действия, возможно не составит труда это сделать прямо в этом индикаторе...

Помогите, пожалуйста!

Очевидно, надо добавить какое-то значение для верхнего фрактала и вычесть такое же значение для нижнего, тогда фракталы будут смещены по вертикали. Подойдёт, например, значение ATR, как в прицепе.
Файлы:
 
evillive:
Очевидно, надо добавить какое-то значение для верхнего фрактала и вычесть такое же значение для нижнего, тогда фракталы будут смещены по вертикали. Подойдёт, например, значение ATR, как в прицепе.

Спасибо. Но, неужели в решении данной задачки нужно задействовать значение другого индикатора. Ведь есть значение бара на котором нарисовался фрактал. Разве нет функции, которая сместит фрактал по вертикали относительно значения хай/лоу бара?
 
Serhios:

Спасибо. Но, неужели в решении данной задачки нужно задействовать значение другого индикатора. Ведь есть значение бара на котором нарисовался фрактал. Разве нет функции, которая сместит фрактал по вертикали относительно значения хай/лоу бара?

Вместо значения индикатора можно взять любое значение в пунктах (целое), помноженное на _Point, будет постоянное смещение на данное кол-во пунктов. С индикатором проще, нет необходимости подбирать расстояние.

Пример для верхнего фрактала:

Ext1[i+center] = cur + 30*_Point;
 
evillive:

Вместо значения индикатора можно взять любое значение в пунктах (целое), помноженное на _Point, будет постоянное смещение на данное кол-во пунктов. С индикатором проще, нет необходимости подбирать расстояние.

Пример для верхнего фрактала:

Лучше масштабировать, иначе значки фракталов будут уползать за границы экрана. Можно так: 

// Определение LastBar по расположению StopLine на графике
bool fNewStopLine(){
   bool New;
   int StopBar, Error;
   double Shift;
   datetime StopLine;
   if( ObjectFind("StopLine")==0 ){                // Есть стоп-линия
      StopLine=ObjectGet("StopLine",OBJPROP_TIME1);// Время стоп-линии
      StopBar=iBarShift(NULL,0,StopLine);          // Бар стоп-линии
      LastBar=StopBar+1;                           // Бар окончания построения
      if( StopBar<=БарОкончания ){                 //    правее или на последнем баре
         LastBar=БарОкончания;                     // Перенести на нулевой бар
         StopBar=LastBar-1;
         StopLine=Time[StopBar];
         if( !ObjectMove("StopLine",0,StopLine,0) ){
            if( !РежимОтладки ) PlaySound("alert.wav");
            Print("***   StopLine - объект не перемещен, ошибка "+GetLastError());
      }  }
      if( StopLine!=OldStopLine ){                 // Новая стоп-линия
         ReInit();                                 // Повторная инициализация
         ClearScreen();                            // Очистить экран
         Shift=0.01*(WindowPriceMax()-WindowPriceMin())*СдвигИндикатораТиков;
         Error=fArrow("TickIndicator","",0,StopBar // Сформировать индикатор тика
                     ,WindowPriceMin()+Shift,0,0,0,0
                     ,ЗнакИндикатораТиков,ЦветИндикатораТиков,РазмерИндикатораТиков);
         OldStopLine=StopLine;                     // Стоп-линия обработана
         New=true;                                 // Выполнить построение заново
      }
      else{                                        // Нет новой стоп-линии
         New=false;                                // Построение заново не выполнять
   }  }
   else{                                           // Нет стоп-линии
      New=false;                                   // Построение заново не выполнять
      Error=fObjectDelete("TickIndicator");        // Удалить индикатор тика
   }
   return(New);
}
а можно просто использовать значки фракталов, не закрывающие экстремумы баров, вот так: 

 

Всё-таки непонятно мне про приоритеты и порядок операций, вот, например,

*
/
%

Умножение
Деление
Деление по модулю

Слева направо


Чему будет равно выражение а=б/с*с, а=б или же а=б/с^2?

 
evillive:


Чему будет равно выражение а=б/с*с, а=б или же а=б/с^2?

Проверил скриптом:

   double a;
   double b=10.0;
   double c=4.0; 
   a=b/c*c;
   Print("a=",a);

 Принт в журнале: a=10.0

PS: а если сделать так:  a=c*c/b;  то принт будет а=1.6

 
tuner:

Проверил скриптом:

 Принт в журнале: a=10.0

PS: а если сделать так:  a=c*c/b;  то принт будет а=1.6

Ну так-то да, я сам так проверял, но в справочнике про приоритеты пишут, что умножение имеет преимущество над делением, значит умножение должно выполняться в первую очередь, если скобками не указать порядок, разве нет?


А на практике сначала деление, потом умножение...

 

Здравствуйте! Помогите разобраться. Пишу свой первый советник на MQL4. 

Советник открывает позицию, но не закрывает ее. В журнале никаких ошибой не выдает.

void OnTick()
  {RefreshRates();
  ma1=iMA(_Symbol,TimeFrame,Period_MA1,Shift_MA1,metod_ma1,PRICE_CLOSE,0);
ma2=iMA(_Symbol,TimeFrame,Period_MA2,Shift_MA2,metod_ma2,PRICE_CLOSE,0);


if (ma1<ma2)
{
SellPositionClose();
BuyPositionOpen();
}

if (ma1>ma2)
{
BuyPositionClose();
SellPositionOpen();
}
}
 

     
void BuyPositionOpen()  // покупка
{int res=0;
RefreshRates();
if (OrdersTotal()==0)
res=OrderSend(_Symbol,OP_BUY,Lots,Ask,3,0,0,"",Magic,0,Blue);
if (res<0) Print("OrderClose111111 error ",GetLastError());
}

void     SellPositionOpen() // продажа
{int res=0;
RefreshRates();
if (OrdersTotal()==0)
res=OrderSend(_Symbol,OP_SELL,Lots,Bid,3,0,0,"",Magic,0,Red);
if (res<0) Print("OrderClose111111 error ",GetLastError());
}

void BuyPositionClose() // закрытие длинной позиции
{RefreshRates();
if ((OrdersTotal()!=0) && (OrderMagicNumber()==Magic))
{
if (!OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) Print("OrderClose error ",GetLastError());

 if(OrderType()==OP_BUY)
           
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
               }
               }
               
void SellPositionClose()  // закрытие короткой позиции
{RefreshRates();
if (OrdersTotal()!=0 && OrderMagicNumber()==Magic)
{
if (!OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) Print("OrderClose error ",GetLastError());
    
     if(OrderType()==OP_SELL)
                
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,100,White))
               Print("OrderClose error ",GetLastError());
               
               }
               }
 
Terind:

Здравствуйте! Помогите разобраться. Пишу свой первый советник на MQL4. 

Советник открывает позицию, но не закрывает ее. В журнале никаких ошибой не выдает.

 

Вот это условие не работает:

if ((OrdersTotal()!=0) && (OrderMagicNumber()==Magic)) //ордер ещё не выбран с помощью OrderSelect()