Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2674

 
Maxim Kuznetsov #:

ещё спроси зачем он вообще нужен, когда во всех прочих местах вполне обходятся без лишней формы

Ну зачем грубить сарказмом? Вопрос-то актуален. Посмотри:

if(){
        for(){
                if(){
                        if(){
                                for(){
                                }
                        }
                        if(){
                                for(){
                                }
                        }
                }
        }
}

Приятно код уехал? А если вот так то же самое?

По-моему разница очевидна. Во втором случае вложенность отслеживается в разы проще.

P.S.

В редакторе кода табуляция по умолчанию равна 3 пробелам. В блоке вставки кода сайта она = 8 пробелов. Чем это обусловлено?

 

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

for(int i=limit;i>=0;i--){
                // обнуляем данные во избежание хранения значений предыдущего тика
                i_Ind_IndexUpRight=0;i_Ind_IndexUpLeft=0;i_Ind_IndexDownRight=0;i_Ind_IndexDownLeft=0;
                LeftOtrezok=0; RightOtrezok=0; TimeUpLeft=0; TimeDownLeft=0; TimeUpRight=0; TimeDownRight=0;
                // ================ Селл-сигнал =========================================================
                if(DrawSellSignal && OBV_Buffer[i+1]>OBV_Buffer[i+2] && OBV_Buffer[i+2]<OBV_Buffer[i+3]){
                        i_Ind_IndexUpRight=i+1;
                        i_Ind_IndexUpLeft=LastPeak(i_Ind_IndexUpRight);
                        i_Ind_IndexDownRight=i+2;
                        i_Ind_IndexDownLeft=LastVpadina(i_Ind_IndexDownRight);
                        if(i_Ind_IndexUpRight>0 && i_Ind_IndexUpLeft>0 && i_Ind_IndexDownRight>0 && i_Ind_IndexDownLeft>0){
                                LeftOtrezok=Rasst(OBV_Buffer[i_Ind_IndexUpLeft],OBV_Buffer[i_Ind_IndexDownLeft]);
                                RightOtrezok=Rasst(OBV_Buffer[i_Ind_IndexUpRight],OBV_Buffer[i_Ind_IndexDownRight]);
                                if(LeftOtrezok>0 && RightOtrezok>0 && LeftOtrezok>RightOtrezok){
                                        // --------- Если левый пик между впадинами ----------------------------------------
                                        if(i_Ind_IndexDownRight<i_Ind_IndexUpLeft && i_Ind_IndexUpLeft<i_Ind_IndexDownLeft){
                                                // ------- Рисуем полный нижний и усечённый верхний -------
                                                TimeDownLeft=Time[i_Ind_IndexDownLeft];
                                                TimeDownRight=Time[i_Ind_IndexDownRight];
                                                PriceDownLeft=OBV_Buffer[i_Ind_IndexDownLeft];
                                                PriceDownRight=OBV_Buffer[i_Ind_IndexDownRight];
                                                LinesCrossInd=false; NumberPodokna=ChartWindowFind();
                                                // Формируем имя нижней линии
                                                Ind_NameLineDown=StringConcatenate("Ind_LineDown_",SMB,"_",TimeDownRight);
                                                if(ObjectFind(0,Ind_NameLineDown)<0){
                                                        CreateLine(Ind_NameLineDown,NumberPodokna,TimeDownLeft,PriceDownLeft,TimeDownRight,PriceDownRight,ArrUp_IndColor,true,false,LinesWidth);
                                                }
                                                // Формируем имя верхней линии
                                                TimeUpLeft=Time[i_Ind_IndexUpLeft];
                                                TimeUpRight=Time[i_Ind_IndexUpRight];
                                                PriceUpLeft=OBV_Buffer[i_Ind_IndexUpLeft];
                                                PriceUpRight=OBV_Buffer[i_Ind_IndexUpRight];
                                                Ind_NameLineUp=StringConcatenate("Ind_LineUp_",SMB,"_",TimeUpRight);
                                                if(ObjectFind(0,Ind_NameLineUp)<0){
                                                        CreateLine(Ind_NameLineUp,NumberPodokna,TimeUpLeft,PriceUpLeft,TimeUpRight,PriceUpRight,ArrDown_IndColor,true,false,LinesWidth);
                                                }
                                                // линии отрисованы на индикаторе, проверяем пересечение их в будущем
                                                LinesCrossInd=SostCross(Ind_NameLineUp,Ind_NameLineDown,i);
                                                if(LinesCrossInd){
                                                        // Выключаем у обоих линий луч
                                                        RayOffAll();// Выключаем луч у линий
                                                        // и включаем видимость у обоих линий
                                                        ObjectSetInteger(0,Ind_NameLineUp,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
                                                        ObjectSetInteger(0,Ind_NameLineDown,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
                                                        // --------- Рисуем вертикальную линию и стрелку
                                                        NameVerticalLine=StringConcatenate("IndDown_VLine_",SMB,"_",Time[i_Ind_IndexUpRight]);
                                                        CreateVLine(NameVerticalLine,0,Time[i_Ind_IndexUpRight],Close[i_Ind_IndexUpRight],ArrDown_IndColor);
                                                        NameArrow=StringConcatenate("Ind_DownArrow_",SMB,"_",Time[i]);
                                                        if(i<2){
                                                                if(ObjectFind(0,NameArrow)<0){
                                                                        CreateArrow(0,Open[i],NameArrow,DownArrowCode,ArrDown_IndColor);
                                                                        MessageSend("Sell_Ind");
                                                                        GlobalVariableSet(GlobalSellName,1);
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
                // ================ Бай-сигнал =========================================================
                if(DrawBuySignal && OBV_Buffer[i+1]<OBV_Buffer[i+2] && OBV_Buffer[i+2]>OBV_Buffer[i+3]){
                        i_Ind_IndexDownRight=i+1;
                        i_Ind_IndexDownLeft=LastVpadina(i_Ind_IndexDownRight);
                        i_Ind_IndexUpRight=i+2;
                        i_Ind_IndexUpLeft=LastPeak(i_Ind_IndexUpRight);
                        LinesCrossInd=false; NumberPodokna=ChartWindowFind();
                        if(i_Ind_IndexUpRight>0 && i_Ind_IndexUpLeft>0 && i_Ind_IndexDownRight>0 && i_Ind_IndexDownLeft>0){
                                LeftOtrezok=Rasst(OBV_Buffer[i_Ind_IndexUpLeft],OBV_Buffer[i_Ind_IndexDownLeft]);
                                RightOtrezok=Rasst(OBV_Buffer[i_Ind_IndexUpRight],OBV_Buffer[i_Ind_IndexDownRight]);
                                if(LeftOtrezok>0 && RightOtrezok>0 && LeftOtrezok>RightOtrezok){
                                        // --------- Если левая впадина между пиками ----------------------------------------
                                        if(i_Ind_IndexDownLeft>i_Ind_IndexUpRight && i_Ind_IndexDownLeft<i_Ind_IndexUpLeft){
                                                // ------- Рисуем полный верхний и усечённый нижний -------
                                                // Формируем имя верхней линии
                                                TimeUpLeft=Time[i_Ind_IndexUpLeft];
                                                TimeUpRight=Time[i_Ind_IndexUpRight];
                                                PriceUpLeft=OBV_Buffer[i_Ind_IndexUpLeft];
                                                PriceUpRight=OBV_Buffer[i_Ind_IndexUpRight];
                                                Ind_NameLineUp=StringConcatenate("Ind_LineUp_",SMB,"_",TimeUpRight);
                                                if(ObjectFind(0,Ind_NameLineUp)<0){
                                                        CreateLine(Ind_NameLineUp,NumberPodokna,TimeUpLeft,PriceUpLeft,TimeUpRight,PriceUpRight,ArrDown_IndColor,true,false,LinesWidth);
                                                }
                                                // Формируем имя нижней линии
                                                TimeDownLeft=Time[i_Ind_IndexDownLeft];
                                                TimeDownRight=Time[i_Ind_IndexDownRight];
                                                PriceDownLeft=OBV_Buffer[i_Ind_IndexDownLeft];
                                                PriceDownRight=OBV_Buffer[i_Ind_IndexDownRight];
                                                Ind_NameLineDown=StringConcatenate("Ind_LineDown_",SMB,"_",TimeDownRight);
                                                if(ObjectFind(0,Ind_NameLineDown)<0){
                                                        CreateLine(Ind_NameLineDown,NumberPodokna,TimeDownLeft,PriceDownLeft,TimeDownRight,PriceDownRight,ArrUp_IndColor,true,false,LinesWidth);
                                                }
                                                if(ObjectFind(0,Ind_NameLineUp)>(-1) && ObjectFind(0,Ind_NameLineDown)>(-1)){
                                                        // линии отрисованы на индикаторе, проверяем пересечение их в будущем
                                                        LinesCrossInd=SostCross(Ind_NameLineUp,Ind_NameLineDown,i);
                                                        if(LinesCrossInd){
                                                                // Выключаем у обоих линий луч
                                                                RayOffAll();// Выключаем луч у линий
                                                                // и включаем видимость у обоих линий
                                                                ObjectSetInteger(0,Ind_NameLineUp,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
                                                                ObjectSetInteger(0,Ind_NameLineDown,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
                                                                // --------- Рисуем вертикальную линию и стрелку
                                                                NameVerticalLine=StringConcatenate("IndUp_VLine_",SMB,"_",Time[i_Ind_IndexDownRight]);
                                                                CreateVLine(NameVerticalLine,0,Time[i_Ind_IndexDownRight],Close[i_Ind_IndexDownRight],ArrUp_IndColor);
                                                                NameArrow=StringConcatenate("Ind_DownArrow_",SMB,"_",Time[i]);
                                                                if(i<2){
                                                                        if(ObjectFind(0,NameArrow)<0){
                                                                                CreateArrow(0,Open[i],NameArrow,UpArrowCode,ArrUp_IndColor);
                                                                                MessageSend("Buy_Ind");
                                                                                GlobalVariableSet(GlobalBuyName,1);
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }

Окончания строк уехали за правую границу окна. Не удобно, абзац.

 
Vitaly Murlenko #:
Ну зачем грубить сарказмом? Вопрос-то актуален

это не грубость, а констатация факта - вставка кода через отдельное окошко(форму) это донельзя устаревший пережиток. 

И это на фоне существования ещё одной кнопки "код"

которая впрочем тоже работает мягко говоря загадочно..

Про такое надо постоянно напоминать, иначе веб-деятели то что есть считают вершиной дизайна и юзабилити

 
Как-нибудь программно можно вкл/выкл Автопрокрутку в ПКМ меню во вкладке экспертов?
 
Vitaly Murlenko #:

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

Окончания строк уехали за правую границу окна. Не удобно, абзац.

Да Виталий, это крайне неудобно. Но почему вы считаете, что нужно писать код непосредственно на странице форума во вкладке <код>?

Я, например всегда пишу только в МЕ и скопированный код вставляю сюда. В таком случае исключается пропуск грубых синтаксических ошибок и оформление как в редакторе МЕ.

 
Alexey Viktorov #:

Да Виталий, это крайне неудобно. Но почему вы считаете, что нужно писать код непосредственно на странице форума во вкладке <код>?

Я, например всегда пишу только в МЕ и скопированный код вставляю сюда. В таком случае исключается пропуск грубых синтаксических ошибок и оформление как в редакторе МЕ.

Я так не считаю. Но нередки ситуации, когда в код нужно вникнуть, а он на сайте. Приходится его копировать, вызывать редактор и вставлять туда. Потом ещё и табуляцию править. Лишние действия. Не удобно. А всего-то нужно - это изменить 1 цифру, размер табуляции поставить = 2 или 3. Но думаю, что ни кто этого делать не будет. Я уже более 15 лет прошу метаквотесов изменить окно алертов для МТ4. Там нужно всего-навсего сдвинуть мышью поле Memo чуть выше. Но воз и ныне там... Зато мы подключаем к новому терминалу библиотеки таких математических мощностей, которые нужны разьве что единицам пользователей. Такое ощущение, что сотрудники MQ сидят на сдельщине.
 
Vitaly Murlenko #:
Я так не считаю. Но нередки ситуации, когда в код нужно вникнуть, а он на сайте. Приходится его копировать, вызывать редактор и вставлять туда. Потом ещё и табуляцию править. Лишние действия. Не удобно. А всего-то нужно - это изменить 1 цифру, размер табуляции поставить = 2 или 3. Но думаю, что ни кто этого делать не будет. Я уже более 15 лет прошу метаквотесов изменить окно алертов для МТ4. Там нужно всего-навсего сдвинуть мышью поле Memo чуть выше. Но воз и ныне там... Зато мы подключаем к новому терминалу библиотеки таких математических мощностей, которые нужны разьве что единицам пользователей. Такое ощущение, что сотрудники MQ сидят на сдельщине.

А вы разве не пользуетесь форматированием кода?

В МЕ4 тоже такое есть.

 
fvdtrejder #:
Только не простым перебором iMA начиная от 144 до 1597 через 1 ,а с минимальным числом итераций.
Бинарный поиск позволит найти нужную МА за 10 итераций, при условии что чем больше период усреднения, тем МА дальше. Не проверял, что это так. 
ПС. Не подумал, не поможет всегда. Но частично поможет откинуть дальнюю часть, иногда) 
 
Aleksei Stepanenko #:
Бинарный поиск позволит найти нужную МА за 10 итераций, при условии что чем больше период усреднения, тем МА дальше. Не проверял, что это так. 
Это скорее всего не так. Просто иначе не было бы точек пересечения цены с МА большого периода. А раз они есть (их видно на большинстве графиков), то при большом периоде усреднения МА может оказываться очень близко от цены некоторого бара, который может оказаться как раз тем самым, который нам нужен. Так что бинарный поиск тут, похоже, не сможет быть полезным.
 
Да, обновил пост подумав.