[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 125

 
pyatka__ASD:
Подскажите, у кого-нибудь есть кусок программы, в котором есть соединение high и low вершин зиг-зага. Спасибо

Не знаю какое соединение вам нужно, но... так я в советнике определяю какой экстремум ЗЗ есть в наличии - нижний или верхний, надеюсь найдёте то, что вам нужно:

//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_BUY)
      {
         for (m=1; m<=CalcBarsLimit; m++)                      // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!=0 &&                                    // Если первый экстремум верхний
                  NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 1, m), dg))
                     return(false);                            // Валим отсюда
               else if (zz!=0 &&                               // Если первый экстремум нижний
                        NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 2, m), dg)) 
                  {
                     if (MathRound((KLevel-zz)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound((KLevel-zz)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[1]<KLevel && 
                               Close[1]>KLevel &&
                               pa>KLevel)
                              {
                                 Fibo0_PriceB=zz;                                   // Сохраним цену излома ZZ
                                 Fibo23_PriceB=pa;                                  // Сохраним цену 23 фибы
                     
                                 nmKLB=DoubleToStr(Time[m], 4);                     // имя метки
                                 SetArrow(5, DeepSkyBlue, nmKLB, Time[m], zz, 1);   // Отмечаем излом ЗЗ на графике
                                 return(true);
                              }
                        }       
                  }
            }
      }
//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_SELL)
      {
         for (m=1; m<=CalcBarsLimit; m++)                      // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!=0 &&                                    // Если первый экстремум нижний
                  NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 2, m), dg))
                     return(false);                            // Валим отсюда
               else if (zz!=0 &&                               // Если первый экстремум верхний
                        NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 1, m), dg)) 
                  {
                     if (MathRound((zz-KLevel)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound((zz-KLevel)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[1]>KLevel && 
                               Close[1]<KLevel &&
                               pb<KLevel)
                              {
                                 Fibo0_PriceS=zz;                                // Сохраним цену излома ZZ
                                 Fibo23_PriceS=pb;                               // Сохраним цену 23 фибы
                     
                                 nmKLS=DoubleToStr(Time[m], 4);                  // имя метки
                                 SetArrow(5, BurlyWood, nmKLS, Time[m], zz, 1);  // Отмечаем излом ЗЗ на графике
                                 return(true);
                              }
                        }       
                  }
            }
      }

   return(false);
}
//-------------------------------------------------------------------------------

ЗЫ... Код черновой и неоптимизированный. Надеюсь, знаете, что лучше вычитать два нормализованных значения и проверять результат на ноль...

 
alsu:

Можно. Возвращайте в параметры.

это как? если переменная объявлена внутри start то можно присвоить ей значение return_value1?
 
eddy:
это как? если переменная объявлена внутри start то можно присвоить ей значение return_value1?

Да. Это называется передача параметра по ссылке. При обычном объявлении функции ее вызов приводит к тому, что все переменные, переданные как формальные параметры, копируются в локальные переменные функции, и с ними ведется работа. При передаче по ссылке копирования не происходит, т.е. функция работает не с копиями параметров, а с их оригиналами. Соответственно, все изменения, сделанные в коде функции с данными параметрами, остаются в силе после возврата из кода функции.

Для передачи параметра по ссылке необходимо при объявлении функции обозначить этот способ, поставив перед идентификатором нужного параметра значок &.

 

Пример (откомпилируйте как скрипт и проверьте)

void Func1(double a)
{
   a=a*2;
}

void Func2(double &a)
{
   a=a*2;
}

int start()
{
   double a=5;

   Func1(a);
   
   Print(a); //выведет 5

   Func2(a);
   
   Print(a); //выведет 10
}
 
eddy:
5*5=5?))
умножается не на 5, а на 2. В первом случае параметр а передан "по значению", и его содержимое не сохраняется после выхода из функции, во втором - по ссылке (double &a), поэтому измененное значение, т.е. 5*2=10 будет содержаться в переменной a после выхода из функции Func2.
 

крутокруто:)

а если так?

double a=5;

   Print(Func2(a));
 
eddy:


а если так?

это будет десять. Быстрее, кстати, проверить, чем спрашивать)))
 

Компьютер занят расчетами, поэтому сам сейчас проверить не могу.

Есть вот такой кусок кода:

   if(DecreaseFactor>0){
      for(int cnt=OrdersHistoryTotal()-1; cnt>=0; cnt--){
        if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY)){ 
          if(OrderMagicNumber()==Magic){
            if(OrderSymbol()==Symbol()){
              if(OrderType()<2){ 
                  if(OrderProfit()>0) break;
                  if(OrderProfit()<0) losses++;
       } } } } } 
      if(losses>1) Lot=NormalizeDouble(Lot-Lot*losses/DecreaseFactor,1);
    }

Через Гугл нашел несколько повторений этого кода, следовательно, прихожу к заключению, что код рабочий.

Тем не менее, строчка

Lot=NormalizeDouble(Lot-Lot*losses/DecreaseFactor,1);

смущает.

Если DecreaseFactor=3 и losses=3, то, согласно формуле, мы получаем Lot=0 !!!

В случае если losses>3, то мы получаем Lot<0 !!!

Возможно ли такое?

 
ну а что такое losses и DecreaseFactor то?
 
eddy:

крутокруто:)

а если так?

так ничего не будет. Функция Funk2 - не возвращает никакого значения. она void