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

 
alsu:

Нет, с того, которое переменая i имела до цикла. Запись

идентична

   int cnt,i;
for (cnt = 0, i = index + g_center - 1; i >= 0 && cnt < g_center; i--) 

    

 Вот теперь я понял. Благодарствую. А то смотрел смотрел.. не было точки отсчёта. Теперь 0 нарисовался..


 Хм. Ну, например, index передаётся значением 1. Смотрим в этот кусок кода:

 

 int cnt = 0, i = index + g_center - 1;
   for (; i >= 0 && cnt < g_center; i--)           // Справа от центрального бара должно
   {                                               // ..быть g_center-1 баров с большим..
      if (centerLow >= Low[i])                     // ..минимумом. Не позволяется..
         return (false);                           // ..наличие баров с меньшим или..
      cnt++;                                       // .. равным минимумом
   }
   

сразу по приходу будет так: cnt = 0, i = index + g_center - 1 = 1(значение index) + 2(значение g_center) - 1 = 2

Но согласно условию цикла он будет продолжаться до тех пор пока i не будет равно 0. Как это произойдёт?

Условие получается, что если i имеет значение от 2(если index = 1), до i >= 0 и cnt имеет от 0, до cnt < g_center ,то вложенные условия выполняются.

Получается если переменная здесь 1, то у нас будет только 1 итерация в цикле, так?

 
alsu:

Раскройте понятие "ограничен 0 баром"
Другими словами надо нарисовать линию( не луч ) через 2 фрактала, но чтобы заканчивалась на 0 баре
 
beginner:
Другими словами надо нарисовать линию( не луч ) через 2 фрактала, но чтобы заканчивалась на 0 баре


Алгоритм таков:

1. Пусть координаты фракталов (i1; p1) и (i2; p2), причем i1<i2 (т.е. 1-й фрактал ближе к 0 бару, чем 2-й)

2. Уравнение прямой, проходящей через эти фракталы p = (p1-p2)/(i1-i2) * i + (p2*i1 - p1*i2)/(i1-i2)

3. Следовательно, нам необходимо нарисовать отрезок со следующими координатами концов: (0; (p2*i1 - p1*i2)/(i1-i2)) и (i2;p2)

4. ObjectCreate(...)

5. ???

6. Profit!!!

 
Vinin:

Должно срабатывать на первом тике новых суток. 

Благодарю за отклик! Правда, никогда не срабатывало, пока я не вставил в начале старта индикатора

if(Hour() == 0 && Minute() == 0 && Seconds() == 0) { DeleteObject() и т.д.

}

 if(Hour() >= 0 && Minute() >= 0 && Seconds() >= 1) { код индикатора ...

 Недавно и с этим не срабатывает! Что делать не знаю. Что можете посветовать? Спасибо!

Только сейчас смог написать, в субботу подрабатываю на жизнь.

 
hoz:


 Да Борис, очень, кстати, подошёл! Благодарю Вас. Я этого и хотел. Крутил.. вертел.. да не докрутил видать. Опыта ещё не много, и мозг не так мыслить как у профи. Бывают затупы на ровном месте.. :(

 Не хотел сразу спрашивать, но всё же пришлось. Т.к. не вышло у самого сократить. 

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

 Вот теперь я понял. Благодарствую. А то смотрел смотрел.. не было точки отсчёта. Теперь 0 нарисовался..


 Хм. Ну, например, index передаётся значением 1. Смотрим в этот кусок кода:

 

сразу по приходу будет так: cnt = 0, i = index + g_center - 1 = 1(значение index) + 2(значение g_center) - 1 = 2

Но согласно условию цикла он будет продолжаться до тех пор пока i не будет равно 0. Как это произойдёт?

Условие получается, что если i имеет значение от 2(если index = 1), до i >= 0 и cnt имеет от 0, до cnt < g_center ,то вложенные условия выполняются.

Получается если переменная здесь 1, то у нас будет только 1 итерация в цикле, так?


Цикл заканчивается, когда перестает выполняться условие, написанное на втором месте в операторе for(), то есть в данном случае - когда либо i станет меньше 0, либо когда cnt станет больше или равно g_center. Обе переменные имеют начальные значения, присвоенные перед циклом, и изменяются в ходе его исполнения: переменная i в результате i-- (третья часть оператора for, она выполняется каждый раз когда цикл доходит до закрывающей скобки }), а переменная cnt - в результате cnt++.
 

Хай.

Пытаюсь экспортировать в хтмл стэйт своей торговли с демо-счета. (альпари, билд последний). Жму сохранить как отчет, открывается окно выбора папки, жму кнопку сохранить, ничего не происходит. Это у всех так на демо? Еще один момент, мой МТ4 на рабочем столе установлен. Это имеет значение?

 
borilunad:
Кто знает, можно ли, сделав Hour(), Minute() и Seconds() глобальными переменными, контролировать в полночь (0.00) смену в индикаторе DailyPivotPoints на новые уровни РР и др. линии из советника? Я раньше сделал прямо в индикаторе с Hour(), Minute(), Seconds(), и работало без необходимости каждую ночь компилировать. А недавно перестало само меняться, может, от смены бильда? Спасибо!


:) А почему бы как функцию нового бара не реализовать данный момент? Вам нужно чтоб раз сутки, т.е. начиная с 0.00 времени чтоб индюк делал перерасчёт. Значит делаем просто. В старте есс-но:

if (lastBarTime == время с ТФ Д1)
    return(0);
// что-то тут ещё
// что-то тут ещё
// что-то тут ещё
if (lastBarTime != время с ТФ Д1)
{
    пересчитывает уровни пивотов...
    lastBarTime = время с ТФ Д1;
}
По-моему это самый верный путь хоть и примитивен!
 
alsu:

Цикл заканчивается, когда перестает выполняться условие, написанное на втором месте в операторе for(), то есть в данном случае - когда либо i станет меньше 0, либо когда cnt станет больше или равно g_center.  


 Тока не либо а И. Там же знак && 

 Я всё понимаю. Но тут смысл в том, что:

bool IsUpFractal(int index)
{
   double centerHigh = High[index + g_center];     // За точку отсчета берется средний..
                                                   // ..бар на участке из i_fractalPeriod
                                                   // ..баров
// - 1 - == Поиск максимумов справа от центрального бара ================================
   int cnt = 0, i = index + g_center - 1;
   for (; i >= 0 && cnt < g_center; i--)           // Справа от центрального бара должно
   {                                               // ..быть g_center-1 баров с низшим..
      if (centerHigh <= High[i])                   // ..максимумом. Не позволяется..
         return (false);                           // ..наличие баров с большим или..
      cnt++;                                       // ..равным максимумом.
   }
   
   if (i < 0)                                      // g_center-1 низших максимумов не..
      return (false);                              // ..найдено. Фрактала нет
// - 1 - == Окончание блока =============================================================

Переменная index  вообще по коду имеет значение Bar - IndicatorCounted()

Т.е. на текущем баре равно 1, а на новом 2

 Входит в функцию IsUpFractal() значение либо по очередно, либо 1 если бар не новый ещё, так?

Значится,  переменная i будет иметь фиксированное значение т.к. входной параметр index тоже фиксированный. Значит цикл будет всегда прерываться после первой итерации. Зачем тогда цикл?

 

Подскажите, пожалуйста, почему показывает неправду..

double IN[111];
double PERI=33;
double KRIT;
int z;      
ArraySetAsSeries(IN,true);

   for(z=0; z<=PERI; z++)  {
IN[z]=     iClose(Symbol1.Name,0,iBarShift(Symbol1.Name,0,Time[z],false)); }

   for(z=0; z<=PERI; z++)  {
KRIT=IN[z]-iMAOnArray(IN,0,PERI,0,MODE_SMA,iBarShift(IN,0,Time[z],false)); }

Print(KRIT);
return;