Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 202

 
Yurij Kozhevnikov:

=

Кажется, так, если я правильно понял принцип подстановки.

Лишние точки с запятой после фигурных скобок. И непонятно, к чему теперь относится else.

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

Спасибо! Не зря после while в макросе нет точки с запятой.

Макросы штука хорошая, но грань между добром и злом, в их случае, еще тоньше, чем с женщиной))) Очень и очень аккуратно с ними надо. И да, в моем примере, не ';', а именно else, который стал относиться к if, который в макросе, после того как уберешь ;.

Я макросы очень хорошо умею, поэтому для случая, как у тебя, уже года 1,5 как зарекся их использовать, оптимальней:

 

inline bool CheckRead(){
   ...
}

if (!CheckRead()) return;
 

Вот только про inline я здесь толком ничего не нашёл.

А C++ я не знаю.

 

Добрый день! Прошу помоши!

Есть довольно простой код открытия и модификации ордера. Функции OrderSend, OrderSelect и OrderModify вложил в цикл с небольшой задержкой между попытками. Чтобы минимизировать ошибки связи и проч.

Происходит следующая непонятка: ордер нормально открывается, затем происходит успешная модификация StopLoss, успешная модификация TakeProfit. Но при установке TP, StopLoss обнуляется. Не могу понять причину.

Вот эта часть кода:

     send = 5; //максимальное количество попыток установки ордера

             tick=0;

             sendschet=0; //Счетчик попыток

             while(!tick && sendschet<=send)

                  {

                    tick=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Bid,150,0.0,0.0,komm,MagNum,0,Yellow);

                    sendschet++;

                    Sleep(1000); //Задержка в 1 секунду перед следующей попыткой

                  }

                   

                  

              

                   select = 5; //максимальное количество попыток выбора ордера

                   slschet=0; //Счетчик попыток выбора ордера

                while(!OrderSelect(tick,SELECT_BY_TICKET) && slschet<=select)

                     {

                      slschet++;

                      Sleep(500); //Задержка в 0,5 секунды перед следующей попыткой

                     }

                if(slschet<select)     //попыток было меньше, чем максимум, значит выбор ордера прошел успешно

                  {

                  

                 modify = 5;//максимальное количество попыток модификации ордера

                 mdschet=0;

                         while(!OrderModify(tick,OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Yellow) 

                                && mdschet<=modify)

                              {

                               mdschet++;

                               Sleep(500); //Задержка в 0,5 секунды перед следующей попыткой

                              }

                              

                 *Здесь все отлично - SL установлен             

                              

                 mdschet=0; //Обнуляем счетчик перед изменением TP

                         while(!OrderModify(tick,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TP,Digits),0,Yellow)

                                && mdschet<=modify)

                              {

                               mdschet++;

                               Sleep(500);

                              }

          }                    

                  *Здесь TP ставится нормально, но SL уже равен 0,0.  То есть получается, что  OrderStopLoss() равен 0,0.

                  Хотя выбор ордера не менялся. 

                  Если между установкой SL и TP добавить еще раз OrderSelect, то вроде все работает. Но противоречит логике.

 

Заранее спасибо за помощь в вопросе.

 

Добрый день!

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

Допустим, задаю массив:

int DB[][8];

Далее в первой подпрограмме в цикле, возможно несколько раз (в этом вопросов нет -- пока работает, как задумывалось):

ushort i = 0;
ArrayResize(DB,i+1);

В следующей подпрограмме буду в цикле добавлять элементы в первом измерении. Заранее неизвестно сколько. Знаю, что это медленнее, чем если заранее объявлять размерность. Но думаю, что до 500 добавлений в год погоды не сделают.

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

Брать ArraySize() и делить на 8? Или есть какая-то более подходящая функция?

Спасибо заранее!

 
Oleg_Ko:

Добрый день!

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

Допустим, задаю массив:

Далее в первой подпрограмме в цикле, возможно несколько раз (в этом вопросов нет -- пока работает, как задумывалось):

В следующей подпрограмме буду в цикле добавлять элементы в первом измерении. Заранее неизвестно сколько. Знаю, что это медленнее, чем если заранее объявлять размерность. Но думаю, что до 500 добавлений в год погоды не сделают.

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

Брать ArraySize() и делить на 8? Или есть какая-то более подходящая функция?

Спасибо заранее!

ArrayRange()

Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

ArrayRange()

Артем, благодарю.
 

Доброго времени суток.

Очень давно не торговал на МТ4, решил снова попробовать. Ранее использовал скрипт (во вложении), но теперь он не запускается, посмотрите пожалуйста, что стало не так.

Файлы:
RiskAdvisor.mq4  12 kb
 
Nauris Zukas:

Здравствуйте!
Есть ли способ сразу узнать CopyHigh количество элементов массива в любом периоде времени?

Сам себе и отвечу, может кто-то через поисковик наткнётся на вопрос.

SeriesInfoInteger(symbol_name,timeframe,SERIES_BARS_COUNT);
 
Nauris Zukas:

Сам себе и отвечу, может кто-то через поисковик наткнётся на вопрос.

Ещё Bars(), iBars()
 
Artyom Trishkin:
Ещё Bars(), iBars()

С Bars() нельзя узнать количество элементов массива в любом периоде времени, а только на текущем графике.

Причина обращения: