[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 662

 
drknn:


Корректна, так как в первый параметр возвращает число, а второй - целочисленная величина в допустимых пределах. Вопрос весь в том, что именно ляжет в переменную. Попробуйте принтануть как есть и попробуйте вот такую конструкцию:

Интересно получается... Сделал так:

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =NormalizeDouble(iAC(sy,tf,1),8),
   AC2   =NormalizeDouble(iAC(sy,tf,2),8),
   AC3   =NormalizeDouble(iAC(sy,tf,3),8);
   
   Comment("\n","AC1 = ",AC1," AC2=",AC2);
   string str1=AC1;
   Print("str1 = ",str1);
   string str2=AC2;
   Print("str2 = ",str2);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}
При этом Comment на экран выводит

АС1 = 0.001 АС2 = 0.001,

В окне данных АС1 = 0.001008, АС2 = 0.001020,

а в журнале пишется (последние два значения):

0.00100029
0.00100771

 
IgorM:

никак не соображу как найти экстремумы функции

есть у меня массив данных который хранит значения:

как найти переломы - экстремумы используя массив данных из 250 элементов и сохранить только номера элементов где находятся эти экстремумы


Ребят, что то у вас все сложно получилось :)
Можно же простой метод набросать:

//+------------------------------------------------------------------+
void searchExtremums(double base[], double &find[]){
   int step = 1;
   for(int loop = 0; loop < ArraySize(base)-2; loop++){
      if((base[loop] > base[loop+1] && base[loop+1] < base[loop+2]) || (base[loop] < base[loop+1] && base[loop+1] > base[loop+2])){
         ArrayResize(find, step);
         find[step - 1] = base[loop+1];
         step++;
      }
   }   
}
//+------------------------------------------------------------------+

 Передаете массив, в котором нужно найти экстремумы (base), и массив в который нужно их записать (find), пример вызова для массива Владимира:

double res[];
searchExtremum(my_array, res);

И показываем результат:

for(int s = 0; s < ArraySize(res); s++)Alert(res[s])
Так вроде по проще будет :)
 
ToLik_SRGV:


  Так вроде по проще будет :)


ОК постараюсь проверить сегодня, тока может и проще, но у меня в голове не укладываются комбинации

 void searchExtremums(double base[], double &find[]){

проверять мне надо теперь вот такие функции

 

 
IgorM:

ОК постараюсь проверить сегодня, тока может и проще, но у меня в голове не укладываются комбинации

 void searchExtremums(double base[], double &find[]){

проверять мне надо теперь вот такие функции

Игорь, я про эту запись уже писал в этой ветке :)))

При передаче переменной в функцию, через её параметр, переменная передается по значению, это значит изменения переменной в самой функции не приведет к ее перезаписи.
Попробуй передать по ссылке, для этого вставь перед именем параметра символ «&» 

void simple(string &s){
//                 ^
//       спец сим. & перед именем переменной задает передачу по ссылке, а не по значению
//
}
 
Mathemat:

Пост Volfram'a удален за размножение в нескольких ветках.

Volfram, Вы создали специально для этой цели свою ветку. Вам уже ответили; этого недостаточно?

P.S. Скажу Вам по секрету, Volfram: отсутствие явного интереса к Вашей идее неявно свидетельствует о том, что эта идея не заслуживает внимания. Соответственно и не нашлось желающих реализовывать ее "забисплатно".

Вы же отменили опцию уведомлений на емайл..

Как без этого вообще можно узнать где ответили, а где нет?? Когда вы вернете эту опцию?

 
artmedia70:

Интересно получается... Сделал так:

При этом Comment на экран выводит

АС1 = 0.001 АС2 = 0.001,

В окне данных АС1 = 0.001008, АС2 = 0.001020,

а в журнале пишется (последние два значения):

0.00100029
0.00100771


Ну это уже наверно к разработчикам ;)
 
artmedia70:

Интересно получается... Сделал так:

При этом Comment на экран выводит

АС1 = 0.001 АС2 = 0.001,

В окне данных АС1 = 0.001008, АС2 = 0.001020,

а в журнале пишется (последние два значения):

0.00100029
0.00100771

Я тоже попробовал, все вроде норм, в комменте:
АС = -0,0004, в журнале -0,00035586
АС2 = -0,0007, в журанле -0,00068589
 
ToLik_SRGV:
Я тоже попробовал, все вроде норм, в комменте:
АС = -0,0004, в журнале -0,00035586
АС2 = -0,0007, в журанле -0,00068589

Похоже, Comment() внутри себя округляет значения... А как удобно порою видеть их тут же на экране при визуальном тестировании... Однако, не точно-с... :)

Да, и, кстати, тут на форуме по нормализации почитал так с пару-тройку часиков до 7.30 утра...
Нормализацию нужно проводить как можно ближе к операции сравнения... Посему, думаю, стоит мне поменять кой-чего в некоторых ф-циях и кодах... А там тест покажет разницу...

 
artmedia70:

Похоже, Comment() внутри себя округляет значения... А как удобно порою видеть их тут же на экране при визуальном тестировании... Однако, не точно-с... :)

Мне из-за подобных округлений при написании функции управления лотами пришлось сделать dll-библиотеку на Delphi, ибо нужная мне задача средствами MQL4 была вообще не решаема...
 

Здравствуйте! Поясните пожалуйста мне, супер чайнику в MQL4, как правильно поступить. Пишу первый советник. Устанавливается ордер SellStop и после того, как он срабатывает то устанавливается BuyStop. Я думаю, что нужно использовать OrdeCloseTime. Я перепробовал много вариантов но советник видит ордер только когда OrdeCloseTime==0. После закрытия SellStop снова открывается SellStop. Предоставляю код. В этом варианте SellStop и BuyStop открываются одновременно. Помогите пожалуйста. Заранее благодарен.

int I = 0;

int start()

{

if (I < 1)

{

ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,OP_SS,Slippage,SL,CP_SS);

if (ticket>0)

{ Alert("OrderSend"," ",ticket); } else { Alert("!OrderSend"," ",GetLastError()); }

//--------------------------------------------------------------------------

if (OrderSelect(ticket,SELECT_BY_TICKET)==true)

{ Alert("OrderSelect"," ",ticket); } else { Alert("!OrderSelect"," ",GetLastError()); }

//--------------------------------------------------------------------------

OrderSend(Symbol(),OP_BUYSTOP,Lot,OP_BS,Slippage,SL,CP_BS);

}

I=1;

}

return (0);

//--------------------------------------------------------------------------

Причина обращения: