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

 
Andrei Sokolov #:

Привет подскажите, пожалста. 

Сначала я сделал первую версию индикатора, который перекрашивает некоторые свечки.

Потом из первой версии сделал вторую, куда добавил линию. Но при этом частично пропадает перекраска свечей. Иногда почти все перекрашенные свечи отображаются и пропадают после смены цвета линии, иногда сразу почти все перекрашенные не отображаются.

Но в буферах, при этом значения все значения корректны.


Подскажите, подскажите, пожалста, как сделать чтоб все корректно отображалось?

   PlotIndexSetInteger(1, PLOT_LINE_COLOR, 0, color_IB);
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, 1, color_IB);
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, 2, color_IB);
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, 3, color_IB);

и вот это лучше сделать так

   if(prev_calculated <= 0)
     {
      limit = rates_total - 1;
      ArrayInitialize(buf_open, 0);
      ArrayInitialize(buf_high, 0);
      ArrayInitialize(buf_low, 0);
      ArrayInitialize(buf_close, 0);
      ArrayInitialize(line_buf, 0);
     }
 
Aleksandr Slavskii #:

и вот это лучше сделать так

сделал, ничего не изменилось.

 
Andrei Sokolov #:

сделал, ничего не изменилось.

Ну у меня норм рисует и в терминале и в тестере. Правда в терминалу вылезли две ошибки

array out of range in 'LIT_02_01.mq5' (160,76)
array out of range in 'LIT_02_01.mq5' (135,72)

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

Добавил проверку iBarShift чтоб не был меньше нуля.


ЗЫ. нужно везде проверять  iBarShift , сейчас при переключении таймфреймов, выход за пределы массива в строке 145

Файлы:
LIT_02_01.mq5  15 kb
 

Всем доброго времени суток! Вопрос по тестеру МТ4
При наступлении нужного события мой код(самый нижний) на одном тике открывает 72 ордера. В параметр Comment каждого ордера я хочу поместить порядковые номера итераций от 1 до 72. Они лежат в переменной w. Переменная w имеет целочисленный тип, а в параметр  Comment нужно помещать строку. Для этого я при помощи IntegerToString(w,1) преобразовываю на каждой итерации  число из переменной w в строку и сохраняю в к1. И потом число в виде строки вставляю в параметр  Comment в расчете на то что в  Comment каждого ордера будет отображен номер итерации.
Но при закрытии ордеров OrderComment() каждого ордера почему то показывает не номер итерации , а  k1[tp] . То есть, получается что в параметр  Comment  каждого ордера почему то не сохраняются номера итераций 

При этом после открытия каждого ордера Print() выводит значение к1 как и задумывалось мною от 1 до 72. 

Подскажите пожалуйста как мне получить то что я хочу.
Всем спасибо за помощь.

if(OrderSelect(n1-b, SELECT_BY_POS, MODE_HISTORY)==true)
{
k2=OrderComment();
}
//Print() выводит :  ЗАКР.ПО ТП----------  k2  k1[tp]
for(int w=1,c1=2, stp=160; w<=72; w++,c1+=1)                                                                                                                                                                                                                                                                                    
{
k1=IntegerToString(w,1);
TkT=OrderSend(Symbol(),OP_BUY,0.1,Ask, 3,Bid-(stp*Point),Bid+Mms[w-1][0],"k1",Tk1);
Print("---------------------------------------------------ОРДЕР---------  k1   ",(от 1 до 72));
if (w%4==0)stp+=20;
if (c1==5)c1=1;
//}
}                                                                                                                                                                                                                                                                                       
}
 
ANDREY #:
TkT=OrderSend(Symbol(),OP_BUY,0.1,Ask, 3,Bid-(stp*Point),Bid+Mms[w-1][0],"k1",Tk1);

Зачем тут ковычки?

 
Tretyakov Rostyslav #:

Зачем тут ковычки?

Так дается в Справочнике. Как я понял, этот параметр заковычен поскольку в нем лежит переменная типа стринг.
Да и функция  string  OrderComment(); возвращает именно   string.
Хотя к моему удивлению, я убрал кавычки из этого параметра в функции открытия ордера ... и компилятор не вывел никой ни  ошибки ,ни предупреждения...

После того как убрал кавычки при закрытии ордера  OrderComment() начала выводит номера итераций , как я и хотел. Но почему то к каждому номеру добавляется  [tp] То есть 1 [tp] 2 [tp] 3 [tp] 4 [tp]...  [tp] я не заказывал... как от нее избавиться?

 

Приветствую. Подскажите, пожалста.

Чем отличается ArrayInitialize от ArrayFill ?

Чем отличается инициализация массива указанным значением от заполнения массива указанным значением, кроме того что заполнить можно не весь ?

 
ANDREY #:
TkT=OrderSend(Symbol(),OP_BUY,0.1,Ask, 3,Bid-(stp*Point),Bid+Mms[w-1][0],"k1",Tk1);
TkT=OrderSend(Symbol(),OP_BUY,0.1,Ask, 3,Bid-(stp*Point),Bid+Mms[w-1][0],w,Tk1); 
 
Tretyakov Rostyslav #:

Спасибо
Сделал как Вы сказали, но результат тот же 
ОТКРЫВАЮ ОРДЕР

if (Bid-mx1>0.0001&&mx1>0)//                                                                                                               
з                                                                                                                                                             
{
mx1=2000;Tk1++;                 
//===============================================================                                                                                                                                                                                                                                                                                       
for(int w=1,c1=2, stp=160; w<=72; w++,c1+=1)                                                                                                                                                                                                                                                                                    
{
k1=IntegerToString(w,1);
TkT=OrderSend(Symbol(),OP_BUY,0.1,Ask, 3,Bid-(stp*Point),Bid+Mms[w-1][0],k1,Tk1);
}                                                                                                                                                                                                                                                                                       
}
ЗАКРЫВАЮ ОРДЕР
if(OrderSelect(n1-b, SELECT_BY_POS, MODE_HISTORY)==true)
{
k2=OrderComment();
Print("-------------к2------------  ",к2);
}

Print() выводит значение поля Coment (к2)

 --k2---------  k2  1[tp]  
 
ANDREY #:

Спасибо
Сделал как Вы сказали, но результат тот же 
ОТКРЫВАЮ ОРДЕР

ЗАКРЫВАЮ ОРДЕР

Print() выводит значение поля Coment (к2)

1) называйте переменные читаемо и разумно. 2-3 случайные буквы это не имя..даже не кличка :-) 

2) ВСЕГДА проверяйте результат OrderSend , OrderClose, OrderDelete (и так далее - все операции с ордерами)

3) когда печатаете что-то про ордера - печатайте заодно тикет. 

---

разбирать код который как будто натошнило мало кто будет. 

скорее всего или ордер не отрывается или при чтении вы берёте иной (старый). тем более что читаете из истории - просто промахнулись