Массивы Osmadown и Osmaup объявлены, но память под них не распределена. Их размер как был нулевым, так и остался. Соответственно, любое обращение к этим массивам вызывает ошибку выхода за пределы массива (см. вкладку "Эксперты" окна терминал после запуска эксперта в онлайн).
P. S. Чтобы вставить код, используйте пиктограмму "</>" или Alt+S.
void CheckForOpen() { double osma1=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,1); double osma2=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,2); double osma3=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,3); double Osmadown[], Osmaup[]; int res; for(int i=2; i<100; i++) { Osmadown[i]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i); //---все значения Osma от 2-го бара включительно, которые меньше 0. if(Osmadown[i]>0) //---как только Osma на каком-то баре поднимается выше 0, это значение не учитывается break; } for(int k=2; k<100; k++) { Osmaup[k]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,k); //---все значения Osma от 2-го бара включительно, которые больше 0. if(Osmaup[k]<0) //---как только Osma на каком-то баре опускается ниже 0, это значение не учитывается break; } //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average //--- sell conditions if(osma1<Osmadown[i]) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Ask+sl*Point,Bid-tp*Point,"",MAGICMA,0,Red); return; } //--- buy conditions if(osma1>Osmaup[k]) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-sl*Point,Ask+tp*Point,"",MAGICMA,0,Blue); return; } //--- }
Ihor Herasko:
как же под них распределить память?
Массивы Osmadown и Osmaup объявлены, но память под них не распределена. Их размер как был нулевым, так и остался. Соответственно, любое обращение к этим массивам вызывает ошибку выхода за пределы массива (см. вкладку "Эксперты" окна терминал после запуска эксперта в онлайн).
P. S. Чтобы вставить код, используйте пиктограмму "</>" или Alt+S.
double Osmadown[100], Osmaup[100];Или ArrayResize
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Подскажите, пожалуйста, кто знает, что не так в коде?
void CheckForOpen()
{
double osma1=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,1);
double osma2=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,2);
double osma3=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,3);
double Osmadown[], Osmaup[];
int res;
for(int i=2; i<100; i++)
{
Osmadown[i]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i); //---все значения Osma от 2-го бара включительно, которые меньше 0.
if(Osmadown[i]>0) //---как только Osma на каком-то баре поднимается выше 0, это значение не учитывается
break;
}
for(int k=2; k<100; k++)
{
Osmaup[k]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,k); //---все значения Osma от 2-го бара включительно, которые больше 0.
if(Osmaup[k]<0) //---как только Osma на каком-то баре опускается ниже 0, это значение не учитывается
break;
}
//--- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//--- get Moving Average
//--- sell conditions
if(osma1<Osmadown[i])
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Ask+sl*Point,Bid-tp*Point,"",MAGICMA,0,Red);
return;
}
//--- buy conditions
if(osma1>Osmaup[k])
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-sl*Point,Ask+tp*Point,"",MAGICMA,0,Blue);
return;
}
Смысл такой, чтобы перед открытием сделки программа проверяла значения индикатора Osma на предыдущих барах. То есть, для продажи: osma[1] должен быть меньше значений индикатора на предыдущих барах вплоть до того бара, на котором индикатор >0. Для покупок - наоборот. Если в условиях сделки указывать osma с конкретным индексом, то все четко срабатывает, а как добавил этот оператор "for", так открывает все подряд без разбору.
В чем ошибка? При компиляции никаких ошибок MetaEditor не видит.
Буду благодарен за советы! Не судите строго новичка (