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

 
sergeev:

нет


здесь проблема просто в цикле. перебор идет по i от 0 до 2. а надо от 2 до 0.



Покажите пример пожалуйста, я сделал
 for(i = OrdersTotal(); i > 0; i--)
Не помогло
 

sss2019:



Покажите пример пожалуйста, я сделал Не помогло


Сделал скрипт вот таким

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

В итоге Print выводит следующее

0 4

1 4

И все, почему то цикл не выводит

2 4

3 4

Добавил в цикл OrderSelect(i, SELECT_BY_POS, MODE_TRADES вместо I 0, то есть чтобы всегда выбирался первый ордер и скрипт заработал. Получается что когда цикл удалит два ордера, пытается выбрать третий ордер, когда в списке всего два ордера.

 
sss2019:


Сделал скрипт вот таким

В итоге...

Примеры
 
sss2019:

Покажите пример пожалуйста, я сделал

for(i = OrdersTotal(); i > 0; i--)

Не помогло


потому как думалку еще включать надо

for(i = OrdersTotal()-1; i >=0; i--)
 

Помогите решить еще вот эту дилему

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

Скрипт ищет максимальное расстояние между линиями. По результатам выводил все значения на всех барах, максимальным расстоянием получается когда на одном баре 1.6235, а на другом 1.6208.

Пытаюсь вывести Print(maxrange); выводит 0.086, вообще не пойму почему, я же делаю деление на Point

 
sss2019:

Помогите решить еще вот эту дилему

Скрипт ищет максимальное расстояние между линиями. По результатам выводил все значения на всех барах, максимальным расстоянием получается когда на одном баре 1.6235, а на другом 1.6208.

Пытаюсь вывести Print(maxrange); выводит 0.086, вообще не пойму почему, я же делаю деление на Point


Это не дилема. Дилема, это когда не знаешь, какое из двух решений лучше выбрать.

Ну во-первых, в функции iMA() не шесть, а семь параметров. Во-вторых, строкой int i Вы объявили переменную. А далее переменная i ни где не проинициализирована значением. В результате она либо ноль, либо содержит хлам ячеек оперативной памяти, оставшийся в ячейках от предыдущей деятельности. И в-третьих, цикл while организован не верно. Ну допустим, переменная i после инициализации равна нулю. Допустим так же, что и выражение Ma1 > Ma2 так же истинно. В результате строка while(Ma1 > Ma2) запустит цикл в работу. На очередной итерации цикла выяснится, что выражение (Ma1 > Ma2) перестало быть истинным и цикл прервётся. В переменных МА1 и МА2 будет не то расстояние, которое является максимальным - максимальное было когда-то. Это условие лишь покажет, что МА1 сейчас стало менее или равно МА2.

Далее, переменная maxrange у Вас инициализируется значением только в строке range = (Ma1 - Ma2)/Point; Ну а что если условие if(range > maxrange) ни когда не выполнится, ведь ни где ранее в коде Вы не инициализируете переменную maxrange значением? Получается, что Вы сравниваете между собой результат вычислений и хлам ячеек оперативной памяти. Вот Вам и непонятные принты в результате исполнения кода.

 
Так в том то и дело что я делал вывод всех значений МА в цикле, и все значения выводятся верно, то есть все значения МА за этот период были перебраны. Но подсчет почему то неверный вот в этом месте range = (Ma1 - Ma2)/Point;
if(range > maxrange) maxrange = range;
 
sss2019:
Так в том то и дело что я делал вывод всех значений МА в цикле, и все значения выводятся верно, то есть все значения МА за этот период были перебраны. Но подсчет почему то неверный вот в этом месте range = (Ma1 - Ma2)/Point;
if(range > maxrange) maxrange = range;

*Point

range = (Ma1 - Ma2)*Point





 
pako:

*Point

range = (Ma1 - Ma2)*Point

МА1 = 0,6526, МА2 = 0,6516. MA1-MA2 = 0.6526-0.6516 = 0.0010. Point = 0.0001. Если умножить, то будет биллиберда. 0,0010 * 0,0001 = 0,0000001
 
sss2019:
Так в том то и дело что я делал вывод всех значений МА в цикле, и все значения выводятся верно, то есть все значения МА за этот период были перебраны. Но подсчет почему то неверный вот в этом месте range = (Ma1 - Ma2)/Point;
if(range > maxrange) maxrange = range;

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