помогите со стрелками

 
#define __N       200      
 
extern int Sloss   = 60;
extern int Tprofit = 120;
extern   int      barn = 500;
double stop_b =0, profit_b=0;
double stop_s = 0, profit_s = 0;
 
 
void Find_()
{
int _i,i,j=0,k=0;
if(!Optimize)return;
   for(i=0;i<barn;i+=5){//buy i++ стрелки кучей а результат тотже
   if(k<__N)
     {
     stop_b = (Close[i+10] - Low[i])/Point;
     profit_b =(High[i] - Close[i+10])/Point;
     if(stop_b < Sloss &&  profit_b >= Tprofit)
         { 
           ObjectCreate("up"+i,OBJ_ARROW,0,Time[i+10],Close[i+10]);
           ObjectSet("up"+i,OBJPROP_ARROWCODE,225);//стрелка вверх
          // Buy[k] = Data(i+10);k++;
            }
         }
      }
   for(_i=0;_i<barn;_i+=5){
   if(j<__N)
     {//sell
     stop_s =(High[_i] - Close[_i+10])/Point;
     profit_s = (Close[_i+10] - Low[_i])/Point; 
     if(stop_s < Sloss && profit_s >= Tprofit)
         { 
           ObjectCreate("dw"+_i,OBJ_ARROW,0,Time[_i+10],Close[_i+10]);
           ObjectSet("dw"+_i,OBJPROP_ARROWCODE,226);//стрелка вниз 
          // Sell[j] = Data(_i+10);j++;
            }
         } 
      }
   }
пытаюсь стрелки нарисовать по возможным сделкам на графике,много пропусков,в чем может быть дело?
 
А не проще ли стрелки наносить через индикатор буфера?

int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 3);
   SetIndexArrow(0,241);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 3);
   SetIndexArrow(1,242);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
//----
   return(0);
  }
 
нет непроще.... буферы индикатора в эксперте не работают, идея заключается в том чтобы записать в момент стрелки показания индикаторов в массив,гдето ошибка немогу найти... уже вот так пытаюсь неполучается всеравно...
#define __N       200 
 
 
extern int Sloss   = 60;
extern int Tprofit = 120;
 
int Buy[__N];
int Sell[__N];
 
extern   int      barn = 500;
 
double stop_b =0, profit_b=0;
double stop_s = 0, profit_s = 0;
 
void Find_()
{
int _i,i,j=0,k=0;
//if(!Optimize)return;
   for(i=0;i<barn;i+=5){//buy
   if(k<__N)
     {
     int Low_b = iLowest(NULL,0,MODE_LOW,i+10,i);
     int High_b = iHighest(NULL,0,MODE_HIGH,i+10,i);
     stop_b = (Close[i+10] - Close[Low_b])/Point;
     profit_b =(Close[High_b] - Close[i+10])/Point;
     if(stop_b < Sloss &&  profit_b >= Tprofit)
            { 
            ObjectCreate("up"+i,OBJ_ARROW,0,Time[i+10],Close[i+10]);
            ObjectSet("up"+i,OBJPROP_ARROWCODE,225);//стрелка вверх
            Buy[k] = Data(i+10);k++;
            }
         }
      }
   for(_i=0;_i<barn;_i+=5){
   if(j<__N)
     {//sell 
     int Low_s = iLowest(NULL,0,MODE_LOW,_i+10,_i);
     int High_s = iHighest(NULL,0,MODE_HIGH,_i+10,_i);
     stop_s =(Close[High_s] - Close[_i+10])/Point;
     profit_s = (Close[_i+10] - Close[Low_s])/Point; 
     if(stop_s < Sloss && profit_s >= Tprofit)
            { 
            ObjectCreate("dw"+_i,OBJ_ARROW,0,Time[_i+10],Close[_i+10]);
            ObjectSet("dw"+_i,OBJPROP_ARROWCODE,226);//стрелка вниз 
            Sell[j] = Data(_i+10);j++;
            }
         } 
      }
   }
 
skywoker:
нет непроще.... буферы индикатора в эксперте не работают, идея заключается в том чтобы записать в момент стрелки показания индикаторов в массив,гдето ошибка немогу найти... уже вот так пытаюсь неполучается всеравно...

А функция start() есть?
 
да забыл дописать,там просто можно вызвать

void start()
     {
      Find_();  
      }

массивы Buy и Sell в циклах закоментировать...
 
skywoker:
да забыл дописать,там просто можно вызвать

void start()
{
Find_();
}

массивы Buy и Sell в циклах закоментировать...

Чему равно значение Buy [ k ] = Data ( i + 10 ) ; в этом выражении? Что возвращает функция Data().
 
там просто индикаторы это так пока для для пристрелки вот функция дата:
int Data(int off)
{
 int sum = 0;
 HideTestIndicators(true);
 int _i;
 double tmp, result, _max;
 ////////////// 
    for(_i = 0;_i<10;_i++){
    tmp = iRSI(NULL,0,12,PRICE_CLOSE,_i+ off) ;
    tmp = (tmp -50)/100;
    tmp = MathCeil(1000*tmp)/1000;    
    if(tmp>0.5)  tmp=0.5;  if(tmp<-0.5) tmp=-0.5;
    if(tmp == -0.5)sum--;
    if(tmp == 0.5)         sum++;
     }
 /////////////  
  for(_i = 0;_i<10;_i++){
    tmp = iCCI(Symbol(),0,12,PRICE_CLOSE,_i+off );
    tmp = (tmp/300);
    tmp = MathCeil(1000*tmp)/1000;   
    if(tmp>0.5)  tmp=0.5;    if(tmp<-0.5) tmp=-0.5;
    if(tmp == -0.5)sum--;
    if(tmp == 0.5)         sum++;
    }
 /////////////   
  for(_i = 0;_i<10;_i++){
  double ma_t = iMA(NULL,0,12,0,MODE_SMA,PRICE_CLOSE,_i+off);
  double ma_h = iMA(NULL,0,12,0,MODE_SMA,PRICE_CLOSE,_i+off+1);
    if(ma_t>ma_h)sum++;
    if(ma_t<ma_h)sum--;
    }
 
return(sum);
}
 
skywoker:
там просто индикаторы это так пока для для пристрелки вот функция дата:
Попробуй воспользоваться принтами в узких местах. С логикой разбираться неохота
 
Не заморачиваясь писательством, использую приведенную ниже функцию. Для советника вместо i ставится номер бара, на котором ставится стрелка. Ни разу не подводила.
//----
//.....
string indicator_name = "Stochastic_signal";//любое имя, идентифицирующее объекты
//----
//+----------------------------------------------------------------------+
//| Void SetArrow пример вызова: SetArrow(Time[i],Low[i]- 5*Point,241,Blue);|
//+----------------------------------------------------------------------+
void SetArrow(datetime ArrowTime, double Price, double ArrowCode, color ArrowColor)
{
int err;
string ArrowName = indicator_name+DoubleToStr(ArrowTime,0);
if (ObjectFind(ArrowName) != -1) ObjectDelete(ArrowName);
if(!ObjectCreate(ArrowName, OBJ_ARROW, 0, ArrowTime, Price))
{
err=GetLastError();
Print("error: can't create Arrow! code #",err);
return;
}
else
{
ObjectSet(ArrowName, OBJPROP_ARROWCODE, ArrowCode);
ObjectSet(ArrowName, OBJPROP_COLOR , ArrowColor);
WindowRedraw();

}
}
//------------------------------------------------------------------------+
 
Спасибо большое но я в своей уже разобрался вчем дело ошибка была смешная вот работоспособный вареант...
extern int Sloss   = 60;
extern int Tprofit = 120;
double stop_b =0, profit_b=0;
double stop_s = 0, profit_s = 0;
 
void Find_()
{
int _i,i,j=0,k=0;
   for(i=0;i<barn;i+=5){//buy
     stop_b =0; profit_b=0;
     int Low_b = iLowest(NULL,0,MODE_LOW,9,i);
     int High_b = iHighest(NULL,0,MODE_HIGH,9,i);
     stop_b = (Close[i+10] - Low[Low_b])/Point;
     profit_b =(High[High_b] - Close[i+10])/Point;
     if(Tprofit/2 < profit_b && stop_b < Sloss )
            { 
            ObjectCreate("Stop "+i,OBJ_ARROW,0,Time[Low_b],Low[Low_b]);
            ObjectSet("Stop "+i,OBJPROP_ARROWCODE,241);
            ObjectCreate("Profit "+i,OBJ_ARROW,0,Time[High_b],High[High_b]);
            ObjectSet("Profit "+i,OBJPROP_ARROWCODE,241);                        
            ObjectCreate("up"+i,OBJ_ARROW,0,Time[i+10],Close[i+10]);
            ObjectSet("up"+i,OBJPROP_ARROWCODE,225);//стрелка вверх
            }
      }
   for(_i=1;_i<barn;_i+=5){//sell 
     stop_b =0; profit_b=0;
     int Low_s = iLowest(NULL,0,MODE_LOW,9,_i);
     int High_s = iHighest(NULL,0,MODE_HIGH,9,_i);
     stop_s =(High[High_s] - Close[_i+10])/Point;
     profit_s = (Close[_i+10] - Low[Low_s])/Point; 
     if(Tprofit/2 < profit_s && stop_s < Sloss)
            { 
            ObjectCreate("Stop "+_i,OBJ_ARROW,0,Time[High_s],High[High_s]);
            ObjectSet("Stop "+_i,OBJPROP_ARROWCODE,242); 
            ObjectCreate("Profit "+_i,OBJ_ARROW,0,Time[Low_s],Low[Low_s]);
            ObjectSet("Profit "+_i,OBJPROP_ARROWCODE,242); 
            ObjectCreate("dw"+_i,OBJ_ARROW,0,Time[_i+10],Close[_i+10]);
            ObjectSet("dw"+_i,OBJPROP_ARROWCODE,226);//стрелка вниз 
            }
         }
      }
Причина обращения: