Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну вот еще. Прямотаки все ломанулись :) И не стыдно ? А где уважение ко времени форумян :) ?
int i - это объявление переменной i, 3 раза объявить одну переменную неудастся и это правильно.
Проблема описываемая раньше была другая - скобки {} не ограничивают область видимости переменной (как это есть в Си).
Т.е. если написать так:
if (a == 0) { int b; ....... } c = b;То в зависимости от значения а при работе скрипта может возникнуть ошибка, а может и не возникнуть.
(я правда конкретно этот вариант не проверял, смотрел похожий)
В Си компилятор этого недопустит,
обругает что переменная b неописана (и это правильно)
Да тут можно и по коду догадаться, я же фактически уже все рассказал. :)
Если я поставлю во все три цикла один и тот же счетчик (допусти i), то компилятор выругатеся на попытку повторного объявления переменной i. Которую я даже не объявлял явно.
во-первых, скажите, что пробовать и что получить?
во-вторых, как это в явном виде не объявляются? int i=0;... int k=0;... int l=0;... - это что? явное объявление с инициализацией.
и почему нельзя обойтись одним счётчиком i? посмотрите наш пример индикатора OsMA - три цикла на одном счётчике i
int i - это объявление переменной i, 3 раза объявить одну переменную неудастся и это правильно.
Проблема описываемая раньше была другая - скобки {} не ограничивают область видимости переменной (как это есть в Си).
Т.е. если написать так:
if (a == 0) { int b; ....... } c = b;То в зависимости от значения а при работе скрипта может возникнуть ошибка, а может и не возникнуть.
(я правда конкретно этот вариант не проверял, смотрел похожий)
Насколько я помню, твой способ, Mak, не помог. Поэтому пришлось делать три счетчика - по одному на каждый цикл.
Вопрос какова область действия этого объявления.
(как оно в данном случае будет в Си уже не помню)
как не явно ? Явно :)
Только в MQL4 насколько я понял обьявленная переменная в процедуре 'видна' до конца этой процедуры.
Попробуйте так:
for(int i=0; i<limit; i++) ...
for(i=0; i<limit; i++)...
for(i=0; i<limit; i++)...
по идее должно сработать.
//+------------------------------------------------------------------+ //| TDI.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 DarkBlue #property indicator_color2 Red //---- input parameters extern int PeriodTDI=20; //---- buffers double TDI_Buffer[]; double Direction_Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,TDI_Buffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,Direction_Buffer); SetIndexLabel(0,"Trend Direction Index"); SetIndexLabel(1,"Direction"); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: add your code here //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { double MomBuffer[]; double MomAbsBuffer[]; double MomSumBuffer[]; double MomSumAbsBuffer[]; double MomAbsSumBuffer[]; double MomAbsSum2Buffer[]; bool First=true; int limit,i; int counted_bars=IndicatorCounted(); //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; // if (First){limit=Bars-PeriodTDI; First=false;} else limit=Bars-counted_bars; limit=Bars-PeriodTDI; ArraySetAsSeries(MomBuffer,true); ArraySetAsSeries(MomAbsBuffer,true); ArraySetAsSeries(MomSumBuffer,true); ArraySetAsSeries(MomSumAbsBuffer,true); ArraySetAsSeries(MomAbsSumBuffer,true); ArraySetAsSeries(MomAbsSum2Buffer,true); //---- TODO: add your code here for(int i=0; i<limit; i++) { MomBuffer[i]=Close[i]-Close[i+PeriodTDI]; MomAbsBuffer[i]=MathAbs(MomBuffer[i]); } for(int i=0; i<limit; i++) { MomSumBuffer[i]=iMAOnArray(MomBuffer,Bars,PeriodTDI,0,MODE_SMA,i)*PeriodTDI; MomSumAbsBuffer[i]=MathAbs(MomSumBuffer[i]); TDI_Buffer[i]=MomSumBuffer[i]; MomSumAbsBuffer[i]=MomAbsBuffer[i]; } // for(int l=limit; l>=0; l--) // { // MomAbsSumBuffer[l]=iMAOnArray(MomAbsBuffer,0,PeriodTDI,0,MODE_SMA,l)*PeriodTDI; // MomAbsSum2Buffer[l]=iMAOnArray(MomAbsBuffer,0,2*PeriodTDI,0,MODE_SMA,l)*2*PeriodTDI; // TDI_Buffer[l]=MomAbsSumBuffer[l]-MomAbsSum2Buffer[l]; // } //---- done //---- return(0); } //+------------------------------------------------------------------+В таком виде компилятор ругается два раза. Надеюсь, получу благодарности, а не упреки в некомпетентности. :)))
Убери из этих строк int, и ругаться перестанет.
Убери из этих строк int, и ругаться перестанет.
Елки палки, я при копировании не заметил эти int. прошу прощения. :(