[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 370

 
TarasBY:

По поводу этой строчки:

В последнее время ДЦ нередко добавляют к названию символа разные префиксы (EURUSDm - например) - их и нужно учитывать, обращаясь к рыночному окружению символа.

P.S. ...и для стандартного "EURUSD" StringSubstr ("EURUSD", 6) будет не ноль а "".

Спасибо большое, Игорь! Я про ДЦ и буковку не знал. Это, наверное, минисчет - за буковку "m"

А не в курсе - откуда у JPY коэффициент 82 ? у других валют было у GBP - 0.625, у EUR - 0.7751937984

По идее при пересчете курсов валют коэффициент будет плавающим при изменении курсов. Почему тогда берут константы?
 
Chiripaha:

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

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

Поэтому тут нельзя указать на конкретную ошибку, т.к. все нужно переделывать совсем иначе. - ИМХО, не претендую на большее.

Но это не повод огорчаться. Учитесь и дальше писать. Тут, как говориться, вместо Вас, конечно, можно "покушать" (сделать работу), но Вы сами сытым не станете от этого (т.е. не научитесь). Поэтому дерзайте дальше. Дорогу осилит идущий.

Попробуйте сызнова написать с другим подходом к этой задаче. - Мне помогало.


Спасибо за критику. Скажите а вообще реально это реализовать?
 
NICK_R:
Спасибо за критику. Скажите а вообще реально это реализовать?

Конечно, реально. Только это не совсем простенькая задача. Не сказать, чтобы сильно трудная, но и не простая. - Для учебы в самый раз.
 
Chiripaha:

Спасибо большое, Игорь! Я про ДЦ и буковку не знал. Это, наверное, минисчет - за буковку "m"

А не в курсе - откуда у JPY коэффициент 82 ? у других валют было у GBP - 0.625, у EUR - 0.7751937984

По идее при пересчете курсов валют коэффициент будет плавающим при изменении курсов. Почему тогда берут константы?

Сергей, мне эти цифры ни о чём не говорят, поэтому на этот вопрос ответа не имею.

А префиксы в написании символа могут иметь, а могут и не иметь никакого смысла.

 
TarasBY:

Сергей, мне эти цифры ни о чём не говорят, поэтому на этот вопрос ответа не имею.

А префиксы в написании символа могут иметь, а могут и не иметь никакого смысла.

ОК. Спасибо!
 

Добрый день коллеги!

Подскажите пожалуйста, как можно уйти от цикла в цикле (выделил красным в коде)? Индикатор тормозит жутко.

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  DarkGray
#property  indicator_color2  PowderBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=3;
extern bool Show_Volume=true;
extern double coaf=0.5;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];

    double  price_up_start, price_up_end, AO_up;
    double  price_dn_start, price_dn_end, AO_dn;
    datetime time_up, time_dn, AO_time_up, AO_time_dn;
    double Vol_AO_up, Vol_AO_dn;
    int shift_up, shift_dn, dn_koaf, up_koaf, dn_koaf_round, up_koaf_round;
    
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
  //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(int i=0; i<limit; i++)   // -------------------------------------------- Основной цикл
   {
     
 //---- Awesom + Volumes
     
AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}

//----------------------------- Блок поиска значений -----------------------------------------//
 
 //-- Поиск Low & Time & Min_AO 
  if (AOBuffer3[i] < 0)
  {
 price_up_end = 0; AO_up = 0;  
 price_dn_start = Low[i]; if (price_dn_end == 0) price_dn_end = Low[i]; 
 if (price_dn_start <= price_dn_end) {price_dn_end = price_dn_start; time_dn = Time[i]; shift_dn = iBarShift(NULL, 0, time_dn);}
 if (AOBuffer3[i] <= AO_dn) {AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_dn = Time[i];}
 dn_koaf=dn_koaf_round;
 up_koaf_round++;
  }   
  
  //-- Поиск High & Time & Max_AO  
  if (AOBuffer3[i] > 0)
   {
  price_dn_end = 0; AO_dn = 0;  
  price_up_start = High[i];
  if (price_up_start >= price_up_end) {price_up_end = price_up_start; time_up = Time[i]; shift_up = iBarShift(NULL, 0, time_up);}
  if (AOBuffer3[i] >= AO_up) {AO_up = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_up = Time[i];}
  up_koaf=up_koaf_round;
  dn_koaf_round++;
   }   
 //--------------------------------- Выставляем значения --------------------------------------------//
    
   Vol_AO_up = 0; Vol_AO_dn = 0;
  if (shift_up > shift_dn)
    {
 for (int dn_br = shift_dn; dn_br <= shift_up; dn_br++)            //-------------- Перебор значений внутри основного цикла
          {
    Vol_AO_up += Volume[dn_br]; 
    SetText("Awesome_super_volumes"+up_koaf, DoubleToStr(Vol_AO_up,0), AO_time_dn, AO_dn, Blue);
          }   
  }
 
 if (shift_dn > shift_up)
    {
 for (int up_br = shift_up; up_br <= shift_dn; up_br++)            //-------------- Еще один перебор значений внутри основного цикла
          {
    Vol_AO_dn += Volume[up_br]; 
    SetText("Awesome_super_volumes"+dn_koaf, DoubleToStr(Vol_AO_dn,0), AO_time_up, AO_up, Red);
          }   
    }
 } 
           
//---- done

   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 6, "Arial Black", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }

 

Спасибо! 


 

 
Fox_RM:

Добрый день коллеги!

Подскажите пожалуйста, как можно уйти от цикла в цикле (выделил красным в коде)? Индикатор тормозит жутко.

 Спасибо! 

Все-таки, выскажу такую, может быть дурацкую, идею. Но, может на какую-нибудь более разумную натолкнет.

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

И после того, как первый перебор завершится, брать необходимые значения из этого массива (буфера) для получения данных для 2-го перебора.

Только не особенно уверен, что это поможет для скорости. Но и в причинах тормозов я тоже не сильно разбираюсь. Сказать что-то более квалифицированно в этом плане мне сложно.

Какие могут быть плюсы и минусы. Минус в том, что в этом случае вы оцениваете ситуацию по бару не в онлайне, а постфактум, когда данные уже как бы не нужны. Но!... это нивелируется тем, что, фактически, при пересчете старых данных, они уже вам в онлайне и не нужны. А когда будут приходить актуальные текущие данные, то они тут же будут 2-ым перебором и обрабатываться. Поэтому потери актуальности в данном случае быть не должно. А плюс - это решит поставленную Вами задачу: избавиться от перебора в переборе. : ))

Возможно, я чего-то не учел. Отнеситесь к моей идее критически. Ну, и лучший критик - это практика. Нужно просто написать и этим перепроверить, что и как будет работать. Так думаю.

 

Разницы практически никакой, просто несколько иной процесс получения контрольных точек A и B будет. Я уже пробовал через массивы.

Потом  между А и В также цикл организовывать придется по перебору баров. Другого пути я не вижу, поэтому и вопрос задал.

Может кто что подскажет. Возможно логика написания кода где хромает?  

 
Fox_RM:

Разницы практически никакой, просто несколько иной процесс получения контрольных точек A и B будет. Я уже пробовал через массивы.

Потом  между А и В также цикл организовывать придется по перебору баров. Другого пути я не вижу, поэтому и вопрос задал.

Может кто что подскажет. Возможно логика написания кода где хромает?  

Да, точно - нужно будет все равно цикл с перебором делать. Значит, никак не избежать этого. И скорее всего нужно иначе тогда вопрос поставить - За счет чего происходят тормоза и как от этого избавиться?
 
Fox_RM:

Добрый день коллеги!

Подскажите пожалуйста, как можно уйти от цикла в цикле (выделил красным в коде)? Индикатор тормозит жутко.

 Спасибо! 

Вот в этом месте можно сгруппировать - уже будет маленькая оптимизация индючка:

if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}

на такую:

if (Show_Volume==true)
{
 double nSum = Volume[i]*Point*coaf; double Vol_Arr[];  // Не знаю в этом случае можно через запятую переменные прописывать? - double nSum = Volume[i]*Point*coaf, Vol_Arr[];

 if (AOBuffer3[i]<=0) {ExtMapBuffer1[i] =  nSum; Vol_Arr[i] =  Volume[i]*Point*coaf;}
 if (AOBuffer3[i]>0)  {ExtMapBuffer1[i] = -nSum; Vol_Arr[i] = -Volume[i]*Point*coaf;}
}

Вот тут:

AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i];
// и тут
AO_up = AOBuffer3[i]*0.2+AOBuffer3[i];

Можно поменять на:

AO_dn = AOBuffer3[i]*1.2;
     // и
AO_up = AOBuffer3[i]*1.2;

Потом, у Вас в индикаторе накапливаются "Тексты". Перед тем, как поместить новый текст, старые нужно удалять. Это может сильно тормозить индюка - может именно в этом и причина. Т.к. у вас этих текстов получается столько, сколько тиков на отобранных параметрах.

Если кто подскажет как лучше это в коде реализовать - а то я сам за подобной помощью по кодированию обращаюсь.

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