Обсуждение статьи "Торговые идеи на основе направления и скорости движения цен" - страница 2

 
abolk:

да, прочитал как OrderSend()

Ну суть не в этом. Вопрос тот же:

Ответьте, пожалуйста, какой из примеров подходит под категорию Правильный, а какой Корректный?

 
Alex2356:

Ответьте, пожалуйста, какой из примеров подходит под категорию Правильный, а какой Корректный?

ответ дан выше
 

Код не ошибочный, код избыточный. Тем более, что сама функция depth_trend() может вызываться до 4 раз на одном тике!

Значение индикатора нужно получить один раз, рассчитать - в какой он зоне - тоже однажды. А потом уже 4 раза использовать посчитанный результат, сохраненный в переменную.

Примерно так:

void OnTick()
{
    refresh_depth_trend();

//--- проверка на то, что нет уже открытых ордеров
   if(OrdersTotal()<1)
     {
      //--- проверка условий на покупку
      if(Buy())

....
}

void refresh_depth_trend()
  {
    index_rsi = 0;
    double rsi = iRSI(Symbol(),tf,period,PRICE_CLOSE,0);

//--- определение индекса
    if ( rsi > 90.0 ) index_rsi = 4;
    else if ( rsi > 80.0 ) index_rsi = 3;
    else if ( rsi > 70.0 ) index_rsi = 2;
    else if ( rsi > 60.0 ) index_rsi = 1;
    else if ( rsi < 10.0 ) index_rsi = -4;
    else if ( rsi < 20.0 ) index_rsi = -3;
    else if ( rsi < 30.0 ) index_rsi = -2;
    else if ( rsi < 40.0 ) index_rsi = -1;
  }

//+------------------------------------------------------------------+
//| Функция проверки условия на покупку                              |
//+------------------------------------------------------------------+
bool Buy()
  {
   bool res=false;
   if((index_rsi==2 && speed_ac(tf)>=1) || (index_rsi==3 && speed_ac(tf)==1))
      res=true;
   return (res);
  }

Индекс можно и одной строкой посчитать, но тогда действительно будет не понятно новичкам. 

Со вторым индикатором - аналогично. 

 
komposter:

Код не ошибочный, код избыточный. Тем более, что сама функция depth_trend() может вызываться до 4 раз на одном тике!

Значение индикатора нужно получить один раз, рассчитать - в какой он зоне - тоже однажды. А потом уже 4 раза использовать посчитанный результат, сохраненный в переменную.

Примерно так:

Индекс можно и одной строкой посчитать, но тогда действительно будет не понятно новичкам. 

Со вторым индикатором - аналогично. 

Почему вы думаете что функция может вызываться 4 раза на одном тике ???

Я не вижу....

 
VOLDEMAR:

Почему вы думаете что функция может вызываться 4 раза на одном тике ???

Я не вижу....

//--- проверка на то, что нет уже открытых ордеров
   if(OrdersTotal()<1)
     {
      //--- проверка условий на покупку
      if(Buy())
         tr.OpnOrd(OP_BUY,tr.Lots(),Ask,SL*dg,TP*dg);
      //--- проверка условий на продажу
      if(Sell())
         tr.OpnOrd(OP_SELL,tr.Lots(),Bid,SL*dg,TP*dg);
     }


//+------------------------------------------------------------------+
//| Функция проверки условия на покупку                              |
//+------------------------------------------------------------------+
bool Buy()
  {
   bool res=false;
   if((depth_trend(tf)==2 && speed_ac(tf)>=1) || (depth_trend(tf)==3 && speed_ac(tf)==1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Функция проверки условия на продажу                              |
//+------------------------------------------------------------------+
bool Sell()
  {
   bool res=false;
   if((depth_trend(tf)==-2 && speed_ac(tf)<=-1) || (depth_trend(tf)==-3 && speed_ac(tf)==-1))
      res=true;
   return (res);
  }
Вот.
 
VOLDEMAR:

Почему вы думаете что функция может вызываться 4 раза на одном тике ???

Я не вижу....

Я бы сделал так :

int refresh_depth_trend()
  {
   int    index_rsi=0;
   double rsi=iRSI(Symbol(),0,14,PRICE_CLOSE,0),up=60,dw=40;
   for(int i=1; i<=4; i++,up+=10,dw-=10)
      index_rsi=rsi>up ? i : rsi<dw ?(i*-1):index_rsi;
   return index_rsi;
  }

Возможно новенькие не все поймут, но на мой взгляд прекрассно!!!

Предлагаю попинать меня...

Да и что бы проверить результат вот код что бы не париться :

void refresh_depth_trend()
  {
   int index_rsi=0;
   double rsi=iRSI(Symbol(),0,14,PRICE_CLOSE,0),up=60,dw=40;

   for(int i=1; i<=4; i++,up+=10,dw-=10)
     {
      index_rsi=rsi>up ? i : rsi<dw ?(i*-1):index_rsi;
      Print(" i ",i,"  up  ",up,"  dw  ",dw,"   index_rsi ",index_rsi);
     }
   Print(" index_rsi ",index_rsi);
  }
 
komposter:
Вот.
Угу увидел ...
 
VOLDEMAR:

Я бы сделал так :

Возможно новенькие не все поймут, но на мой взгляд прекрассно!!!

Предлагаю попинать меня...

Можно вообще одной строкой, и без цикла ;)

 
komposter:

Можно вообще одной строкой, и без цикла ;)

ps: хотя, может не получится, округлять в разные стороны надо.. еще подумаю 

Можно, но будет не красиво ...
 
VOLDEMAR:
Можно, но будет не красиво ...

Что некрасивого?

index_rsi = (int)MathFloor( (rsi-50.0)/10.0-(rsi-50.0)*0.0001 );
Причина обращения: