Ваши вопросы по языку MQL4

gzh

Интересующийся
Допустим получил я значения фракталов
double fractal_1 = iFractals(Symbol(),0,1,0);
double fractal_2 = iFractals(Symbol(),0,2,0);

А дальше что писать? как написать, если появился верхний фрактал, открыть селл, если нижний открыть Бай ??? Подскажите пожалуйста, а то я вообще не представляю как это написать.
 

ansol

Местный знаток
Нну, типа
PHP:
Expand Collapse Copy
double val=iFractals(NULL, 0, MODE_UPPER, 3); // верхний фрактал
if(val>0) продать
val=iFractals(NULL, 0, MODE_LOWER, 3); // нижний фрактал
if(val>0) купить
 
Последнее редактирование:

gzh

Интересующийся
Спасибо за помощь! Разобрался. Можно еще вопрос? Допустим появился сигнал,открылся Бай, при срабатывании SL или TP ордер закрывается и тут же открывается новый ордер.
Если не затруднит, подскажи пожалуйста, как сделать, чтобы если ордер закрылся, то новый ордер открывался только, когда появится новый фрактал ???
 

ansol

Местный знаток
Фрактал имеет значение High(или Low) на свече, так что можно его запомнить и сравнивать с новым - оно хоть на пипс, но будет отличаться. С открытием новой свечи опять же если и появится фрактал, то все равно другой - текущий у тебя с 3-й свечи "переедет" на четвертую относительно новой
 

hoz

Активный участник
Господа программисты, помогите пожалуйста с кодом, никак не получается. Я новичок в программировании, только учусь. Хочу написать простой советник по фракталам: появился нижний фрактал - Buy, появился верхний фрактал - Sell.
Подскажите, что не правильно, как правильно. Буду благодарен!!!

for (int i=0; i<OrdersTotal(); i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==1 && Close[2] < Close[3] && Close[1] > Close[2]) OrderClose(OrderTicket(),OrderLots(),Ask,0);

if (OrderType()==0 && Close[2] > Close[3] && Close[1] < Close[2]) OrderClose(OrderTicket(),OrderLots(),Bid,0); }


if (OrdersTotal()==0) {

if (Close[2] < Close[3] && Close[1] > Close[2]) OrderSend(Symbol(),0,lot,Ask,0,0,0);

if (Close[2] > Close[3] && Close[1] < Close[2]) OrderSend(Symbol(),1,lot,Bid,0,0,0); }


А теперь внимательно и по слогам прокомментируйте каждую строку...
 

hoz

Активный участник
Я тут продолжаю капать библиотеки _http://codebase.mql4.com/ru/8518
Появился интерес к странному и сложноватому способу (у меня реализация данной функции на порядок проще и удобнее...). Так вот смотря функцию:

PHP:
Expand Collapse Copy
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:   Сортируем индексы массива по убыванию                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fRun_Sort (int& ar_INDEX[],     // массив индексов для сортировки
                double fda_Value[])  // массив значений
{
    int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value);
//----
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {ar_INDEX[li_IND] = li_IND;}
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {
		  for (li_int = li_IND + 1; li_int < li_size; li_int++)
		  {
			   if (fda_Value[ar_INDEX[li_IND]] < fda_Value[ar_INDEX[li_int]])
			   {
				    li_tmp = ar_INDEX[li_int]; 
				    ar_INDEX[li_int] = ar_INDEX[li_IND]; 
				    ar_INDEX[li_IND] = li_tmp;
			   }
		  }
	 }
//----
    return;
}


Поясните, зачем вложенный цикл тут? вообще что происходит по порядку в данной функции.. Интересно, лишь понять логику автора.. Так для общего..
Для меня этот код не особо читабельный.
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Я тут продолжаю капать библиотеки _http://codebase.mql4.com/ru/8518
Появился интерес к странному и сложноватому способу (у меня реализация данной функции на порядок проще и удобнее...). Так вот смотря функцию:

PHP:
Expand Collapse Copy
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:   Сортируем индексы массива по убыванию                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fRun_Sort (int& ar_INDEX[],     // массив индексов для сортировки
                double fda_Value[])  // массив значений
{
    int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value);
//----
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {ar_INDEX[li_IND] = li_IND;}
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {
		  for (li_int = li_IND + 1; li_int < li_size; li_int++)
		  {
			   if (fda_Value[ar_INDEX[li_IND]] < fda_Value[ar_INDEX[li_int]])
			   {
				    li_tmp = ar_INDEX[li_int]; 
				    ar_INDEX[li_int] = ar_INDEX[li_IND]; 
				    ar_INDEX[li_IND] = li_tmp;
			   }
		  }
	 }
//----
    return;
}


Поясните, зачем вложенный цикл тут? вообще что происходит по порядку в данной функции.. Интересно, лишь понять логику автора.. Так для общего..
Для меня этот код не особо читабельный.
Здесь происходит сортировка индексов массива по простейшему алгоритму, известному как "пузырьковая сортировка". Я вики переписывать не буду, погугли алгоритмы сортировки, а если ты умеешь делать это еще проще, хвала тебе.
 
Последнее редактирование модератором:
  • Like
Реакции: hoz

hoz

Активный участник
Здесь происходит сортировка индексов массива по простейшему алгоритму, известному как "пузырьковая сортировка". Я вики переписывать не буду, погугли алгоритмы сортировки, а если ты умеешь делать это еще проще, хвала тебе.


Очень интересно.. Так получается что вложенные циклы перебираются как? Поочерёдно или одновременно? Имею ввиду, в первом цикле берётся значение переменной, дальше сразу на вложенный - берётся значение... и тд? потом происходит выполнение условия?
Или всё-таки, берётся первый индекс в первом цикле, и дальше сразу по второму циклу прогоняется весь просчёт, выполняются условия и.. берётся второй индекс первого цикла, прогоняется второй цикл по переменной полученной с первого цикла и выполняются условия. И тд и тп, я правильно понимаю?
С такими вложенными циклами не работал раньше, смотрю.. Мозг не очень чётко понимает данную ситуацию, хотя теоритически я понял всё прекрасно.
 

qqmber

Почетный гражданин
Очень интересно.. Так получается что вложенные циклы перебираются как? Поочерёдно или одновременно? Имею ввиду, в первом цикле берётся значение переменной, дальше сразу на вложенный - берётся значение... и тд? потом происходит выполнение условия?
Или всё-таки, берётся первый индекс в первом цикле, и дальше сразу по второму циклу прогоняется весь просчёт, выполняются условия и.. берётся второй индекс первого цикла, прогоняется второй цикл по переменной полученной с первого цикла и выполняются условия. И тд и тп, я правильно понимаю?
С такими вложенными циклами не работал раньше, смотрю.. Мозг не очень чётко понимает данную ситуацию, хотя теоритически я понял всё прекрасно.
На примере может стать понятнее.
Если в массиве 5 элементов, то перебор пойдет так
Код:
Expand Collapse Copy
Внешний цикл   Внутренний цикл
0                     1 2 3 4
1                     2 3 4
2                     3 4 
3                     4
4                     -
Внутренний цикл вертится от текущего индекса внешнего цикла (не включая его) до конца массива.
 

ansol

Местный знаток
Если в массиве 5 элементов, то перебор пойдет так
Код:
Внешний цикл Внутренний цикл
0 1 2 3 4
1 2 3 4
2 3 4
3 4
4 -


Внутренний цикл вертится от текущего индекса внешнего цикла (не включая его) до конца массива.
Т.е. если:
PHP:
Expand Collapse Copy
li_IND=2;
for (li_IND = 0; li_IND < li_size; li_IND++)
    {...
то перебор нчнется не с нуля, а с 2?
Ой-ёй-ёй! :)
 

ansol

Местный знаток
Что-то я мысль твою не уловил
Внутренний цикл, как, впрочем, и внешний начинается с нуля, как у него в параметрах и записано, без вариантов:
PHP:
Expand Collapse Copy
for (li_IND = 0;
Значит ноль и погнали дальше! :)
 

qqmber

Почетный гражданин
Внутренний цикл, как, впрочем, и внешний начинается с нуля, как у него в параметрах и записано, без вариантов:
PHP:
Expand Collapse Copy
for (li_IND = 0;
Значит ноль и погнали дальше! :)
Издеваешься?

Код:
Expand Collapse Copy
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:   Сортируем индексы массива по убыванию                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fRun_Sort (int& ar_INDEX[],     // массив индексов для сортировки
                double fda_Value[])  // массив значений
{
    int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value);
//----
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {ar_INDEX[li_IND] = li_IND;}
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {
          for ([COLOR="Red"]li_int = li_IND + 1;[/COLOR] li_int < li_size; li_int++)
          {
               if (fda_Value[ar_INDEX[li_IND]] < fda_Value[ar_INDEX[li_int]])
               {
                    li_tmp = ar_INDEX[li_int]; 
                    ar_INDEX[li_int] = ar_INDEX[li_IND]; 
                    ar_INDEX[li_IND] = li_tmp;
               }
          }
     }
//----
    return;
}
 

ansol

Местный знаток
Хм. Я думал, что вы первые два дурацких цикла обсуждаете, с третьим и так все ясно, я его и не смотрел.
Извиняюсь, что влез, типа "тады ой!" :)
 

hoz

Активный участник
На примере может стать понятнее.
Если в массиве 5 элементов, то перебор пойдет так
Код:
Expand Collapse Copy
Внешний цикл   Внутренний цикл
0              1 2 3 4
1              2 3 4
2              3 4 
3              4
4              -
Внутренний цикл вертится от текущего индекса внешнего цикла (не включая его) до конца массива.


Интересно 2 последних случая.
1. Внешний цикл на 3 индексе. У внутреннего цикла остался один индекс. Сравнивать уже не с чем, значит ничего не делаем?
2. Внешний цикл на 4 индексе. У внутреннего цикла нечего перебирать. Значит опять ничего не делаем.. Так?
 

ansol

Местный знаток
Либо сравнивать есть с чем, либо индекс больше, чем задано и цикл не выполняется, посмотрите - там нет индекса больше, чем размер массива.
 

qqmber

Почетный гражданин
Интересно 2 последних случая.
1. Внешний цикл на 3 индексе. У внутреннего цикла остался один индекс. Сравнивать уже не с чем, значит ничего не делаем?
2. Внешний цикл на 4 индексе. У внутреннего цикла нечего перебирать. Значит опять ничего не делаем.. Так?

1. Сравниваем индекс внешнего цикла (3) с индексом внутреннего (4) и меняем элементы местами, если порядок не тот.
2. Ничего не делаем.
 

hoz

Активный участник
Либо сравнивать есть с чем, либо индекс больше, чем задано и цикл не выполняется, посмотрите - там нет индекса больше, чем размер массива.


Ну так да, цикл то до сайза массива. Сложновато это чутка воспринять, тем более в том коде, где стиль своеобразный, в плане оформления кода. Но я уже по ходу понял. Ещё немного помудохаюсь, помедетирую на этот :laugh: код и совсем дойду..
 
Верх