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

 
artmedia70:

Это всё правильно: мусор за собой подчищать - правило хорошего тона...

Только в данном контексте как определить, что вот сейчас "мусор" подчистить нужно или наоборот: это не мусор - это нужные данные для дальнейших расчётов.

Как я понимаю, выполнять за собой уборку нужно в deinit(), но... он исполняется не только при удалении графика торгового инструмента, снятии с него советника, но и при смене рабочего ТФ. В данном случае все накопленные данные для ТФ будут утеряны и при возврате на прежний таймфрейм, советник начнёт работу заново с нулевым массивом. То же произойдёт и при изменении любого из параметров советника.

Получается, что в некоторых ситуациях "уборка мусора" - сложный логический процесс, а не простое изменение размера массива.


Ну это не сложно. В цикле проинициализировали массив значениями. Затем поработали с полученным массивом. Когда работа закончена, делаем его длиною в ноль. Если сомневаетесь, то это можно сделать в конце кода перед самым return(0).
 

Подскажите, пожалуйста, ниже код для чтения лог-файла. Автоматически читается текущий по дате лог-файл и выводится в принт.

Там, где:

while (result>0) {

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

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      //MessageBox(msg,title,MB_OK|MB_ICONERROR);
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   //MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 
drknn:

Ну это не сложно. В цикле проинициализировали массив значениями. Затем поработали с полученным массивом. Когда работа закончена, делаем его длиною в ноль. Если сомневаетесь, то это можно сделать в конце кода перед самым return(0).

Меня не поняли.

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

Как определить, что работа закончена, а не просто человек, например, сменил таймфрейм? Да хоть случайно... При этом будет вызвана deinit() и все данные будут утеряны. Советник их начнёт накапливать (записывать в динамический массив) по-новой, исходя из значений, получаемых на новом ТФ (новый цикл).

Я об этом.

 
artmedia70:

Меня не поняли.

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

Как определить, что работа закончена, а не просто человек, например, сменил таймфрейм? Да хоть случайно... При этом будет вызвана deinit() и все данные будут утеряны. Советник их начнёт накапливать (записывать в динамический массив) по-новой, исходя из значений, получаемых на новом ТФ (новый цикл).

Я об этом.

Если вдаваться в детали, то можно использовать эту функцию. Она сообщит по какой причине деинициализация.
 

Заметил одну особенность терминала. Расчет профита ордера не учитывает OrderSwap().


Т.е., чтобы закрыть ордер с профитом, надо использовать такую формулу:

(OrderProfit()+OrderSwap()+OrderCommission())>0

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

Мои расчеты верны?

 
Zhunko:
Если вдаваться в детали, то можно использовать эту функцию. Она сообщит по какой причине деинициализация.

Совершенно верно... :)

Забыл о ней. Теперь, с моей привычкой использовать "защиту от дурака", бум юзать...

 
artmedia70:

ObjectGetValueByShift() вам в помощь

А уж как вы там с ней работать собираетесь - только вам и известно...


Спасибо, добрый человек!
 
Два вопроса.

1. Как записать/ввести в массив double abc[10] первую и последующие переменные double ab=a*b?
2. Как записать в массив одиннадцатую переменную, удалив первую?

Порядок записи переменных в маccиве (прямой или обратный) значения не имеет. Переменные в массиве нужны для определения средней арифметической.
 
Народ подскажите можно ли изменить лот у отложенного ордера?
 
Parn25:
Народ подскажите можно ли изменить лот у отложенного ордера?


нет, нельзя

всё что можно изменить расписано здесь https://docs.mql4.com/ru/trading/OrderModify

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