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

 
korobok777:
Без кода ничего сказать нельзя
 

Добрый день. Вот написал простенький индикатор на выход RSI из зон перекуплености\перепроданости - работает

правильно, стрелки рисует там где надо. Но только в реальном времени.

Вопрос: как заставить его рисовать на истории на n-ное количество баров? 

 

 

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
int start()
{  

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
 
Vinin:
Без кода ничего сказать нельзя
//==================================================================+
extern ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков
//==================================================================+

string _ChartSymbol;
long   _ChartID,
       _ChartFirst,
       _ChartPeriod;
int start()
{//---идентификатор графика начиная с первого 
    _ChartFirst=ChartFirst();
if(_ChartFirst>0)//если идентификатор больше ноля
{
 _ChartSymbol=ChartSymbol(_ChartFirst);//символ графика
 _ChartPeriod=ChartPeriod(_ChartFirst);//Периоды графика
 //---выполним функцию конвертации периода если не совпадает
if( _ChartPeriod!=PERIOD_)
 {
  bool  ch=ChartSetSymbolPeriod(_ChartFirst,_ChartSymbol,PERIOD_);
 } 
}
return(0);
}
int  deinit()
{
Alert("скрипт закончил работу");
return(0);
}
это только для первого графика,дальше не делал мешает окно всплывающее.
 
Red_Manticore:

Добрый день. Вот написал простенький индикатор на выход RSI из зон перекуплености\перепроданости - работает

правильно, стрелки рисует там где надо. Но только в реальном времени.

Вопрос: как заставить его рисовать на истории на n-ное количество баров? 

 

 

Вставляйте код по правилам, ознакомиться надо раньше! Клик на SRC слева от кнопки видео, а "простыню" удалите!

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
int start()
{  

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
ответить
 
korobok777:
это только для первого графика,дальше не делал мешает окно всплывающее.

Скрипт обрабатывает все открытые графики. Текущий обрабатывается последним. Так как при смене таймфрейма скрипты завершают свою работу, то окно с предупреждением о завершении работы скрипта будет вылетать только один раз. На всех графиках таймфрейм сменится на заданный

//+------------------------------------------------------------------+
//|                                             ReplaceTimeFrame.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict

#property show_inputs

input ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long id=ChartFirst();
   long id_current=ChartID();
   int i=0;
   while(i<100)
     {
      ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id);//Периоды графика
      if(_ChartPeriod!=PERIOD_ && id!=id_current)
        {
         bool  ch=ChartSetSymbolPeriod(id,ChartSymbol(id),PERIOD_);
        }

      id=ChartNext(id);
      if(id<0){break;}
      i++;
     }
   ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id_current);//Периоды графика
   if(_ChartPeriod!=PERIOD_)
     {
      bool  ch=ChartSetSymbolPeriod(id_current,ChartSymbol(id_current),PERIOD_);
     }
  }
 
Vinin:

Скрипт обрабатывает все открытые графики. Текущий обрабатывается последним. Так как при смене таймфрейма скрипты завершают свою работу, то окно с предупреждением о завершении работы скрипта будет вылетать только один раз. На всех графиках таймфрейм сменится на заданный

 


Ай)))молодца!!!!Спасибо!!!
 

добрый день,

 

объявляю массив

double         gdClose_array[];

ArrayResize(gdClose_array, 1); 

 

Копирую в массив данные с закрытием  по последнему закрытому Бару, с текущего графика

 iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

 

Вывожу значение массива 

 double  dX=NormalizeDouble(gdClose_array[0],Digits);

  Print  ("NormalizeDouble(dX,Digits)  ", dX);

 

Получаю цифру, но она явно не правильная: 

 NormalizeDouble(dX,Digits)  1.0644

Хотя по графику (по визуализации)  рядом нет такого значения 

 И это значение не меняется по ходу тестирования.

 

 

Добавил

 ArraySetAsSeries(gdClose_array,true);

ситуация не изменилась 

Где ошибка? 

 
n0name:

добрый день,

...

Копирую в массив данные с закрытием  по последнему закрытому Бару, с текущего графика

 iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Тут вы записали только имя массива, не указав индекс элемента массива. Так как ранее ArrayResize(gdClose_array, 1); вы задали кол-во элементов массива как 1, то его индекс равен 0. Поэтому надо так:

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);


И ещё парочка вопросов/советов.

1) Если вам надо запомнить только 1 значение, тогда можно использовать переменную, а не массив. Тогда вместо:

double gdClose_array[];
ArrayResize(gdClose_array, 1); 

сделайте

double gdClose_array;

а дальше как ваш первоначальный код.

2) Если надо именно массив, но при этом сразу знаете, что у него будет только 1 элемент, тогда сразу объявляйте статический массив с 1 элементом вместо того чтобы объявить динамический, а потом задавать ему размер. Лишние операции не нужны.

Вместо

double gdClose_array[];
ArrayResize(gdClose_array, 1);

запишите

double gdClose_array[1];

потом

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);

а дальше как ваш первоначальный код.

 

Добрый день! Вопрос к программистам.

 Имеется советник, который срабатывает при открытии ордера и выставляет  на него стоп-лосс и тейк-профит в соответствие с заданным количеством пунктов.

Вопрос.

Можно ли изменить код так, чтобы вместо стоп-лосса советник выставлял отложенный обратный стоп ордер того же объёма. 

Что для этого нужно изменить в коде?

 

Спасибо. 

 

Добрый день!

Опять не могу выпутаться из наверное элементарной вещи - почему вроде бы все по справке, а результат печатает 0.0 ?

  double FractalDown_1 = iFractals(NULL,0,MODE_LOWER,1); Print("FractalDown_1=",FractalDown_1);

 Почему не извлекается значение фрактала?

Причина обращения: