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

 
Code:


ОК, попробуем по другому посмотреть.

vteor12 можно записать как (dVolume+vback1)/к1 (коэффициент 1)

vrealUP12 можно записать как (dVolume+vback1)/к2 (коэффициент 2)

Как я уже пытался расписать идеологию индикатора, она состоит в сравнении некоего теоретического и фактического уровней. Для получения этих уровней я одну и ту же величину (dVolume+vback1) сравниваю (т.е. делю) с некоей теоретической величиной (к1) и фактической (к2). Понято, что к1 я просто придумываю, если уж называть вещи своими именами. Или, если хотите, делаю допущение. Теперь это надо с чем-то сравнить. Ничего более объективного и истинного, чем сам график в этом деле не существует. Поэтому я беру разницу открытия и закрытия, воспринимая их как итоговый результат данного промежутка времени. И здесь только одна задача - привести к одинаковой разрядности, именно поэтому умножается на 1000.

Попробуйте на калькуляторе обсчитать несколько разных вариантов соседних свечей и Вы, возможно, удивитесь многообразию результатов по этой очень даже простой формуле.

А с точки зрения школьной логики Вы правы. Я складываю Объем + Объем/Цена, так в школе делать нельзя. :))

Я пас... :)))

У Вас ведь изначально какая-то проблема была в отображении индикатора? Вы с ней разобрались?

 
MaxZ:

Я пас... :)))

У Вас ведь изначально какая-то проблема была в отображении индикатора? Вы с ней разобрались?


Да, кстати, разобрался сам. Не учел, что рисуется линия, а не гистограмма. А для линии надо 2 точки. Поскольку код не описывает все варианты, а лишь 2 растущих свечи подряд, то в случае, если после второй растущей свечи появлялась свеча вниз, индюк ничего  не рисовал. И правильно делал. Я когда это сообразил, переделал на гистограмму, там все рисуется.

Вы, кстати, не принимайте близко к сердцу мои рассуждения о правилах сложения и вычитания, считайте, что эксперимент. :)))

И буду очень признателен, если поможете продолжить код. Это самое начало было. После двух растущих свечей подряд хотелось бы посчитать по такому же принципу 3, 4 и т.д. растущих свечи. Видимо, тут через цикл надо, с перебором свечей, так? А это мне пока совсем не по силам. Вы только не зацикливайтесь на том, что на что поделилось. :))) 

 

Перенесено

Здравствуйте. Наконец то я написал своего первого эксперта! Только вот не совсем понимаю как он работает. Эксперт устанавливает 2 отложенных ордера при выполнении определенных условий. При этом стоп лосс для обоих ордеров равен High[1] (Low[1]) для отложенного на продажу(покупку), а тейк профит всегда равен по пунктам стоп лоссу. В тесторе стратегий я заметил, что профит не всегда равен стопу по пунктам, причем.Подскажите пожалуйста как так получается. Вот тот код где происходит вычисление стоп приказов(больше в программе не где стопы не изменяются)

//-2-анализ на установку buystop---------------------------------------------------------------------------------+
  if(Close[1]>=MA_17 && MA_3<=MA_17)
   {
    deposit_order=true;
    type_order =4;
    open_price =High[1];
    stop_loss  =Low[1];
    take_profit=NormalizeDouble(MathAbs(2*open_price-stop_loss),Digits);
    if(Lot==0) Lot=MarketInfo(symb,MODE_MINLOT);
   }
 //-3-анализ на установку sellstop-------------------------------------------------------------------------------+  
  if(Close[1]<=MA_17 && MA_3>=MA_17)
    {
     deposit_order=true;
     type_order   =5;
     open_price   =Low[1];
     stop_loss    =High[1];
     take_profit  =NormalizeDouble(MathAbs(2*open_price-stop_loss),Digits);
     if(Lot==0)Lot=MarketInfo(symb,MODE_MINLOT);
    }

 
nadya:
добрый день! скажите, пожалуйста, можно ли внутри функции присвоить значение нескольким глобальным переменным, и где в таком случае эти переменные надо объявить?

Можно.

Переменные объявляйте на глобальном уровне - перед ф-цией start(). Внутри функций советника меняйте их значения как вам угодно - после возврата из функции эти переменные будут иметь значения, которые вы присвоили им внутри своих функций до тех пор, пока опять их где-либо не поменяете.

 
nadya:
добрый день! скажите, пожалуйста, можно ли внутри функции присвоить значение нескольким глобальным переменным, и где в таком случае эти переменные надо объявить?

Пример. Внутри функции myfunction присваиваем значение двум глобальным переменным. Так можно присвоить значение и трём, и четырём, и n-ому количеству переменных.

int global1 = 1;
int global2 = 2;

void myfunction(int g1, int g2)
{
   global1 = g1;
   global2 = g2;
}

int start()
{
   // До выполнения функции:     global1=1, global2=2   <---  то что объявили в начале кода
   
   myfunction(3, 4);
   
   // После выполнения функции:  global1=3, global2=4   <---  то что присвоили в функции
}

Но Мне кажется в Вашем вопросе есть какая-то загвоздка...

 
Code:


Да, кстати, разобрался сам. Не учел, что рисуется линия, а не гистограмма. А для линии надо 2 точки. Поскольку код не описывает все варианты, а лишь 2 растущих свечи подряд, то в случае, если после второй растущей свечи появлялась свеча вниз, индюк ничего не рисовал. И правильно делал. Я когда это сообразил, переделал на гистограмму, там все рисуется.

Вы, кстати, не принимайте близко к сердцу мои рассуждения о правилах сложения и вычитания, считайте, что эксперимент. :)))

И буду очень признателен, если поможете продолжить код. Это самое начало было. После двух растущих свечей подряд хотелось бы посчитать по такому же принципу 3, 4 и т.д. растущих свечи. Видимо, тут через цикл надо, с перебором свечей, так? А это мне пока совсем не по силам. Вы только не зацикливайтесь на том, что на что поделилось. :)))

Да. Но лучше всего будет использовать для решения данной задачи цикл с пост предусловием "while", а не цикл со счётчиком "for". Так как неизвестно сколько Вы встретите бычьих или медвежих свечей подряд.

Начните с более простой задачи, если эта задача кажется Вам такой сложной. Например, вывод на экран чисел от a до b с шагом s. Или найти с помощью цикла факториал числа n.

А для закрепления материала решите эти задачи с помощью обоих типов цикла ("for" и "while"). Затем можете приступать к доработке Своего индикатора.

 

Циклов с пост-while в языке нет, MaxZ.

Ваше желание помогать другим похвально, но для этого все же нужно самому лучше знать язык.

 
Mathemat:
Циклов с пост-while в языке нет.

Если организовать цикл следующим образом, то получится как раз с постусловием:

int i = 0;
while (True)
{
   i++;
   if (i == 10) break;
}

Но Вашу поправку Я принимаю. Спасибо. Так как в языке MQL4 и правда два типа циклов: "for" (с счётчиком) и "while" (с предусловием). Третий тип (с постусловием) можно организовать лишь умышленно получается.


Mathemat:

Ваше желание помогать другим похвально, но для этого все же нужно самому лучше знать язык.

Чего Я не знаю, туда Я не лезу...

А все остальные ошибки были сделаны по неосторожности. Рассеянный Я какой-то последнее время... А помочь Людям хочется.

 

MaxZ: Единственная проблема состоит в том, что если советник с данным кодом запустить в тестере, а переменной PERIOD присвоить значение PERIOD_M1, то обе функции iBarShift возвращают -1, т.е. функции не удалось найти в истории бар на ТФ M1 с таким временем... Почему так происходит, не знаю.

Скорее всего, эта функция в тестере не моделируется (не проверял). Тем более что exact (четвертый параметр функции) по умолчанию установлен в false.
 
Mathemat:
Скорее всего, эта функция в тестере не моделируется (не проверял). Тем более что exact (четвертый параметр функции) по умолчанию установлен в false.
Я уже разобрался... Проблема была с историей. История баров M1 по тестируемому периоду отсутствовала.
Причина обращения: