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

 
Ок, если не подскажут - помогите вечером разобраться.
 
Подскажите, пожалуйста, возможно ли использовать величину double, полученную в результате расчётов в качестве подставляемой величины int для дальнейших расчётов.
Пример:
   ATR_Din=iATR(NULL,PERIOD_M5,14,1);
   Din_Per210= MathRound(6000*ATR_Din+210);
   Din_Per5  = MathRound(6000*ATR_Din+5);
   
   MA210_DIN  =iMA(NULL,PERIOD_M5,Din_Per210,0,MODE_SMA,PRICE_CLOSE,1);
   MA5_DIN    =iMA(NULL,PERIOD_H1,Din_Per5,0,MODE_SMA,PRICE_CLOSE,1);
   
Здесь выделенные мною переменные имеют тип double, но в iMA используется их значение там, где необходима величина int (в качестве периода МАшки).
Вот и вопрос: корректно ли такое использование или необходимо какое-либо преобразование величин до типа int ?
 
Привет всем, подскажите пожалуйста если знаете, есть ли такой скрипт, который по каждому из результатов оптимизации прогонит тест эксперта с сохранением результата каждого тестирования в отдельный файл (отчет в  формате htm)
 
Craft:
Я не против, пример можно рабочий или ссылку?
давайте код или ставьте задачу, будем править
 
artmedia70:
Подскажите, пожалуйста, возможно ли использовать величину double, полученную в результате расчётов в качестве подставляемой величины int для дальнейших расчётов.
Пример:
Здесь выделенные мною переменные имеют тип double, но в iMA используется их значение там, где необходима величина int (в качестве периода МАшки).
Вот и вопрос: корректно ли такое использование или необходимо какое-либо преобразование величин до типа int ?
преобразование производится автоматически, просто обрезается дробная часть. Единственное ограничение для такого использования, которое я встречал - double нельзя ставить в индекс массива
 
alsu:
преобразование производится автоматически, просто обрезается дробная часть. Единственное ограничение для такого использования, которое я встречал - double нельзя ставить в индекс массива
Спасибо, это обнадёживает... :)
Ещё вопрос:
   MA200_DIN =iMA(NULL,PERIOD_M5,Din_Per200,0,MODE_SMA,PRICE_CLOSE,1);
   MA200_UP  =MA200_DIN+20*pt;
   MA200_DN  =MA200_DIN-20*pt;
   
   MA5_DIN  =iMA(NULL,PERIOD_H1,Din_Per5,0,MODE_SMA,PRICE_CLOSE,1);
   MA5_UP   =MA5_DIN+20*pt;
   MA5_DN   =MA5_DIN-20*pt;
Конструкции
MA200_UP=MA200_DIN+20*pt; 
MA200_DN=MA200_DIN-20*pt; и 
MA5_UP=MA5_DIN+20*pt; 
MA5_DN=MA5_DIN-20*pt;
не работают. При выводе их значений в чарт все они имеют одинаковые величины, например:
1.4118 для MA200_DIN, MA200_UP, MA200_DN и
1.4106 для MA5_DIN, MA5_UP, MA5_DN.
Получается, что формулы расчёта уровней +20 и -20 пунктов не работают.
Что я делаю не так?
 
а чему равен pt? попробуй вывести принтом с NormalizeDouble()
 
Всё, спасибо, разобрался... Я задал pt=Point; уже после расчёта значений...
Как говорил Матроскин: Шарик, ты - балбес... :)
 
alsu:
давайте код или ставьте задачу, будем править

В ВэлсЛаб аналог задачи выглядит, так:

MyATR = SMA.Series(((High-Low)/Low), PerB)[i-1] ;

if (BuyAtStop(i, (Open[i] + Open[i]*MyATR), "") ;

т. е. при открытии бара выставляется Стоп по которому при достижении заданного уровня открывается один раз позиция на покупку/продажу, где цена Открытия Open[i] текущего бара + триггер (эта же цена Открытия умноженная на MyATR вычисленный за период PerB по закрытым барам [i-1])

Этот для примера показываю на ВэлЛабе чего хочу получить на mql4.

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

        MyATR = ((High[0] - Low[0])/Low[0]);
	BT = Open[0] + Open[0]*iMAOnArray(MyATR ,0,PerB,0,MODE_SMA,1);
        ST = Open[0] - Open[0]*iMAOnArray((MyATR ,0,PerS,0,MODE_SMA,1);

   if (Ask >= BT)                       // Если разница между
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (Bid <= ST)                       // Если разница между
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }

Итог: Ордера сыплются гроздями, подскажите какое необходимо добавить условие (или изменить имеющееся), чтобы ордера исполнялись по заданному уровню один раз.

 

обратите внимание: в функцию iMAOnArray в качестве первого параметра надо подставлять массив - а у вас скаляр MyATR. Для того, чтобы вышло как надо, следует:

1. объявить double MyATR[];

2. задать ему размер ArrayResize(MyATR,PerB);

3. заполнить массив for(i=1;i<=PerB;i++) MyATR[i-1]=(High[i]-Low[i])/Low[i]; индекс i начинается с 1 так как нам нужны только закрытые бары

4. после этого можно считать iMAOnArray(MyATR,0,PerB,0,MODE_SMA,0); а здесь последний параметр равен 0, так как сдвиг га 1 уже учли в пункте 3.


проверьте, как получится, может ошибка только в этом

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